TsgcWebSocketHTTPServer › Métodos › ReloadCertificates
Instala um certificado TLS renovado sem parar o servidor; os novos handshakes TLS o utilizam e as conexões abertas mantêm o antigo até serem fechadas.
procedure ReloadCertificates;
Chame ReloadCertificates após a renovação de um certificado (por exemplo, uma renovação ACME ou Let's Encrypt) para instalar o novo certificado sem reiniciar. Os novos handshakes TLS usam o novo certificado, e as conexões que já estão abertas continuam funcionando com o antigo até serem fechadas. Sobrescreva os arquivos de certificado e de chave no próprio local, ou atribua novos valores a SSLOptions.CertFile, KeyFile, RootCertFile e Password e, em seguida, chame ReloadCertificates. Ele pode ser chamado a partir de qualquer thread enquanto o servidor estiver ativo. Se o servidor não estiver ativo, ou se o SSL estiver desabilitado, a chamada não faz nada. O novo certificado e a chave privada são carregados e verificados antes de qualquer alteração (a chave deve corresponder ao certificado). Se a verificação falhar, uma exceção é gerada e o servidor continua servindo o certificado anterior. Somente o certificado é recarregado: as demais SSLOptions (lista de cifras, versões do TLS e assim por diante) e as alterações feitas em OnSSLAfterCreateHandler mantêm seus valores em execução, portanto alterá-las ainda exige uma reinicialização. Os back ends TLS suportados são OpenSSL (uma thread por conexão, IOCP no Windows e EPOLL no Linux), SChannel e o TLS nativo do sgc (thread e IOCP/EPOLL). Um TLS Provider personalizado conectado aos motores IOCP/EPOLL recarrega por meio de seu DoCreateTLSContext. Com o Indy original (e não o fork Indy do sgc), o handler OpenSSL clássico não consegue recarregar, e ReloadCertificates gera uma exceção "not supported". Com o TLS nativo, os tickets de sessão TLS emitidos antes do recarregamento não são retomados depois dele, de modo que os clientes simplesmente fazem um handshake completo. Consulte Conexões Seguras.
procedure TForm1.RenewCertificate;
begin
try
oServer.SSLOptions.CertFile := 'C:\certs\renewed\fullchain.pem';
oServer.SSLOptions.KeyFile := 'C:\certs\renewed\privkey.pem';
oServer.ReloadCertificates;
except
on E: Exception do
ShowMessage('Certificate reload failed: ' + E.Message);
end;
end;