Я пытаюсь использовать 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
Так что мои вопросы
Почему это происходит? Я не смог найти объяснения в Интернете о том, как шифры ssl работают в curl; кажется, что каждая страница написана с предположением, что читатель уже является экспертом в этой области — к сожалению, предложение типа «вы, вероятно, используете NSS, так что попробуйте переключить PKCS для FIPS» для меня совершенно непонятно, и поиск в Google будет объяснять только отдельные компоненты (обычно со ссылкой на 20-летние стандарты), а не то, как они связаны друг с другом.
Есть ли способ, которым я могу заставить curl сказать мне, какие шифры он пытается и какие шифры будет принимать сервер? Я пытался найти сервер на ssllabs, но кажется, что сервер принимает все шифры, чего, очевидно, нет.
Какие опции мне нужно передать curl_setopt, чтобы мой php-скрипт мог подключиться к этому серверу?
Если я установлю шифр на это, это сломает другие сайты? Есть ли что-то, что я могу сделать, чтобы curl мог подключаться ко всем защищенным сайтам, или мне нужно вручную перебирать разные шифры, пытаясь каждый из них выяснить, какой из них работает?
- Почему это происходит? Я не смог найти объяснение в Интернете о том, как шифры ssl работают в curl
Это зависит от нескольких вещей. Клиентские и серверные библиотеки, клиентские и серверные конфигурации и т. Д. Вам необходимо предоставить более подробную информацию.
- Есть ли способ, которым я могу заставить curl сказать мне, какие шифры
Используйте правильный инструмент для работы. В этом случае его обновленный sslscan
.
- Какие опции мне нужно передать curl_setopt, чтобы мой php-скрипт мог подключиться к этому серверу?
CURLOPT_SSL_CIPHER_LIST
,
- Если я установлю шифр на это, это сломает другие сайты?
Может быть. Это зависит от конфигурации конкретного сайта.
В идеале вы выбираете 12 или 16 наборов шифров, которые одобряете, а затем используете их вместо одного. 12 или 16 охватывает большинство сайтов, которые вы встречаете в Интернете.
Вот список, который я обычно использую. Это из Какие комплекты шифров включить для сокета SSL?:
Я хотел бы бросить 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
Я не смог найти объяснение в Интернете о том, как шифры 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.
использование curl_setopt
с CURLOPT_SSL_CIPHER_LIST