Как добавить шифры в curl в php?

Я пытаюсь использовать 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, так что попробуйте переключить PKCS для FIPS» для меня совершенно непонятно, и поиск в Google будет объяснять только отдельные компоненты (обычно со ссылкой на 20-летние стандарты), а не то, как они связаны друг с другом.

  2. Есть ли способ, которым я могу заставить curl сказать мне, какие шифры он пытается и какие шифры будет принимать сервер? Я пытался найти сервер на ssllabs, но кажется, что сервер принимает все шифры, чего, очевидно, нет.

  3. Какие опции мне нужно передать curl_setopt, чтобы мой php-скрипт мог подключиться к этому серверу?

  4. Если я установлю шифр на это, это сломает другие сайты? Есть ли что-то, что я могу сделать, чтобы curl мог подключаться ко всем защищенным сайтам, или мне нужно вручную перебирать разные шифры, пытаясь каждый из них выяснить, какой из них работает?

3

Решение

  1. Почему это происходит? Я не смог найти объяснение в Интернете о том, как шифры ssl работают в curl

Это зависит от нескольких вещей. Клиентские и серверные библиотеки, клиентские и серверные конфигурации и т. Д. Вам необходимо предоставить более подробную информацию.


  1. Есть ли способ, которым я могу заставить curl сказать мне, какие шифры

Используйте правильный инструмент для работы. В этом случае его обновленный sslscan.


  1. Какие опции мне нужно передать curl_setopt, чтобы мой php-скрипт мог подключиться к этому серверу?

CURLOPT_SSL_CIPHER_LIST,


  1. Если я установлю шифр на это, это сломает другие сайты?

Может быть. Это зависит от конфигурации конкретного сайта.

В идеале вы выбираете 12 или 16 наборов шифров, которые одобряете, а затем используете их вместо одного. 12 или 16 охватывает большинство сайтов, которые вы встречаете в Интернете.

Вот список, который я обычно использую. Это из Какие комплекты шифров включить для сокета SSL?:

  • 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

Я хотел бы бросить TLS_RSA_* комплекты шифров, потому что они являются ключевым транспортом, но они нужны мне для тех старых серверов IIS, с которыми я сталкиваюсь.

Как видно из результатов сканирования ниже, этот список пересекается со списком сервера.


Обратите внимание, что вы не указываете, скажем, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, Скорее в OpenSSL, вы указываете имя OpenSSL ECDHE-ECDSA-AES256-SHA384 для люкса. Вы можете найти имена OpenSSL на документация для шифров openssl.

С OpenSSL вы также можете использовать строку "HIGH:!aNULL:!MD5:!RC4:!PSK:!SRP", Это даст вам около 40 или 50, которые являются достаточно хорошим выбором.

Вы можете запустить команду OpenSSL ciphers, чтобы увидеть, что это за список:

$ 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
...

Вы можете использовать обновленную версию sslscan чтобы определить, какие наборы шифров доступны:

$ 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
4

Другие решения

Я не смог найти объяснение в Интернете о том, как шифры ssl работают в curl; …

Это не относится к скручиванию. С SSL / TLS клиент предлагает шифры, которые он желает использовать, и сервер выбирает из них шифр, который он также поддерживает. По умолчанию клиенты не предлагают все шифры, которые они могут, особенно не шифры, которые считаются слабыми.

Есть ли способ, которым я могу заставить curl сказать мне, какие шифры он пытается и какие шифры будет принимать сервер?

С Wireshark вы можете увидеть, какие шифры предлагаются клиентом. Вы также можете проверить свой клиент против
https://www.ssllabs.com/ssltest/viewMyClient.html который показывает, какие шифры предлагаются. Или создайте тестовый сервер с openssl s_server -cipher ALL -www и подключите клиент к нему, он покажет шифры, совместно используемые клиентом и сервером.

Какие параметры мне нужно передать curl_setopt …

CURLOPT_SSL_CIPHER_LIST со значением ECDHE-ECDSA-AES128-SHA может работать в вашем случае. Но это значение на самом деле зависит от того, как ваш локон был скомпилирован. Curl поддерживает различные бэкэнды SSL / TLS, такие как OpenSSL, NSS, SecureTransport, SChannel, GnuTLS, и точный синтаксис зависит от бэкенда. Этот пример настройки действителен для бэкэнда OpenSSL.

Если я установлю шифр на это, это сломает другие сайты? …

Если вы ограничиваете себя глобально этим набором, тогда да. Для глобальных настроек лучше добавить и других, т. Е. HIGH:ECDHE-ECDSA-AES128-SHA:!aNULL, Ошибка еще раз, точный синтаксис зависит от бэкэнда SSL / TLS.

3

использование curl_setopt с CURLOPT_SSL_CIPHER_LIST

2
По вопросам рекламы [email protected]