sgcWebSockets は OpenSSL ライブラリを一切使わずに動作させることができます。これを可能にするのは 2 つの独立した設定で、どちらも純粋な 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 鍵、アテステーションの検証、および 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 ファイルのいずれでも構いません。