对于Mac OS X上的Python应用程序,我需要设置一个带有TLSv1.2,Forward Secrecy和没有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客户端无法连接到我的服务器,错误为“无共享密码” . 那么,我做错了什么?

Note :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)

---

Alternative: 如果我将密码列表更改为

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

它可以工作,浏览器和openssl客户端能够在协议TLSv1.2上使用密码'AES256-GCM-SHA384' Build 安全连接,但它不是ECDHE密码(因此没有前向保密) .

EDIT correct answer:

对于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)

用python创建及使用一个tls_Python使用TLSv1.2和Forward Secrecy粘贴SSL服务器相关推荐

  1. python创建只包含一个元素的元组时_Python 创建包含列表的元组

    "可变"的tuple 前面我们看到了tuple一旦创建就不能修改.现在,我们来看一个"可变"的tuple: >>> t = ('a', 'b' ...

  2. Python创建并且打开一个mat文件

    import scipy.io as sio #创建一个mat文件 x = [1, 2, 3] y = [4, 5, 6] z = [7, 8, 9] sio.savemat('saveddata.m ...

  3. python创建只包含一个元素的元组时_Python中声明只包含一个元素的元组数据方法...

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  4. 【LINUX】——linux如何使用Python创建一个web服务

    问:linux如何使用Python创建一个web服务? 答:一句话,Python! 一句代码: /usr/local/bin/python -m SimpleHTTPServer 8686 > ...

  5. python简单代码演示效果-演示python如何创建和使用一个简单的元类的代码

    在做工程闲暇时间,将做工程过程比较重要的一些内容备份一下,如下内容段是关于演示python如何创建和使用一个简单的元类的内容,应该能对小伙伴们也有用途. #!/usr/bin/env python # ...

  6. python词云改颜色_使用Python创建一个与图像颜色匹配的词云

    原标题:使用Python创建一个与图像颜色匹配的词云 来自:https://www.linuxmi.com/ 我用Python造了一个词云.不过这次创建的是与图像颜色匹配的词云. 使用Python w ...

  7. python创建一个字符串_Python字符串基本操作

    一.任务描述 本实验任务主要对Python字符串进行一些基本操作,通过完成本实验任务,要求学生熟练掌握Python字符串的基本操作,并对Python字符串基本操作进行整理并填写工作任务报告. 二.任务 ...

  8. python创建一个空列表alist_【Python 1-7】Python手把手教程之——详解列表List

    列表 作者 | 弗拉德 来源 | 弗拉德(公众号:fulade_me) 列表,在其他语言中又被称为数组,是由一系列按特定顺序排列的元素组成.你可以创建包含字母表中所有字母.数字0~9或所有家庭成员姓名 ...

  9. python创建一个类初始化两个变量name、age_Python小白入门:第八讲||类

    Python 是一种面向对象的编程语言.在面向对象编程中,你编写表示现实世界中的事务和情景的类,并基于这些类来创建对象. 编写类时,你定义的一大类对象都有的通用行为.基于类创建对象时,每个对象都自动具 ...

  10. Python创建一个循环链表、双向循环链表

    循环链表与双向循环链表 循环链表 循环链表相较于单链表,将末尾结点的连接域指向了头结点,就类似于将播放器的顺序播放改成了列表循环 双向循环链表 双向链表相较于之前的链表多了上一节点连接域,在双向链表中 ...

最新文章

  1. 内存泄露、内存溢出以及解决方法
  2. .NET Core 下使用 RabbitMQ
  3. python3.8.0安装_Python3.8.0
  4. python中的替换函数_python:替换模块类中的函数
  5. Sphinx index.rst
  6. Windows Serer2003域升级到Windows Server2008R2域
  7. 两部门:解除蒙古国部分地区口蹄疫疫情禁令
  8. WindowsServer2008R2系统版本升级
  9. 经典软件项目源码汇总
  10. 9种常见的反爬虫策略思路
  11. 面试必备之反问面试官
  12. Photoshop 使用技巧
  13. Windows下安装Oracle数据库及遇到的问题解决方法(找不到WFMLRSVCApp.ear文件)
  14. java微信支付超时_Java语言:微信支付之关闭订单
  15. 学习周报20200105 | CS224N
  16. 成都玺讯——虾皮跨境电商卖家未来规划
  17. 【rk3399】AIO-3399J Linux_SDK Recovery按键无法进入Loader模式
  18. mysql grant select()_[MySQL] - MySQL的Grant命令
  19. 计算机毕业设计ssm工作室管理系统v186g系统+程序+源码+lw+远程部署
  20. 浏览器无法启动百度网盘应用的解决办法

热门文章

  1. python实现word自动化操作
  2. mem leak debug
  3. ROC曲线/AUC(全)
  4. 订单下单成功后如何等待支付成功
  5. windows无法更改密码解决办法
  6. JVM实战(二一): -Xss -Xms -Xmx -Xmn 参数设置
  7. 4399IT运维实习生面试经历
  8. python turtle图片保存_turtle绘图保存png,jpg等图片
  9. php正则表达式工具,正则表达式语法教程(含在线测试工具)
  10. Vmware、Virtuozoo、Virtual Server 、Xen四款虚拟机的性能比较