O sgcWebSockets pode funcionar sem nenhuma biblioteca OpenSSL. Duas configurações independentes tornam isso possível, e ambas são construídas sobre as units em Object Pascal puro do sgcCrypto, disponíveis a partir da edição Standard.
iohNativeTLS é um valor de IOHandler. Ele substitui o OpenSSL nas conexões de um componente: TLS, QUIC e DTLS. Veja TLS nativo.
sgcCryptoBackend é uma opção em tempo de execução. Ela seleciona o backend da criptografia da aplicação, tudo que não é uma conexão: hashes, assinaturas, acordo de chaves e manipulação de certificados.
Uma aplicação que não precisa do OpenSSL nem para as conexões nem para a demais criptografia usa as duas.
A unit sgcBase_Helpers declara a variável global sgcCryptoBackend, do tipo TsgcCryptoBackend:
cbOpenSSL (padrão): a criptografia da aplicação roda sobre o OpenSSL, como nas versões anteriores.
cbNative: ela roda sobre o sgcCrypto e o OpenSSL nunca é carregado para isso.
cbAuto: o OpenSSL é usado quando pode ser carregado, e o sgcCrypto quando não pode. A verificação roda uma vez e o resultado fica em cache.
A opção é global, não por componente. Defina-a uma única vez no início da aplicação, antes de criar qualquer componente. sgcUseNativeCrypto retorna True quando o backend nativo está em uso. O backend nativo precisa das units do sgcCrypto compiladas (SGC_CRYPTO). Sem elas, cbNative gera a exceção "Native crypto not available, sgcCrypto units are not compiled in". Chame sgcCheckNativeCrypto para obter esse erro já no início da aplicação, em vez de no primeiro uso.
uses
sgcBase_Helpers;
begin
sgcCryptoBackend := cbNative;
sgcCheckNativeCrypto;
Application.Initialize;
...
Estas partes seguem a opção:
| Área | O que roda nativamente |
| Funções de hash e HMAC | As funções de hash e HMAC de sgcBase_Helpers, e sgcEncryptString / sgcDecryptString. |
| Assinaturas JWT, JWS | Assinatura e verificação HMAC, RSA, RSA-PSS, ECDSA e EdDSA (sgcSSL_RSA, sgcSSL_PS, sgcSSL_ES, sgcSSL_ED). sgcES_GetCurveFromPublicKey só funciona com uma chave OpenSSL e gera exceção no backend nativo. |
| Certificados | Os auxiliares do sgcSSL: conversão PEM e DER, carregamento de certificados, URI de CRL e verificação da cadeia de certificados. |
| OAuth2 e DPoP | O auxiliar de JWK do OAuth2, e a verificação de prova DPoP do servidor OAuth2 (ES256, ES384, ES512, RS256, RS384, RS512). Veja DPoP. |
| Amazon | AWS Signature V4, a URL assinada do CloudFront, e a autenticação Signature V4 do cliente MQTT Amazon IoT, cujas SignatureV4.OpenSSL_Options passam a ser ignoradas. |
| Web Push | O token VAPID ES256, o acordo de chaves ECDH, o HKDF e a criptografia de payload AES-128-GCM. Apenas uma conexão https ao serviço de push carrega uma biblioteca TLS, por meio do seu IOHandler. |
| E2EE | Acordo de chaves, AES-GCM e o gerador aleatório. As chaves públicas trafegam como PEM nos dois backends; chaves brutas continuam aceitas, de modo que pares com backends diferentes interoperam. |
| WebAuthn, SAML, OIDC | As verificações de certificado, chave COSE e atestado do WebAuthn, e a verificação de assinatura XMLDSig usada por SAML e OIDC. |
| NTLM | O código MD4 e DES da autenticação NTLM. Ele é nativo em toda build e não precisa mais de nenhuma definição. |
| AEAD, KEM, HKDF | sgcSSL_AEAD (AES-128-GCM, AES-256-GCM, ChaCha20-Poly1305), sgcSSL_KEM (ML-KEM-768 e ECDH P-256) e sgcSSL_HKDF (agora também com sgcHKDF_MD_SHA384). O ML-KEM-768 não precisa do OpenSSL 3.5, e as chaves usam as mesmas codificações do OpenSSL 3.5. Em uma build FIPS o ChaCha20-Poly1305 não está disponível e gera exceção. |
| QUIC, DTLS, SRTP | A proteção de pacotes do QUIC, o certificado DTLS e o SRTP. Com iohNativeTLS eles já são nativos por conexão, seja qual for o valor da opção. |
O sgcCryptoBackend não altera a conexão TLS de um componente. Um componente que mantém IOHandler = iohOpenSSL continua carregando o OpenSSL ao se conectar.
A definição vem desativada por padrão e não é mais necessária para rodar sem OpenSSL. Sem ela, tanto o código OpenSSL quanto o nativo são compilados, e o sgcCryptoBackend decide em tempo de execução. Com ela, o backend nativo é forçado, seja qual for o valor de sgcCryptoBackend, e o código OpenSSL é removido das units de criptografia da aplicação, o que deixa o executável menor. Para habilitá-la, abra sgcVer.inc e remova o ponto da linha
{.$DEFINE SGC_NATIVE_CRYPTO}
ou adicione SGC_NATIVE_CRYPTO aos defines condicionais do seu projeto. SGC_NATIVE_CRYPTO também ativa SGC_CRYPTO, as units do sgcCrypto que ele precisa. DISABLE_SGC_NATIVE_CRYPTO o desativa novamente.
As configurações necessárias dependem do que a aplicação utiliza:
| Área | Configuração para não usar OpenSSL |
| TLS sobre TCP: WebSocket, HTTP/1, HTTP/2, TCP, MQTT e os demais protocolos | TLSOptions.IOHandler (cliente) ou SSLOptions.IOHandler (servidor) = iohNativeTLS. Veja TLS nativo. |
| QUIC e HTTP/3 | IOHandler = iohNativeTLS. O handshake, a proteção de pacotes, a atualização de chaves e o tag do Retry são todos nativos. Veja QUIC e HTTP/3. |
| DTLS e WebRTC | DTLSOptions.IOHandler = iohNativeTLS. O handshake, o certificado DTLS e as chaves SRTP são nativos. Veja DTLSOptions e WebRTC DTLS. |
| Criptografia da aplicação: JWT, OAuth2, Web Push, Amazon Signature V4, E2EE, WebAuthn, SAML e as demais áreas da primeira tabela | sgcCryptoBackend := cbNative no início da aplicação, ou a definição SGC_NATIVE_CRYPTO. |
As linhas com iohNativeTLS não precisam de nenhuma definição nem de nenhuma configuração de sgcCryptoBackend. Selecionar iohNativeTLS em uma build sem as units do sgcCrypto gera uma exceção, nunca recorre silenciosamente ao OpenSSL.
Com iohNativeTLS, o handshake TLS 1.3 e TLS 1.2 e a camada de registros passam a rodar sobre o mecanismo nativo. Funciona para os clientes e servidores WebSocket, HTTP/1, HTTP/2 e TCP, e para tudo o que é construído sobre eles: MQTT, AMQP, STOMP e os demais protocolos, os componentes de API, os clientes IoT (Certificate.IOHandler), a conexão upstream do servidor proxy (Proxy.TLSOptions) e o cliente LDAP. O certificado pode ser PEM, DER ou um arquivo .pfx / .p12.