5

php curl を使用してサイトに接続しようとしていますが、「一般的な暗号化アルゴリズムがありません」というエラーが表示されます。さらに調査すると、これは NSS と関係があると思いますか? コマンドラインからエラーを再現できることを発見しました(したがって、問題は間違いなくcurlにあり、phpラッパーにはありません)が、 --ciphers ecdhe_ecdsa_aes_128_sha を設定すると動作します:

[ec2-user@ip-10-181-165-22 current]$ curl -I https://sslspdy.com
curl: (35) Cannot communicate securely with peer: no common encryption algorithm(s).

[ec2-user@ip-10-181-165-22 current]$ curl -I --ciphers ecdhe_ecdsa_aes_128_sha https://sslspdy.com
HTTP/1.1 200 OK
Server: nginx centminmod
Content-Type: text/html; charset=utf-8
Connection: close
Vary: Accept-Encoding
Strict-Transport-Security: max-age=31536000; includeSubdomains
Date: Sat, 07 Feb 1970 22:34:32 GMT
X-Page-Speed: ngx_pagespeed
Cache-Control: max-age=0, no-cache

だから私の質問は、

  1. なぜこうなった?SSL暗号がcurlでどのように機能するかについて、オンラインで説明を見つけることができませんでした。すべてのページは、読者がすでにその分野の専門家であるという前提で書かれているようです。残念ながら、「あなたはおそらく NSS を使用しているので、FIPS 用に PKCS を切り替えてみてください」のような文は、私にはまったく理解できず、グーグルで検索しました。個々のコンポーネントのみを説明し (通常は 20 年前の標準を参照して)、それらが相互にどのように関係しているかは説明しません。

  2. curl が試行している暗号とサーバーが受け入れる暗号を教えてくれる方法はありますか? ssllabsでサーバーを調べてみましたが、サーバーがすべての暗号を受け入れると言っているようですが、明らかにそうではありません。

  3. PHP スクリプトがこのサーバーに接続できるようにするには、curl_setopt にどのオプションを渡す必要がありますか?

  4. 暗号をこれに設定すると、他のサイトが壊れますか? curl がすべての安全なサイトに接続できるようにするためにできることはありますか、それとも異なる暗号を手動で反復して、それぞれが機能するかを確認する必要がありますか?

4

4 に答える 4

4
  1. Why is this happening? I have not been able to find an explanation online as to how the ssl ciphers work in curl

It depends on a few things. The client and server libraries, the client and server configurations, etc. You'd need to provide more details.


  1. Is there any way I can make curl tell me which ciphers

Use the right tool for the job. In this case, its an updated sslscan.


  1. What options do I need to pass to curl_setopt so that my php script is able to connect to this server?

CURLOPT_SSL_CIPHER_LIST.


  1. If I set the cipher to this, will that break other sites?

Maybe. It depends on that particular site's configuration.

Ideally, you pick 12 or 16 cipher suites you approve of, and then you use them instead of one. The 12 or 16 covers most sites you encounter on the internet.

Here's the list I usually use. Its from Which Cipher Suites to enable for SSL Socket?:

  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_DHE_DSS_WITH_AES_128_GCM_SHA256
  • TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
  • TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  • TLS_DHE_DSS_WITH_AES_128_CBC_SHA
  • TLS_RSA_WITH_AES_256_CBC_SHA256
  • TLS_RSA_WITH_AES_256_CBC_SHA
  • TLS_RSA_WITH_AES_128_CBC_SHA256
  • TLS_RSA_WITH_AES_128_CBC_SHA

I would like to ditch the TLS_RSA_* cipher suites because they are key transport, but I need them for those older IIS servers I encounter.

As you can see from the scan results below, this list intersects with the server's list.


Note that you don't specify, say TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384. Rather, in OpenSSL, you specify the OpenSSL's name ECDHE-ECDSA-AES256-SHA384 for the suite. You can find the OpenSSL names at the documentation for openssl ciphers.

