2015-09-30 33 views
5

シンプルコード:tidhttp:(直接TLSv1_2接続を設定して)変なSSLv3_READ_BYTESエラー

Error connecting with SSL.
error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

私は、Delphi XE3とOpenSSL 1.0.2bを使用します。簡単なコードは私にエラーを与える

procedure TForm1.Button1Click(Sender: TObject); 
    //var 
    //h: tIdHTTP; 
    //SSL: TIdSSLIOHandlerSocketOpenSSL; 
begin 
    h.IOHandler := SSL; 
    SSL.SSLOptions.Method := sslvTLSv1_2; 
    SSL.SLLOptions.SSLVersion := [sslvTLSv1_2]; //must be set automatically after SetMethod, but just to be sure 
    h.Get('https://www.deviantart.com/users/login'); 
end; 

ことlibs。

if not (sslvSSLv2 in SSLVersions) then begin 
    SSL_CTX_set_options(fContext, SSL_OP_NO_SSLv2); 
end; 
if not (sslvSSLv3 in SSLVersions) then begin 
    SSL_CTX_set_options(fContext, SSL_OP_NO_SSLv3); 
end; 
if not (sslvTLSv1 in SSLVersions) then begin 
    SSL_CTX_set_options(fContext, SSL_OP_NO_TLSv1); 
end; 

しかし、SSLv3の操作はまだ何とかになって: が、私はそれを把握することはできません、ソースに探して、バージョンを使用していない無効接続開始中の文字列があります。コンポーネントのバグのようには見えません。何かライブラリ内部、またはインディはパラメータを設定するときに何かを考慮しない?

実際には、何か重要なことに気付かなかったのは私です。 "indy components update"という地獄を通過する必要はないと本当に願っています。 (TLS1.2含む試みすべてのメソッド)SSL3とTLS1 /用https://www.deviantart.com/users/login

Resolving hostname www.deviantart.com. 
Connecting to 54.230.96.81. 
Handshake Start: before/connect initialization 
Connect Loop: before/connect initialization 
Connect Loop: SSLv3 write client hello A 
fatal Read Alert: handshake failure 
Connect Failed: SSLv3 read server hello A 
ERROR: Error connecting with SSL. 
error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure 
  • 1.1/1.2結果は同一であるに

    テスト。

  • SSLv23の回答SSL23_GET_SERVER_HELLO:sslv3アラートハンドシェイクの失敗。
  • for SSLv2は応答しません。同様のリソース(TLS1.2 ONLY)に

テストhttps://files.yande.re/image/da9afa6d9ca43a9f154fad69f76adb85.jpg

Resolving hostname files.yande.re. 
Connecting to 5.39.10.56. 
Handshake Start: before/connect initialization 
Connect Loop: before/connect initialization 
Connect Loop: SSLv3 write client hello A 
Connect Loop: SSLv3 read server hello A 
Connect Loop: SSLv3 read server certificate A 
Connect Loop: SSLv3 read server key exchange A 
Connect Loop: SSLv3 read server done A 
Connect Loop: SSLv3 write client key exchange A 
Connect Loop: SSLv3 write change cipher spec A 
Connect Loop: SSLv3 write finished A 
Connect Loop: SSLv3 flush data 
Connect Loop: SSLv3 read server session ticket A 
Connect Loop: SSLv3 read finished A 
Handshake Done: SSL negotiation finished successfully 
Connect Exit: SSL negotiation finished successfully 

マイWireSharkのテスト:

  • インディ:http://imgur.com/BZ84Cl3(応答が握手故障です)。
  • Firefox:http://imgur.com/pkYJvnO;
  • Firefoxリクエストへの応答:http://imgur.com/M9ni3TV;
+0

TLS1は基本的にSSL3の拡張です。OpenSSLはSSL3ルーチンの内部でTLS1を実装しています。 –

+0

Indyソースディレクトリをプロジェクト検索パスに追加し、コンポーネントを動的に作成すると、新しいバージョンのIndyを簡単に試すことができます。参照してください:[HTTPS URLを要求するときTIdHTTPは現在、デフォルトのSSLIOHandlerを作成](http://www.indyproject.org/Sockets/Blogs/ChangeLog/20141222.DE.aspx) – mjn

+0

MJN、先端のためのおかげで、しませんでした何らかの理由でそれについて考える。 – avil

答えて

0

警告ハンドシェイクに失敗は、初期ハンドシェイクは、サーバー側で障害が発生していること、それは、接続を閉じる前に、あなたのクライアントに通知するアラートを送信します。サーバーが期待している互換性のある証明書または暗号スイートをセットアップしていない可能性があります。あるいは、サーバが単にTLS 1.2をサポートしていないこともあります。代わりにTLS 1.0またはTLS 1.1を使用してみてください。また、OpenSSL独自のs_clientツールを使用して、正しい設定を見つけて必要に応じてIndyに適用するまで、接続の問題をデバッグすることもできます。または、Wiresharkを使用して実際のハンドシェイクを調べ、失敗した段階を確認します。

+0

あなたの話が聞こえます。私はすべてのアクセス可能な方法も試しました。また、私のブラウザでは、TLS 1.2暗号化を使用しています(ページのセキュリティデータに従って)。 https://files.yande.re/image/da9afa6d9ca43a9f154fad69f76adb85.jpg プードルパニックが始まった後に動作を停止しましたが、OpenSSLライブラリのアップデートが役立ちました(ファイルサーバではありません)。それと。 deviantartではなく、tho。ブラウザのデータに基づいて、両方のリソースに同じ暗号化方法を使用します。だから、私はすぐに暗号を調べるべきだと思う。 – avil

0

Google Chromeのwiresharkログ(これはうまくいきました)と私のアプリケーション(ハンドシェイクの問題あり)を比較して、今朝のハンドシェイクの問題を修正しました。 "signature_algorithms"拡張を有効にしなければならなかったことが判明しました。

しかし、私はクライアント証明書を動的に読み込まなければならなかったので、私はSecureBlackBoxを使っています(indyとopensslではありませんが、これはwiresharkとの比較とデバッグに役立ちます)。

+0

ああ、それは私の場合ではありません。 Indyはsignature_algorithmsを使用して、SHA1 + RSA/DSA/ECDSAからSHA512までのすべてのシグネチャをマーキングします。 は(ただし、ブラウザの中に、インディの要求で使用されるハートビート延長のような)他の拡張機能が問題を引き起こすことができるかどうかを把握しようと、あるいは何かが欠落しています。それは、DLLフラグT_Tで苦労することになるだろう。暗号リストはブラウザのATMと同じです。 – avil