带有TLSv1.2和转发保密性的Python粘贴SSL服务器

大卫·B

对于Mac OS X上的Python应用程序,我需要设置一个具有TLSv1.2,正向保密和不带RC4密码的HTTPS服务器。使用Paste和pyOpenSSL,我编写了以下代码:

from paste import httpserver
from OpenSSL import SSL

context = SSL.Context(SSL.SSLv23_METHOD)
context.use_privatekey_file("/Path/to/my/private.key")
context.use_certificate_chain_file("/Path/to/my/chain-cert.pem")
context.set_options(SSL.OP_NO_SSLv2)
context.set_options(SSL.OP_NO_SSLv3)
context.set_options(SSL.OP_SINGLE_DH_USE)
context.set_cipher_list("EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:EDH+aRSA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4")
logger.debug("OPENSSL version: %s" % SSL.SSLeay_version(SSL.SSLEAY_VERSION))

httpserver.serve(app_logged, host=http_host, port=http_port, server_version=server_version, ssl_context=context, use_threadpool=True, threadpool_workers=15, request_queue_size=5)

但是Safari,Chrome和OpenSSL客户端无法连接到我的服务器,并显示错误“无共享密码”。那么,我做错了什么?

注意:Python(2.7.6)和OpenSSL(0.9.8)的默认OS X版本与TLSv1.2不兼容,因此我不得不从源代码编译OpenSSL 1.0.2和Python 2.7.10。

如果我检查我的OpenSSL密码列表,它会给我以下信息:

$ /usr/local/bin/openssl ciphers -V 'EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:EDH+aRSA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4'
0xC0,0x2C - ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
0xC0,0x2B - ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(128) Mac=AEAD
0xC0,0x30 - ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD
0xC0,0x24 - ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA384
0xC0,0x23 - ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA256
0xC0,0x28 - ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA384
0xC0,0x27 - ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA256
0xC0,0x14 - ECDHE-RSA-AES256-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA1
0xC0,0x0A - ECDHE-ECDSA-AES256-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA1
0xC0,0x13 - ECDHE-RSA-AES128-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA1
0xC0,0x09 - ECDHE-ECDSA-AES128-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA1
0x00,0x9F - DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(256) Mac=AEAD
0x00,0x6B - DHE-RSA-AES256-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA256
0x00,0x39 - DHE-RSA-AES256-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA1
0x00,0x88 - DHE-RSA-CAMELLIA256-SHA SSLv3 Kx=DH       Au=RSA  Enc=Camellia(256) Mac=SHA1
0x00,0x9E - DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(128) Mac=AEAD
0x00,0x67 - DHE-RSA-AES128-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA256
0x00,0x33 - DHE-RSA-AES128-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA1
0x00,0x9A - DHE-RSA-SEED-SHA        SSLv3 Kx=DH       Au=RSA  Enc=SEED(128) Mac=SHA1
0x00,0x45 - DHE-RSA-CAMELLIA128-SHA SSLv3 Kx=DH       Au=RSA  Enc=Camellia(128) Mac=SHA1

而且我知道Safari 8与密码“ ECDHE-RSA-AES128-SHA256”兼容,那么为什么会有“无共享密码”错误?

$ /usr/local/bin/openssl s_client -connect 192.168.0.17:4443 -tls1_2
CONNECTED(00000003)
140735274361680:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:s3_pkt.c:1472:SSL alert number 40
140735274361680:error:1409E0E5:SSL routines:ssl3_write_bytes:ssl handshake failure:s3_pkt.c:656:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol  : TLSv1.2
Cipher    : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
Key-Arg   : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1439975452
Timeout   : 7200 (sec)
Verify return code: 0 (ok)
---

替代方法:如果我将密码列表更改为

context.set_cipher_list("HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:@STRENGTH")

它可以正常工作,浏览器和openssl客户端都能够与基于协议TLSv1.2的密码“ AES256-GCM-SHA384”建立安全连接,但它不是ECDHE密码(因此没有前向保密性)。

