sgcWebSockets는 OpenSSL 라이브러리가 전혀 없어도 실행할 수 있습니다. 이를 가능하게 하는 독립적인 두 가지 설정이 있으며, 둘 다 순수 Pascal로 작성된 sgcCrypto 유닛을 기반으로 하고, 이 유닛은 Standard 에디션부터 제공됩니다.
iohNativeTLS는 IOHandler 값입니다. 컴포넌트의 연결, 즉 TLS, QUIC, DTLS에서 OpenSSL을 대체합니다. 네이티브 TLS를 참조하십시오.
sgcCryptoBackend는 런타임 스위치입니다. 연결이 아닌 애플리케이션 암호화, 즉 해시, 서명, 키 교환, 인증서 처리의 백엔드를 선택합니다.
연결에도 다른 암호화 작업에도 OpenSSL이 필요 없는 애플리케이션은 두 가지를 모두 사용합니다.
유닛 sgcBase_Helpers는 TsgcCryptoBackend 타입의 전역 변수 sgcCryptoBackend를 선언합니다:
cbOpenSSL(기본값): 애플리케이션 암호화는 이전 버전과 마찬가지로 OpenSSL에서 실행됩니다.
cbNative: sgcCrypto에서 실행되며 OpenSSL은 이를 위해 로드되지 않습니다.
cbAuto: OpenSSL을 로드할 수 있으면 OpenSSL을 사용하고, 로드할 수 없으면 sgcCrypto를 사용합니다. 이 검사는 한 번만 실행되며 결과가 캐시됩니다.
이 스위치는 컴포넌트별이 아니라 전역입니다. 컴포넌트를 생성하기 전, 시작 시 한 번만 설정하십시오. 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을 로드합니다.
이 정의는 기본적으로 꺼져 있으며, OpenSSL 없이 실행하는 데 더 이상 필요하지 않습니다. 정의하지 않으면 OpenSSL 코드와 네이티브 코드가 모두 컴파일되고 sgcCryptoBackend가 런타임에 결정합니다. 정의하면 sgcCryptoBackend의 값과 관계없이 네이티브 백엔드가 강제되며, OpenSSL 코드가 애플리케이션 암호화 유닛에서 제거되어 실행 파일이 더 작아집니다. 활성화하려면 sgcVer.inc를 열고 다음 줄에서 점을 제거하십시오
{.$DEFINE SGC_NATIVE_CRYPTO}
또는 프로젝트의 조건부 정의에 SGC_NATIVE_CRYPTO를 추가하십시오. SGC_NATIVE_CRYPTO는 필요한 sgcCrypto 유닛인 SGC_CRYPTO도 함께 켭니다. DISABLE_SGC_NATIVE_CRYPTO는 이를 다시 끕니다.
어떤 설정이 필요한지는 애플리케이션이 무엇을 사용하는지에 따라 다릅니다:
| 영역 | 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를 사용하면 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 파일일 수 있습니다.