With OpenSSL, you can also use the string "HIGH:!aNULL:!MD5:!RC4:!PSK:!SRP". That will get you about 40 or 50 that are reasonably good choices.

You can run the OpenSSL ciphers command to see what the list is:

$ openssl ciphers -v 'HIGH:!aNULL:!MD5:!RC4:!PSK:!SRP'
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA384
ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA384
ECDHE-RSA-AES256-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA1
ECDHE-ECDSA-AES256-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA1
...

You can use an updated version of sslscan to determine what cipher suites are available:

$ sslscan --no-failed sslspdy.com
...
Testing SSL server sslspdy.com on port 443

  Supported Server Cipher(s):
    Accepted  TLSv1  256 bits  ECDHE-ECDSA-AES256-SHA
    Accepted  TLSv1  128 bits  ECDHE-ECDSA-AES128-SHA
    Accepted  TLSv1.1  256 bits  ECDHE-ECDSA-AES256-SHA
    Accepted  TLSv1.1  128 bits  ECDHE-ECDSA-AES128-SHA
    Accepted  TLSv1.2  256 bits  ECDHE-ECDSA-AES256-GCM-SHA384
    Accepted  TLSv1.2  256 bits  ECDHE-ECDSA-AES256-SHA384
    Accepted  TLSv1.2  256 bits  ECDHE-ECDSA-AES256-SHA
    Accepted  TLSv1.2  128 bits  ECDHE-ECDSA-AES128-GCM-SHA256
    Accepted  TLSv1.2  128 bits  ECDHE-ECDSA-AES128-SHA256
    Accepted  TLSv1.2  128 bits  ECDHE-ECDSA-AES128-SHA

  Prefered Server Cipher(s):
    TLSv1  128 bits  ECDHE-ECDSA-AES128-SHA
    TLSv1.1  128 bits  ECDHE-ECDSA-AES128-SHA
    TLSv1.2  128 bits  ECDHE-ECDSA-AES128-GCM-SHA256
于 2015-06-05T11:36:23.080 に答える
3

SSL暗号がcurlでどのように機能するかについて、オンラインで説明を見つけることができませんでした; ...

これは curl に固有のものではありません。SSL/TLS を使用すると、クライアントは使用する暗号を提供し、サーバーはこれらの中からサポートする暗号を選択します。デフォルトでは、クライアントは提供できるすべての暗号を提供しているわけではなく、特に弱いと見なされる暗号は提供していません。

curl に、試行中の暗号と、サーバーが受け入れる暗号を教えてもらう方法はありますか?

Wireshark を使用すると、クライアントが提供する暗号を確認できます。どの暗号が提供されているかを示すhttps://www.ssllabs.com/ssltest/viewMyClient.htmlに対してクライアントを確認することもできます 。または、テスト サーバーを作成しopenssl s_server -cipher ALL -wwwてクライアントを接続すると、クライアントとサーバーで共有される暗号が表示されます。

curl_setopt に渡す必要があるオプションは何ですか...

CURLOPT_SSL_CIPHER_LISTECDHE-ECDSA-AES128-SHAあなたのケースでは値がうまくいくかもしれません。ただし、この値は実際には、curl がどのようにコンパイルされたかによって異なります。Curl は、OpenSSL、NSS、SecureTransport、SChannel、GnuTLS などのさまざまな SSL/TLS バックエンドをサポートしており、正確な構文はバックエンドによって異なります。この設定例は、OpenSSL バックエンドに有効です。

暗号をこれに設定すると、他のサイトが壊れますか? ...

このセットにグローバルに制限する場合は、はい。グローバル設定の場合は、他の設定も追加することをお勧めしますHIGH:ECDHE-ECDSA-AES128-SHA:!aNULL。繰り返しになりますが、正確な構文は SSL/TLS バックエンドによって異なります。

于 2015-06-05T11:30:59.800 に答える
2

curl_setopt一緒に使うCURLOPT_SSL_CIPHER_LIST

于 2015-06-05T11:20:38.773 に答える