OpenSSL 없이 실행하기

sgcWebSockets는 OpenSSL 라이브러리가 전혀 없어도 실행할 수 있습니다. 이를 가능하게 하는 독립적인 두 가지 설정이 있으며, 둘 다 순수 Pascal로 작성된 sgcCrypto 유닛을 기반으로 하고, 이 유닛은 Standard 에디션부터 제공됩니다.

연결에도 다른 암호화 작업에도 OpenSSL이 필요 없는 애플리케이션은 두 가지를 모두 사용합니다.

1. 런타임 스위치: sgcCryptoBackend

유닛 sgcBase_Helpers는 TsgcCryptoBackend 타입의 전역 변수 sgcCryptoBackend를 선언합니다:

이 스위치는 컴포넌트별이 아니라 전역입니다. 컴포넌트를 생성하기 전, 시작 시 한 번만 설정하십시오. sgcUseNativeCrypto는 네이티브 백엔드가 사용 중일 때 True를 반환합니다. 네이티브 백엔드는 sgcCrypto 유닛이 컴파일되어 있어야 합니다(SGC_CRYPTO). 이 유닛이 없으면 cbNative는 "Native crypto not available, sgcCrypto units are not compiled in" 예외를 발생시킵니다. 이 오류를 최초 사용 시점이 아니라 시작 시점에 받으려면 sgcCheckNativeCrypto를 호출하십시오.

uses
  sgcBase_Helpers;

begin
  sgcCryptoBackend := cbNative;
  sgcCheckNativeCrypto;
  Application.Initialize;
  ...

다음 부분들은 이 스위치를 따릅니다:

영역 네이티브로 실행되는 것
해시 및 HMAC 헬퍼 sgcBase_Helpers의 해시 및 HMAC 함수, sgcEncryptString / sgcDecryptString.
JWT, JWS 서명 HMAC, RSA, RSA-PSS, ECDSA 및 EdDSA 서명 및 검증(sgcSSL_RSA, sgcSSL_PS, sgcSSL_ES, sgcSSL_ED). sgcES_GetCurveFromPublicKey는 OpenSSL 키에서만 동작하며 네이티브 백엔드에서는 예외를 발생시킵니다.
인증서 sgcSSL 헬퍼: PEM과 DER 변환, 인증서 로드, CRL URI, 인증서 체인 검증.
OAuth2와 DPoP OAuth2 JWK 헬퍼, 그리고 OAuth2 서버의 DPoP 프루프 검사(ES256, ES384, ES512, RS256, RS384, RS512). DPoP를 참조하십시오.
Amazon AWS Signature V4, CloudFront 서명 URL, Amazon IoT MQTT 클라이언트의 Signature V4 인증. 이 경우 SignatureV4.OpenSSL_Options는 무시됩니다.
Web Push VAPID ES256 토큰, ECDH 키 교환, HKDF, AES-128-GCM 페이로드 암호화입니다. 푸시 서비스로의 https 연결만이 자체 IOHandler를 통해 TLS 라이브러리를 로드합니다.
E2EE 키 교환, AES-GCM, 난수 생성기입니다. 공개 키는 두 백엔드 모두에서 PEM 형식으로 전송되며, raw 키도 여전히 허용되므로 서로 다른 백엔드를 사용하는 피어끼리도 상호 운용됩니다.
WebAuthn, SAML, OIDC WebAuthn 인증서, COSE 키, attestation 검사, 그리고 SAML과 OIDC가 사용하는 XMLDSig 서명 검사입니다.
NTLM NTLM 인증의 MD4 및 DES 코드입니다. 모든 빌드에서 네이티브이며 더 이상 어떤 정의도 필요하지 않습니다.
AEAD, KEM, HKDF sgcSSL_AEAD(AES-128-GCM, AES-256-GCM, ChaCha20-Poly1305), sgcSSL_KEM(ML-KEM-768과 ECDH P-256), sgcSSL_HKDF(이제 sgcHKDF_MD_SHA384도 포함). ML-KEM-768은 OpenSSL 3.5가 필요하지 않으며, 키는 OpenSSL 3.5와 동일한 인코딩을 사용합니다. FIPS 빌드에서는 ChaCha20-Poly1305를 사용할 수 없으며 예외를 발생시킵니다.
QUIC, DTLS, SRTP QUIC 패킷 보호, DTLS 인증서, SRTP입니다. iohNativeTLS를 사용하면 이 스위치의 값과 관계없이 연결마다 이미 네이티브입니다.

