web-dev-qa-db-ja.com

curlがHTTPSコンテンツの取得に失敗する:エラー:14094410:SSLルーチン:ssl3_read_bytes:sslv3アラートハンドシェイクの失敗

Windows 10とUbuntu 16.04でcurlを使用してウェブサイトhttps://www.lawsociety.com.auにアクセスしようとしています。 Ubuntuでは機能しますが、Windowsではerror:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failureというメッセージが表示されて失敗します。何が間違っているのか、どのように修正するのかわかりません。

Windowsマシンでのcurlの出力は次のとおりです。

> curl -i -v -I https://www.lawsociety.com.au
* Rebuilt URL to: https://www.lawsociety.com.au/
*   Trying 125.7.104.7...
* TCP_NODELAY set
* Connected to www.lawsociety.com.au (125.7.104.7) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: D:\dev\curl\bin\curl-ca-bundle.crt
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS alert, Server hello (2):
* error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
* stopped the pause stream!
* Closing connection 0
curl: (35) error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

カールバージョン:

curl 7.57.0 (x86_64-pc-win32) libcurl/7.57.0 OpenSSL/1.1.0g (WinSSL) zlib/1.2.11 WinIDN libssh2/1.8.0 nghttp2/1.28.0
Release-Date: 2017-11-29
Protocols: dict file ftp ftps Gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL libz TLS-SRP HTTP2 HTTPS-proxy MultiSSL    

Ubuntuボックスで同じコマンド:

