TsgcWebSocketHTTPServer › Metodi › ReloadCertificates
Installa un certificato TLS rinnovato senza arrestare il server; i nuovi handshake TLS lo utilizzano e le connessioni aperte mantengono il vecchio certificato fino alla loro chiusura.
procedure ReloadCertificates;
Chiami ReloadCertificates dopo il rinnovo di un certificato (ad esempio un rinnovo ACME o Let's Encrypt) per installare il nuovo certificato senza riavvio. I nuovi handshake TLS utilizzano il nuovo certificato, mentre le connessioni già aperte continuano a funzionare con il vecchio fino alla loro chiusura. Sovrascriva sul posto i file del certificato e della chiave, oppure assegni nuovi valori a SSLOptions.CertFile, KeyFile, RootCertFile e Password, quindi chiami ReloadCertificates. Può essere chiamato da qualsiasi thread mentre il server è attivo. Se il server non è attivo, o SSL è disabilitato, la chiamata non fa nulla. Il nuovo certificato e la chiave privata vengono caricati e verificati prima di modificare qualsiasi cosa (la chiave deve corrispondere al certificato). Se la verifica fallisce viene sollevata un'eccezione e il server continua a servire il certificato precedente. Viene ricaricato solo il certificato: le altre SSLOptions (elenco dei cifrari, versioni TLS e così via) e le modifiche apportate in OnSSLAfterCreateHandler mantengono i valori in esecuzione, quindi per modificarli è ancora necessario un riavvio. I back end TLS supportati sono OpenSSL (thread per connessione, IOCP su Windows ed EPOLL su Linux), SChannel e il TLS nativo di sgc (thread e IOCP/EPOLL). Un TLS Provider personalizzato collegato ai motori IOCP/EPOLL ricarica tramite il proprio DoCreateTLSContext. Con Indy standard (non il fork Indy di sgc) il gestore OpenSSL classico non può ricaricare e ReloadCertificates solleva un'eccezione "not supported". Con il TLS nativo, i ticket di sessione TLS emessi prima del ricaricamento non vengono ripresi dopo di esso, quindi i client eseguono semplicemente un handshake completo. Vedere Connessioni sicure.
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;