编辑正确答案:

对于DH密码,您需要使用PEM格式的DH参数文件,可以使用以下命令生成一个:

$ /usr/local/bin/openssl dhparam 2048 -out dhparams.pem

对于ECDHE密码,您将需要为SSL上下文设置椭圆曲线。您可以使用pyOpenSSL检索系统上的可用曲线:

OpenSSL.crypto.get_elliptic_curves()

这给了我们正确的以下python代码:

from paste import httpserver
from OpenSSL import SSL
from OpenSSL import crypto

context = SSL.Context(SSL.SSLv23_METHOD)
context.use_privatekey_file("/Path/to/my/private.key")
context.use_certificate_chain_file("/Path/to/my/chain-cert.pem")
context.load_tmp_dh("/Path/to/my/dhparams.pem")
context.set_tmp_ecdh(crypto.get_elliptic_curve("prime256v1"))
context.set_options(SSL.OP_NO_SSLv2)
context.set_options(SSL.OP_NO_SSLv3)
context.set_options(SSL.OP_SINGLE_DH_USE)
context.set_cipher_list("EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:EDH+aRSA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4")
logger.debug("OPENSSL version: %s" % SSL.SSLeay_version(SSL.SSLEAY_VERSION))

httpserver.serve(app_logged, host=http_host, port=http_port, server_version=server_version, ssl_context=context, use_threadpool=True, threadpool_workers=15, request_queue_size=5)
斯蒂芬·乌尔里希(Steffen Ullrich)

要支持DH密码(DHE-RSA -...),您需要具有DH params文件并指定它:

 context.load_tmp_dh("dhparams.pem")

要创建此类文件,您可以使用OpenSSL

 openssl dhparam -out dhparams.pem 2048

要支持ECDH密码,您需要指定应使用的曲线。我没有支持它的pyOpenSSL版本,但是根据文档,它应该是

context.set_tmp_ecdh( OpenSSL.crypto.get_elliptic_curve( "prime256v1" ))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

curl --tlsv1和--tlsv1.0之间有区别吗?

来自分类Dev

使用C#的SSL / TLSV1连接

来自分类Dev

Python 3.4-仅使用TLSv1连接到imap服务器

来自分类Dev

RECV TLSv1警报:致命,handshake_failure-“ hello服务器”之前,客户端ssl失败

来自分类Dev

openssl / curl错误:SSL23_GET_SERVER_HELLO:tlsv1警报内部错误

来自分类Dev

SSL23_GET_SERVER_HELLO:tlsv1警报内部错误

来自分类Dev

Spring 集成:强制 Web 服务出站网关使用 TLSv1

来自分类Dev

“无法获得本地发行者证书”和“ tlsv1无法识别的名称”

来自分类Dev

检查连接是否为TLSv1和SSLv3(SSL_CIPHER_description / SSL_CIPHER_get_name)

来自分类Dev

如果OpenSSL仅支持SSLv2和SSLv3,为什么我可以连接TLSv1?

来自分类Dev

curl:(35)错误:14077438:SSL例程:SSL23_GET_SERVER_HELLO:tlsv1警报内部错误

来自分类Dev

将CasperJS与“ --ssl-protocol = tlsv1 --engine = slimerjs”一起使用时的未知选项

来自分类Dev

带有HTTP / 2和TLSv1.3的Tomcat

来自分类Dev

正在使用urllib下载HTTPS页面,错误:14077438:SSL例程:SSL23_GET_SERVER_HELLO:tlsv1警告内部错误

来自分类Dev

SSL_CTX_set_options()是OpenSSL民间使用编译时OPENSSL_NO_HEARTBEATS禁用TLSv1心跳的原因吗?

来自分类Dev

带有JDk8的TLSv2带有MQ8的密码套件?

来自分类Dev

Centos 6 libCurl TLSv1错误

