В обновлении python 2.7.8 до 2.7.9 модуль ssl изменился с
_DEFAULT_CIPHERS = 'DEFAULT:!aNULL:!eNULL:!LOW:!EXPORT:!SSLv2'
к
_DEFAULT_CIPHERS = (
'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:'
'DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:ECDH+RC4:'
'DH+RC4:RSA+RC4:!aNULL:!eNULL:!MD5'
)
Я хотел бы знать, как это влияет на фактический "упорядоченный список предпочтений шифрования SSL", который используется при установлении соединений SSL/TLS с моими установками python в Windows.
Например, чтобы выяснить, что "упорядочил список привилегий SSL-шифрования", список расшифровки расширений, я обычно использовал бы командную строку openssl ciphers
(см. man-страница), например, с openssl v1.0.1k. Я вижу, что этот список шифрования по умолчанию для python 2.7.8 расширяется до:
$ openssl ciphers -v 'DEFAULT:!aNULL:!eNULL:!LOW:!EXPORT:!SSLv2'
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
SRP-DSS-AES-256-CBC-SHA SSLv3 Kx=SRP Au=DSS Enc=AES(256) Mac=SHA1
SRP-RSA-AES-256-CBC-SHA SSLv3 Kx=SRP Au=RSA Enc=AES(256) Mac=SHA1
...
snip!
Это отлично работает, когда в Linux, где python динамически загружает ту же библиотеку OpenSSL, что openssl ciphers
использует:
$ ldd /usr/lib/python2.7/lib-dynload/_ssl.x86_64-linux-gnu.so | grep libssl
libssl.so.1.0.0 => /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007ff75d6bf000)
$ ldd /usr/bin/openssl | grep libssl
libssl.so.1.0.0 => /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007fa48f0fe000)
Однако, в Windows сборка Python статически связывает библиотеку OpenSSL. Это означает, что команда openssl ciphers
не может мне помочь, потому что она использует другую версию библиотеки, которая может поддерживать разные шифры, чем библиотека, встроенная в python.
Я могу узнать, какая версия OpenSSL была использована для создания каждого из двух выпусков python:
$ python-2.7.8/python -c 'import ssl; print ssl.OPENSSL_VERSION'
OpenSSL 1.0.1h 5 Jun 2014
$ python-2.7.9/python -c 'import ssl; print ssl.OPENSSL_VERSION'
OpenSSL 1.0.1j 15 Oct 2014
Но даже если бы я смог найти и загрузить сборку командной строки openssl
для выпусков 1.0.1h и 1.0.1j, я не могу быть уверен, что они были скомпилированы с теми же параметрами, что и lib, встроенный в python, и из man page мы знаем, что
Некоторые скомпилированные версии OpenSSL могут не включать в себя все шифры, перечисленные здесь, потому что во время компиляции исключаются некоторые шифры.
Итак, есть ли способ получить модуль ssl python, чтобы дать мне вывод, подобный тому, что из команды openssl ciphers -v
?