TsgcWebSocketServer › プロパティ › SSLOptions

SSLOptions プロパティ

TLSリスナーの証明書パス、TLSバージョン選択、およびOpenSSLチューニングを保持します。

構文

property SSLOptions: TsgcWSSSL_Options read FSSLOptions write SetSSLOptions;

デフォルト値

Version=tlsUndefined、VerifyCertificate=False

解説

SSL が True の場合、サーバーをアクティブにする前に証明書マテリアルを提供してください: RootCertFile、CertFile、KeyFile は PEM ファイルを指します(ファイルにフルチェーンが含まれている場合は 3 つすべてに同じパスを使用)。Password は秘密鍵が暗号化されている場合のみ必要です。VerifyCertificate を True に設定してクライアント証明書のリクエストと検証を行います(サブオプション FailIfNoCertificate と VerifyClientOnce でチェックを調整)。VerifyDepth でチェーンの長さを制御します。Version で特定の TLS バージョン(tls1_0、tls1_1、tls1_2、tls1_3)を選択するか、ネゴシエーションをオープンのままにします(tlsUndefined)。iohNativeTLS の場合、これは代わりに許可される最も低いバージョンになります(詳細は後述)。OpenSSL_Options は低レベルのノブを公開します: APIVersion(oslAPI_1_0/oslAPI_1_1/oslAPI_3_0)、OpenSSL バイナリを見つけるための LibPath/LibPathCustom、UnixSymLinks、ECDHE、CipherList、CurveList、ホスト名/IP 検証のための VersionMin、X509Checks。

VerifyCertificate は、クライアント証明書が発行後に失効させられたかどうかについては何も判断しません。そのため、鍵が盗まれてシリアル番号が失効させられた証明書であっても、有効期限が切れるまではセッションを開始できてしまいます。IOHandler=iohSChannel の場合、クライアント証明書の失効状態が照会されるのは、SChannel_Options.Revocation.Check をデフォルトの scrcDisabled 以外に設定したときだけです: scrcEndCertificate はクライアント証明書のみをチェックし、scrcChainExcludeRoot はクライアント証明書と中間証明書をあわせてチェックし、scrcChain はルート証明書も含めます。Revocation.Timeout は CRL および OCSP の取得全体を制限し(デフォルトは 5000 ミリ秒)、到達できないレスポンダーがハンドシェイクを停滞させないようにします。Revocation.CacheOnly は Windows が既にキャッシュしている情報のみを使用し、ネットワークにアクセスしません。Revocation.IgnoreRevocationOffline と Revocation.IgnoreNoRevocationCheck(どちらも True)は、到達できないレスポンダーや失効情報を公開していないクライアント証明書を受け入れるかどうかを決定します。失効が確認された証明書は常に拒否されます。Preset := tlspSecureDefaults を設定するとチェックが scrcChainExcludeRoot として有効になり、2 つのソフトフェイル設定はそのまま維持されるため、これまで受け入れられていたクライアントは引き続き受け入れられます。サーバー SSL | SChannel クライアント証明書の失効を参照してください。

IOHandler は TLS エンジンを選択します。デフォルトは iohOpenSSL で、iohSChannel は Windows のプロバイダーを使用します。iohNativeTLS は、sgcCrypto パックに含まれる、TLS 1.3 と TLS 1.2 を話す純粋な Object Pascal の TLS エンジンを選択します。OpenSSL ライブラリは読み込まれず、TLS 1.3 では RFC 10024 のハイブリッドポスト量子鍵交換グループが X25519MLKEM768 を先頭にして提示されます。2 つの優先順位リストは NativeTLS_Options.Groups と NativeTLS_Options.CipherSuites で、OpenSSL 形式のコロン区切りです。リストが空の場合はエンジンのデフォルトが維持されます。このエンジンは、従来の接続ごとに 1 スレッドのエンジンでも、IOCP や EPOLL のエンジンでも同じように動作します。iohAppleTLS と iohAndroidTLS はクライアント専用のハンドラーです。これらのいずれかを設定したサーバーは、OnSSLGetHandler が独自のハンドラーを提供しない限り、Active を True に設定した時点で例外を発生させます。代わりに iohNativeTLS、iohOpenSSL、または Windows では iohSChannel を使用してください。

ネイティブエンジンでは、Version は iohOpenSSL の場合と異なり、正確なバージョンではなく許可される最も低いバージョンです。tlsUndefined(デフォルト)と tls1_2 は TLS 1.3 と TLS 1.2 を受け入れ、tls1_3 は TLS 1.3 のみを受け入れ、tls1_0 または tls1_1 は、エンジンが TLS 1.2 と TLS 1.3 のみに対応するため、サーバーの起動時に設定エラーになります。TLS 1.2 のみを受け入れるには、NativeTLS_Options.CipherSuites に TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 のような TLS 1.2 のスイートのみを指定してください。エンジンはクライアント証明書を RootCertFile のルートに対して検証し、NativeTLS_Options.UseSystemRoots が True(デフォルトは False)の場合はオペレーティングシステムが信頼するルートも加えて検証します。iohNativeTLS の場合、CertFile には証明書、チェーン、鍵を保持する .pfx または .p12 ファイルを指定することもでき、Password で開かれます。このエンジンは TLS 1.3 と TLS 1.2 のセッションチケットでセッションを再開します。NativeTLS_Options.SessionTickets(デフォルトは True)でオンにし、NativeTLS_Options.TicketLifetime(デフォルトは 7200 秒)でチケットを使用できる期間を設定します。TLS 1.2 の再開にはクライアントが拡張マスターシークレットに対応している必要があります。0-RTT は受け付けず、OpenSSL ハンドラーに属する OnSSLVerifyPeer も発生させません。VerifyCertificate はクライアントに証明書を要求して検証し、VerifyCertificate_Options.FailIfNoCertificate は証明書を送らないクライアントを拒否し、エンジンは再ネゴシエーションを一切行わないため VerifyClientOnce は効果がありません。ネイティブ TLS を参照してください。

AllowPlainText(デフォルトは False)を指定すると、TLSリスナーは同じポートでプレーンHTTPおよびWebSocket接続も受け付けます。サーバーは新しい接続ごとに最初の1バイトを先読みします。$16(TLSハンドシェイクレコード)はTLSを意味し、それ以外はプレーンテキストとして処理されます。PlainTextTimeout(ミリ秒、デフォルトは 5000)の間にバイトが届かない場合、その接続はTLSとして扱われます。PlainTextPolicy はプレーン接続の扱いを決定します。ptpServe(デフォルト)はリクエストを通常どおり処理し、ptpRedirect はメソッドとボディを維持したまま https://<Host><path> へ 308 Permanent Redirect を返し(リクエストにHostヘッダーがない場合は 400 Bad Request)、ptpReject は 400 Bad Request を返して接続を閉じます。TsgcWSConnectionServer の接続プロパティ TLS で、接続がTLSを使用しているかどうかを確認できます。これらのオプションはデフォルトのIndy IOHandlerに加え、IOCPおよびEPOLL IOHandlerでも動作します。OnCommandGet 内では、サーバーメソッド IsTLS(AContext) でリクエストがTLSを使用しているかどうかを確認できます。同一ポートでのTLSとプレーンHTTP を参照してください。

使用例


oServer := TsgcWebSocketServer.Create(nil);
oServer.SSL := true;
oServer.SSLOptions.CertFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.KeyFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.RootCertFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.Version := tls1_3;
oServer.SSLOptions.OpenSSL_Options.VersionMin := tls1_2;
oServer.SSLOptions.Port := 443;
oServer.Active := true;

プロパティに戻る