$ curl -I -v https://www.lawsociety.com.au
* Rebuilt URL to: https://www.lawsociety.com.au/
*   Trying 125.7.104.7...
* Connected to www.lawsociety.com.au (125.7.104.7) port 443 (#0)
* found 148 certificates in /etc/ssl/certs/ca-certificates.crt
* found 594 certificates in /etc/ssl/certs
* ALPN, offering http/1.1
* SSL connection using TLS1.0 / RSA_3DES_EDE_CBC_SHA1
*        server certificate verification OK
*        server certificate status verification SKIPPED
*        common name: *.lawsociety.com.au (matched)
*        server certificate expiration date OK
*        server certificate activation date OK
*        certificate public key: RSA
*        certificate version: #3
*        subject: C=AU,postalCode=2000,ST=NSW,L=Sydney,street=170 Phillip Street,O=THE LAW SOCIETY OF NEW SOUTH WALES,OU=PremiumSSL Wildcard,CN=*.lawsociety.com.au
*        start date: Fri, 17 Mar 2017 00:00:00 GMT
*        expire date: Mon, 16 Apr 2018 23:59:59 GMT
*        issuer: C=GB,ST=Greater Manchester,L=Salford,O=COMODO CA Limited,CN=COMODO RSA Organization Validation Secure Server CA
*        compression: NULL
* ALPN, server did not agree to a protocol
> HEAD / HTTP/1.1
> Host: www.lawsociety.com.au
> User-Agent: curl/7.47.0
> Accept: */*
>
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Date: Tue, 26 Dec 2017 09:04:02 GMT
Date: Tue, 26 Dec 2017 09:04:02 GMT
< Server: Oracle-Application-Server-11g
Server: Oracle-Application-Server-11g
< Cache-Control: no-cache
Cache-Control: no-cache
< Content-Length: 36272
Content-Length: 36272
< Set-Cookie: JSESSIONID=kGs3hCQCW7FPhQ2Lh0JvKn9JvXhhHCK2GQKXvLps308Ww1D70pMp!1826685759; path=/; HttpOnly
Set-Cookie: JSESSIONID=kGs3hCQCW7FPhQ2Lh0JvKn9JvXhhHCK2GQKXvLps308Ww1D70pMp!1826685759; path=/; HttpOnly
< X-Oracle-DMS-ECID: 005OJeGQSZb9xWGayxQ_MG0007Z60000EU
X-Oracle-DMS-ECID: 005OJeGQSZb9xWGayxQ_MG0007Z60000EU
< X-Powered-By: Servlet/2.5 JSP/2.1
X-Powered-By: Servlet/2.5 JSP/2.1
< Content-Type: text/html; charset=utf-8
Content-Type: text/html; charset=utf-8

<
* Connection #0 to Host www.lawsociety.com.au left intact

Windowsでopenssl s_clientコマンドを試しました:

> openssl s_client -connect www.lawsociety.com.au:443
CONNECTED(00000224)
depth=3 C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root
verify error:num=19:self signed certificate in certificate chain
---
Certificate chain
 0 s:/C=AU/postalCode=2000/ST=NSW/L=Sydney/street=170 Phillip Street/O=THE LAW SOCIETY OF NEW SOUTH WALES/OU=PremiumSSL Wildcard/CN=*.lawsociety.com.au
   i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
 1 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
   i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
 2 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
   i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root
 3 s:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root
   i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root
---
Server certificate
-----BEGIN CERTIFICATE-----
... <removed to save space> ...
-----END CERTIFICATE-----
subject=/C=AU/postalCode=2000/ST=NSW/L=Sydney/street=170 Phillip Street/O=THE LAW SOCIETY OF NEW SOUTH WALES/OU=PremiumSSL Wildcard/CN=*.lawsociety.com.au
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
---
No client certificate CA names sent
---
SSL handshake has read 5683 bytes and written 621 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1
    Cipher    : RC4-SHA
    Session-ID: 8198FE887E4FC12D68E2388D4C052ABF
    Session-ID-ctx:
    Master-Key: 93688C15A75E3E9F596AF96DFF72B557AD28A3FEF8764401CBD12D1F432EAF4D216595D74338AF24498AB29FF5ABE759
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1514278771
    Timeout   : 300 (sec)
    Verify return code: 19 (self signed certificate in certificate chain)
---

だから接続は問題ないようです。ブラウザでURLを開いても問題なく動作します。

何が欠けていますか?

[〜#〜]更新[〜#〜]

1。考えられる問題の1つは、Webサイトが古いRC4-SHA暗号を使用していることです。私はcurlで明示的に有効にしようとしましたが、curlは拒否しました:

> curl -i -v -I --ciphers "RC4-SHA" https://www.lawsociety.com.au
* Rebuilt URL to: https://www.lawsociety.com.au/
*   Trying 125.7.104.7...
* TCP_NODELAY set
* Connected to www.lawsociety.com.au (125.7.104.7) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* failed setting cipher list: RC4-SHA
* Closing connection 0
curl: (59) failed setting cipher list: RC4-SHA

2。別の潜在的な問題は、ルート証明書が使用できない可能性があることです。ただし、curlには最新のMozilla CAバンドル(curl-ca-bundle.crt)が付属しているため、正しい証明書を使用していると思います。

また、動作中のUbuntuボックスからWindowsマシンにすべてのパブリック証明書をコピーし、--capath paramを使用してcurlへの証明書パスを指定しました。これは役に立ちません。

完全を期すために、最新のPython 3.6.4:

import urllib.request
with urllib.request.urlopen('https://www.lawsociety.com.au/') as u:
    print(u.read())

Python SSLは、HTTPS用のWindows機能を使用する必要があります。ただし、同じエラーで失敗します。

ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:777)
...
During handling of the above exception, another exception occurred:
...
urllib.error.URLError: <urlopen error [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:777)>

したがって、問題は証明書の欠落によるものではなく、どこかで発生したようです。私はSSLの専門家ではないため、間違っている可能性があります。

[〜#〜]ソリューション[〜#〜]

この問題の根本的な原因は、Webサイトで使用されている古いSSLプロトコル+暗号です。 curlを機能させるために、RC4暗号をサポートするOpenSSL 1.0.2を使用するバージョンにダウングレードしました。その後、すべてが問題なく動作します。

Pythonソリューションが必要な場合:

import ssl
import urllib.request

ctx = ssl.SSLContext(protocol=ssl.PROTOCOL_SSLv3)
ctx.set_ciphers('SSLv3')
# alternatively, for this particular website:
#ctx.set_ciphers('RC4-SHA:RC4-MD5')

with urllib.request.urlopen('https://www.lawsociety.com.au/', context=ctx) as u:
    print(u.read())
5
Alex Blekhman

ここでは実際には2つの多少重複する問題があり、どちらも明らかにサーバーが古くなっている、または非常識に操作されていることに関連しています。 ssllabsによる分析 は、SSLv3およびTLSv1.0プロトコルのみ、および4つの暗号スイートのみをサポートすることを示しています。

TLS_RSA_WITH_DES_CBC_SHA (0x9)   INSECURE   56
TLS_RSA_WITH_3DES_EDE_CBC_SHA (0xa)   WEAK  112
TLS_RSA_WITH_RC4_128_MD5 (0x4)   INSECURE   128
TLS_RSA_WITH_RC4_128_SHA (0x5)   INSECURE   128

(OpenSSL命名スキームでは、DES-CBC-SHA、DES-CBC3-SHA、RC4-MD5およびRC4-SHAです)。

まず、SSLLabsで指摘されているように、サーバーは「バージョン非対応」です。バージョン1.0のClientHelloオファリングのバージョンをバージョン1.0のレコードで送信すると(そうでない場合は受け入れられます)、必要に応じて1.0までネゴシエートします*。このオファーをレコードバージョン1.1または1.2で送信すると、一部のソフトウェア(最近のOpenSSLはAFAICTではありません)と同様に、サーバーはアラートclose_notify(この状態では正しくありません)で異常終了します。 (*:まあ、それはまったく1.0をサポートしていることを前提として)

次に、上記の4つの暗号スイートのみをサポートします。 OpenSSLの非常に最近のバージョン、特に1.1.0gは完全に壊れているため、シングルDESを(まったく)サポートしなくなり、デフォルトでRC4またはトリプルDESをサポートしませんさまざまなバイアス一般的な誕生日攻撃 のためしたがって、OpenSSLが使用されている場合、共通の暗号スイートはなく、サーバーは警告handshake_failureで正しく中止されます。ただし、ビルド(コンパイル)時に構成されていない限り、RC4またはTDES、あるいはその両方を有効にできるはずです。お使いのWindowsバージョンで(WinSSL)OpenSSL/1.1.0gが追加されていることに気づきました。これがschannelがここで(またはまったく)使用されているかどうかはわかりません。その場合、--ciphers RC4-SHA(OpenSSL命名スキームを使用)が機能しなかった可能性があります。

Windowsプログラム、特にcurlやOpenSSLのような「インポート」では、UnbuntuやほとんどのLinux(および他のUnix)とは異なり、通常ライブラリを共有しません。 Windows OpenSSLでopenssl versionを試して、それが何かを確認することができます。私はそれが最新のものではないに違いない、そしてあなたが最新のものを手に入れればそれはコマンドラインから同じ問題を示すでしょう。

Ubuntu 16.04(LTSを想定していますか?)はEdgeに影響を与えていません。また、最近廃止された暗号を引き続きサポートすることは理にかなっています。

5

問題は、Webサイトのハッシュアルゴリズムと暗号にあります。少なくともRC4はずっと前に安全でないと宣言されているので、多くのプログラムはそれを使用することを拒否します。また、一部のSHAアルゴリズムも安全ではありません。実際の暗号コードはソフトウェアから完全に削除されている可能性があります。

---以前の間違った答え---

Windows OpenSSLバージョンには、リモートサーバーのTLS証明書の確認に使用される信頼されたルート証明書がありません。

これは、検証証明書をロードするWindows CURLの行です。

* successfully set certificate verify locations:
*   CAfile: D:\dev\curl\bin\curl-ca-bundle.crt

Linuxでの同様のエントリ:

* found 148 certificates in /etc/ssl/certs/ca-certificates.crt
* found 594 certificates in /etc/ssl/certs

これは、Windows OpenSSLがWindows証明書ストアをサポートしていないために発生します。そこに証明書を手動でインストールする必要があります。

https://maulwuff.de/research/ssl-debugging.html#hdr3. には、問題とその解決方法に関する情報があります。

0
Tero Kilkanen

そのような問題がありました。このメッセージエラー「cURLエラー35:エラー:14094410:SSLルーチン:ssl3_read_bytes:sslv3アラートハンドシェイクエラー(http_request_failed)」がワードプレスで表示されます。

Jetpack of wordpressを設定しようとしていて、cloudflareを使用していました。

CloudFlareでボタンEnalbe Universal SSLをクリックして修正できました。

0
Saulo Souza