Executar sem OpenSSL

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.

Uma aplicação que não precisa do OpenSSL nem para as conexões nem para a demais criptografia usa as duas.

1. Opção em tempo de execução: sgcCryptoBackend

A unit sgcBase_Helpers declara a variável global sgcCryptoBackend, do tipo TsgcCryptoBackend:

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.

2. Definição opcional: SGC_NATIVE_CRYPTO

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.

3. Zero OpenSSL em tempo de execução

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.

iohNativeTLS

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.