sgcCryptoBackend는 컴포넌트의 TLS 연결을 변경하지 않습니다. IOHandler = iohOpenSSL로 유지되는 컴포넌트는 연결할 때 여전히 OpenSSL을 로드합니다.

2. 선택적 정의: SGC_NATIVE_CRYPTO

이 정의는 기본적으로 꺼져 있으며, OpenSSL 없이 실행하는 데 더 이상 필요하지 않습니다. 정의하지 않으면 OpenSSL 코드와 네이티브 코드가 모두 컴파일되고 sgcCryptoBackend가 런타임에 결정합니다. 정의하면 sgcCryptoBackend의 값과 관계없이 네이티브 백엔드가 강제되며, OpenSSL 코드가 애플리케이션 암호화 유닛에서 제거되어 실행 파일이 더 작아집니다. 활성화하려면 sgcVer.inc를 열고 다음 줄에서 점을 제거하십시오

{.$DEFINE SGC_NATIVE_CRYPTO}

또는 프로젝트의 조건부 정의에 SGC_NATIVE_CRYPTO를 추가하십시오. SGC_NATIVE_CRYPTO는 필요한 sgcCrypto 유닛인 SGC_CRYPTO도 함께 켭니다. DISABLE_SGC_NATIVE_CRYPTO는 이를 다시 끕니다.

3. 런타임에서 OpenSSL 완전히 제거하기

어떤 설정이 필요한지는 애플리케이션이 무엇을 사용하는지에 따라 다릅니다:

영역 OpenSSL 없이 실행하기 위한 설정
TCP를 통한 TLS: WebSocket, HTTP/1, HTTP/2, TCP, MQTT 및 기타 프로토콜 TLSOptions.IOHandler(클라이언트) 또는 SSLOptions.IOHandler(서버) = iohNativeTLS. 네이티브 TLS를 참조하십시오.
QUIC 및 HTTP/3 IOHandler = iohNativeTLS. 핸드셰이크, 패킷 보호, 키 업데이트, Retry 태그가 모두 네이티브입니다. QUIC와 HTTP/3를 참조하십시오.
DTLS 및 WebRTC DTLSOptions.IOHandler = iohNativeTLS. 핸드셰이크, DTLS 인증서, SRTP 키가 네이티브입니다. DTLSOptions와 WebRTC DTLS를 참조하십시오.
애플리케이션 암호화: JWT, OAuth2, Web Push, Amazon Signature V4, E2EE, WebAuthn, SAML 및 첫 번째 표의 다른 영역 시작 시 sgcCryptoBackend := cbNative로 설정하거나, SGC_NATIVE_CRYPTO 정의를 사용하십시오.

iohNativeTLS를 사용하는 항목들은 정의도 sgcCryptoBackend 설정도 필요하지 않습니다. sgcCrypto 유닛이 없는 빌드에서 iohNativeTLS를 선택하면 예외가 발생하며, OpenSSL로 조용히 대체되는 일은 절대 없습니다.

iohNativeTLS

iohNativeTLS를 사용하면 TLS 1.3 및 TLS 1.2 핸드셰이크와 레코드 계층이 네이티브 엔진에서 실행됩니다. 이는 WebSocket, HTTP/1, HTTP/2, TCP 클라이언트와 서버, 그리고 이들을 기반으로 하는 모든 것, 즉 MQTT, AMQP, STOMP 및 기타 프로토콜, API 컴포넌트, IoT 클라이언트(Certificate.IOHandler), 프록시 서버의 업스트림 연결(Proxy.TLSOptions), LDAP 클라이언트에 대해 동작합니다. 인증서는 PEM, DER 또는 .pfx / .p12 파일일 수 있습니다.