4

別の HTTPS サーバーと通信する必要があるアプリに取り組んでいます。サーバーが SSL/TLS Client Hello を単純に無視する場合があります (Server Hello は返されません)。

この問題は、次のようなコードで現れます。

>curl32.exe -v -k --tlsv1 https://...
* timeout on name lookup is not supported
* About to connect() to <server> port 443 (#0)
*   Trying <IP>...
* connected
* Connected to <server> (<IP>) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: ./cacert.test.pem
  CApath: none
* Unknown SSL protocol error in connection to <Server>:443

* Closing connection #0
===> CURLcode is: 35

返されるコードは次のとおりです: CURLE_SSL_CONNECT_ERROR

OpenSsl から直接実行する場合は、これで問題ありません。

OpenSSL> s_client -tls1 -connect <server>:443

さまざまな組み合わせを試しました(TLS、SSLを指定するか指定しないか)。問題が発生する唯一の一般的なことは、SSL/TLS バージョンが一致していない場合です。したがって、WireShark では、TCP の下に Secure Socket Layer が表示されます。

  • SSL レコード層: ハンドシェイク プロトコル: Client Hello <===
    • バージョン: TLS 1.0 (0x0301)
    • ...
    • ハンドシェイク プロトコル: Client Hello
      • ...
      • バージョン: TLS 1.0 (0x0301)

サーバーから Server Hello が表示される正しいケースでは、次のように表示されます。

  • TLSv1 レコード層: ハンドシェイク プロトコル: Client Hello <===
    • バージョン: TLS 1.0 (0x0301)
    • ...
    • ハンドシェイク プロトコル: Client Hello
      • ...
      • バージョン: TLS 1.0 (0x0301)

それが libcurl の問題であるか、または WireShark が正しくデコードしていない可能性があるかどうかは完全にはわかりません (どちらの場合もレコード レイヤーはほぼ同じに見え、2 つのバージョン フィールドが正しいため)、libcurl が問題のように見えます。

何かご意見は?アイデア?似たような経験?どんな助けでも大歓迎です!!

4

1 に答える 1

3

さらにテストとデバッグを行ったところ、デフォルトまたは Curl を使用した TLSv1 (curl.exe -k -v --tlsv1 、または --tlsv1 なし) で一貫して失敗するサイトがいくつかあることがわかりましたが、SSLv3 では問題ありません。IE接続はTLSv1を使用し、openSSLはTLSv1を使用しても問題ないため、バージョンは問題ではありません。しかし、時間がなくなったので、回避策として SSLv3 を使用します。

実際の問題は、Client Hello で送信される暗号リストにある可能性があります。確実に機能する暗号を指定した後、SSL は問題ありません。

curl.exe -k -v <site>                     # failed
curl.exe -k -v --ciphers RC4-MD5 <site>   # now will connect

同様の問題がある場合、この記事は「SSL Unknown SSL protocol error」問題のトラブルシューティングに非常に役立ちました。

http://blog.techstacks.com/2010/03/3-common-causes-of-unknown-ssl-protocol-errors-with-curl.html

于 2012-11-21T22:46:00.130 に答える