TsgcWebSocketProxyServer › Propriedades › SSLOptions
Mantém os caminhos de certificado, a seleção de versão TLS e o ajuste do OpenSSL para o listener TLS downstream.
property SSLOptions: TsgcWSSSL_Options read FSSLOptions write SetSSLOptions;
Version=tlsUndefined, VerifyCertificate=False
Forneça o material de certificado antes de ativar o proxy quando SSL for True: RootCertFile, CertFile e KeyFile apontam para arquivos PEM (utilize o mesmo caminho para os três quando o arquivo contém a cadeia completa), e Password é necessário apenas se a chave privada estiver criptografada. Defina VerifyCertificate como True para requisitar e validar certificados de cliente (as subopções FailIfNoCertificate e VerifyClientOnce refinam a verificação) com VerifyDepth controlando o comprimento da cadeia. Version escolhe uma versão TLS específica (tls1_0, tls1_1, tls1_2, tls1_3) ou deixa a negociação aberta (tlsUndefined). Com iohNativeTLS, é a versão mínima permitida; veja abaixo. OpenSSL_Options expõe ajustes de baixo nível: APIVersion (oslAPI_1_0/oslAPI_1_1/oslAPI_3_0), LibPath/LibPathCustom para localizar os binários do OpenSSL, UnixSymLinks, ECDHE, CipherList, CurveList, VersionMin e X509Checks para validação de hostname/IP. Essas configurações aplicam-se apenas à perna downstream; a perna TLS upstream é habilitada por meio de Proxy.TLS.
IOHandler seleciona o mecanismo TLS. iohOpenSSL é o padrão e iohSChannel usa o provedor do Windows. iohNativeTLS seleciona o mecanismo TLS em Object Pascal puro do pacote sgcCrypto, que fala TLS 1.3 e TLS 1.2: nenhuma biblioteca OpenSSL é carregada, e no TLS 1.3 os grupos híbridos de troca de chaves pós-quântica da RFC 10024 são oferecidos com X25519MLKEM768 em primeiro lugar. Suas duas listas de preferência são NativeTLS_Options.Groups e NativeTLS_Options.CipherSuites, separadas por dois-pontos no estilo do OpenSSL, e uma lista vazia mantém os padrões do mecanismo. O mecanismo funciona igualmente no modelo clássico de uma thread por conexão e nos mecanismos IOCP e EPOLL. iohAppleTLS e iohAndroidTLS são handlers somente de cliente: um servidor com um deles gera uma exceção quando Active é definido como True, a menos que OnSSLGetHandler forneça seu próprio handler. Use iohNativeTLS, iohOpenSSL ou, no Windows, iohSChannel.
Para o mecanismo nativo, Version é a versão mínima permitida, não uma versão exata como ocorre com iohOpenSSL. tlsUndefined (o padrão) e tls1_2 aceitam TLS 1.3 e TLS 1.2, tls1_3 aceita apenas TLS 1.3, e tls1_0 ou tls1_1 geram um erro de configuração quando o servidor inicia, porque o mecanismo aceita apenas TLS 1.2 e TLS 1.3. Para aceitar apenas TLS 1.2, informe somente conjuntos de cifras TLS 1.2, como TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, em NativeTLS_Options.CipherSuites. O mecanismo valida os certificados de cliente em relação às raízes de RootCertFile, além das raízes em que o sistema operacional confia quando NativeTLS_Options.UseSystemRoots é True (False por padrão). Com iohNativeTLS, CertFile também pode ser um arquivo .pfx ou .p12 contendo o certificado, a cadeia e a chave, aberto com Password. O mecanismo retoma sessões com tíquetes de sessão de TLS 1.3 e TLS 1.2: NativeTLS_Options.SessionTickets (True por padrão) os ativa, e NativeTLS_Options.TicketLifetime (7200 segundos por padrão) define por quanto tempo um tíquete pode ser usado. A retomada em TLS 1.2 exige que o cliente suporte o extended master secret. Ele não aceita 0-RTT e não dispara OnSSLVerifyPeer, que pertence ao handler do OpenSSL. VerifyCertificate pede um certificado ao cliente e o valida, VerifyCertificate_Options.FailIfNoCertificate recusa um cliente que não envia nenhum, e VerifyClientOnce não tem efeito porque o mecanismo nunca renegocia. Consulte TLS Nativo.
oProxy := TsgcWebSocketProxyServer.Create(nil);
oProxy.SSL := true;
oProxy.SSLOptions.CertFile := 'c:\certificates\mycert.pem';
oProxy.SSLOptions.KeyFile := 'c:\certificates\mycert.pem';
oProxy.SSLOptions.RootCertFile := 'c:\certificates\mycert.pem';
oProxy.SSLOptions.Version := tls1_3;
oProxy.SSLOptions.OpenSSL_Options.VersionMin := tls1_2;
oProxy.SSLOptions.Port := 443;
oProxy.Proxy.Host := 'upstream.example.com';
oProxy.Proxy.Port := 8080;
oProxy.Active := true;