Schannelは、TLSプロトコルのWindows組み込みの実装です。これにより、外部ライブラリなしで安全な接続をサポートできます。
レポは含まれます:
SChannel.Utils.pas輸送に依存しないヘルパー機能を備えたユニットWindowsシャネルによるTLS通信を簡単に実装するため。
SChannel.SyncHandshake.pas実際のコミュニケーションのためにコールバック関数を使用して、輸送依存同期TLSハンドシェイクのサンプル
SChannel.Jwa*.pasジェダイプロジェクトから借用されたAPI宣言
SChannel.IcsWSocket.pas -ICS TLS通信を実行するICS Twsocket Descendant
Demo - セキュア接続を介してテキスト(主にHTTPS)要求を実行するためのデモプロジェクト
Enable TLS 1.1 and 1.2 for W7.reg - Windows 7でTLS 1.1と1.2を有効にするレジストリパッチ(これらは、W7でデフォルトで有効にされていない実際のプロトコルバージョンです)
インストール可能なコンポーネントはありません - ソースをダウンロードしたり、パスを追加したり、ユニットを使用したりできます。ただし、パッケージを好む場合は、Rad XE2で作成された2つのパッケージがあります。 IDEでそれらのいずれかを開くだけで、パッケージを現在のバージョンにアップグレードする必要があります。
SChannel_XE2.dprojは、ICSソケットを除くすべてのユニットが含まれています。 ICSがインストールされていない場合は、使用してくださいSChannel_XE2_ICS.dprojは、 SChannel.IcsWSocket.pasのICSソケットを含むすべてのユニットが含まれています。 ICSがインストールされる必要があります両方のパッケージは、プロジェクトが構築されるたびに混乱を減らし、シャネルユニットを再コンパイルすることを避けるために..Bin$(Config)$(Platform)にユニットを構築するように構成されています。したがって、 SChannelBinRelease$(Platform)検索パスに、 SChannelSourceブラウジングパスに追加できます。この場合、使用するすべてのプラットフォームのパッケージを構築することを忘れないでください。その後、インストールが完了しました。
Delphinus Package Manager経由のインストールも可能です。ただし、制限があるのは初期バージョンです。
このプロジェクトは、DelphiアプリにTLSが必要であり、2つのOpenSSL Libsを出荷するのが好きではなかったために開始されました。初期バージョンは、インターネットで見つかったシャネルサンプルの1:1書き換えでした。現在、24*7のプロジェクトで使用されていますが、必要な機能のみを実装しました。私はこのすべてのcryptostuffに精通していないので、高度な証明書の検証、安全なサーバーなどを期待しないでください。しかし、不足しているものを追加したい場合は、PRを喜んで検討してください:)。
ハンドシェイク中にSEC_E_BUFFER_TOO_SMALLまたはSEC_E_MESSAGE_ALTEREDステータスをめったに返すことはほとんどなくランダムに関数を引き起こすシャネルバグがあります。問題の良い説明はここで見つけることができます(簡単に言えば:TLSV1.2およびTLS_DHE_RSA_WITH_AES_128_GCM_SHA256およびTLS_DHE_RSA_WITH_AES_256_GCM_SHA384 CIPHER SUITESでは、Windows 7と8でのみ発生します。この問題に対処するために、いくつかの対策が講じられました。
握手のためのバッファーの数の増加(カールチームがしたこと) - 助けにはなりませんでした
DoClientHandshakeコールのセクションexceptバグを便利にチェックできるように、 SChannel.Utils.pasにIsWinHandshakeBugを追加しました。特別な処理を行うためのヘルパー
...
try
DoClientHandshake(FSessionData, FHandShakeData);
except on E: ESSPIError do
// Hide Windows handshake bug and restart the process
if (FHandShakeData.Stage = hssReadSrvHello) and IsWinHandshakeBug(E.SecStatus) then
begin
Log(Format( ' Handshake bug: "%s", retrying ' , [E.Message]));
DeleteContext(FHandShakeData.hContext);
DoHandshakeStart;
Exit;
end
else
raise E;
end ;
... SChannel.SyncHandshake.pasのIcsSChannelSocket.pasのTSChannelWSocket class from PerformClientHandshake関数は、既に1回限りの再試行を発信者に実装しています。
ソケットクラスは、あなたのために多くのことをするICS TWSocketから降ります。主な機能:
Secureプロパティを設定することにより、いつでも開始/終了できます。 OnTLSDoneおよびOnTLSShutdownイベントは、チャネル状態を信号しますSessionData.SharedCredsプロパティを使用して、複数のソケット間で共有できます。セッションが共有されると、握手が大幅に短くなるため、価値があります