来自分类Dev

无法在 Nginx 上禁用 TLSv1

来自分类Dev

具有OAuth2资源服务器和远程授权服务器的适应性

来自分类Dev

是否可以在1个IP地址上运行带有单独SSL证书的2台服务器?

来自分类Dev

握手期间“ tlsv1警报内部错误”

来自分类Dev

node.js中的“ tlsv1警报未知ca”

来自分类Dev

TLSv1连接失败,握手失败

来自分类Dev

日志显示 TLSv1 而不是 SSLv3

来自分类Dev

带有Google Auth的Android安全性和RESTFUL服务器(Firebase)

来自分类Dev

具有会话处理功能的Python 2 SSL xmlrpc服务器

来自分类Dev

带有 Python 客户端的 Qt C++ SSL/TLS 服务器

来自分类Dev

AttributeError:“模块”对象在Python 2.7.11中没有属性“ PROTOCOL_TLSv1_2”

来自分类Dev

如何使用 scp 通过带有 ssh 转发的堡垒从服务器获取文件?

Related 相关文章

  1. 1

    curl --tlsv1和--tlsv1.0之间有区别吗?

  2. 2

    使用C#的SSL / TLSV1连接

  3. 3

    Python 3.4-仅使用TLSv1连接到imap服务器

  4. 4

    RECV TLSv1警报:致命,handshake_failure-“ hello服务器”之前,客户端ssl失败

  5. 5

    openssl / curl错误:SSL23_GET_SERVER_HELLO:tlsv1警报内部错误

  6. 6

    SSL23_GET_SERVER_HELLO:tlsv1警报内部错误

  7. 7

    Spring 集成:强制 Web 服务出站网关使用 TLSv1

  8. 8

    “无法获得本地发行者证书”和“ tlsv1无法识别的名称”

  9. 9

    检查连接是否为TLSv1和SSLv3(SSL_CIPHER_description / SSL_CIPHER_get_name)

  10. 10

    如果OpenSSL仅支持SSLv2和SSLv3,为什么我可以连接TLSv1?

  11. 11

    curl:(35)错误:14077438:SSL例程:SSL23_GET_SERVER_HELLO:tlsv1警报内部错误

  12. 12

    将CasperJS与“ --ssl-protocol = tlsv1 --engine = slimerjs”一起使用时的未知选项

  13. 13

    带有HTTP / 2和TLSv1.3的Tomcat

  14. 14

    正在使用urllib下载HTTPS页面,错误:14077438:SSL例程:SSL23_GET_SERVER_HELLO:tlsv1警告内部错误

  15. 15

    SSL_CTX_set_options()是OpenSSL民间使用编译时OPENSSL_NO_HEARTBEATS禁用TLSv1心跳的原因吗?

  16. 16

    带有JDk8的TLSv2带有MQ8的密码套件?

  17. 17

    Centos 6 libCurl TLSv1错误

  18. 18

    无法在 Nginx 上禁用 TLSv1

  19. 19

    具有OAuth2资源服务器和远程授权服务器的适应性

  20. 20

    是否可以在1个IP地址上运行带有单独SSL证书的2台服务器?

  21. 21

    握手期间“ tlsv1警报内部错误”

  22. 22

    node.js中的“ tlsv1警报未知ca”

  23. 23

    TLSv1连接失败,握手失败

  24. 24

    日志显示 TLSv1 而不是 SSLv3

  25. 25

    带有Google Auth的Android安全性和RESTFUL服务器(Firebase)

  26. 26

    具有会话处理功能的Python 2 SSL xmlrpc服务器

  27. 27

    带有 Python 客户端的 Qt C++ SSL/TLS 服务器

  28. 28

    AttributeError:“模块”对象在Python 2.7.11中没有属性“ PROTOCOL_TLSv1_2”

  29. 29

    如何使用 scp 通过带有 ssh 转发的堡垒从服务器获取文件?

热门标签

归档