1、安装python的SSL插件pyOpenSSL

pip install pyopenssl

2、安装OpenSSL工具包

sudo apt-get install openssl

sudo apt-get install libssl-dev

OpenSSL命令:/usr/bin/openssl.

配置文件:usr/lib/ssl/*

加密信道的ssl通信

3、生成SSL密钥和证书

生成CA证书ca.crt,服务器密钥文件server.key,和服务器证书server.crt

# 生成CA密钥
openssl genrsa -out ca.key 2048 # 生成CA证书,本过程还会要求输入证书的所在地,公司等
openssl req -x509 -new -nodes -key ca.key -days 365 -out ca.crt # 生成服务器证书RSA的密钥对
openssl genrsa -out server.key 2048 # 生成服务端证书CSR,本过程会要求输入证书所在地,公司等
openssl req -new -key server.key -out server.csr # 生成服务器端证书 ca.crt
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365

上述命令生成服务器端证书时,必须在common nanme(CN)字段中如实输入站点访问地址,比如定义CN=www.mysite.com,如果通过ip访问就设ip地址

服务端的代码如下

from twisted.internet import ssl,reactor
from twisted.internet.protocol import Factory,Protocol class EchoServer(Protocol):
def dataReceived(self, data):
self.transport.write(data) if __name__ == '__main__':
factory = Factory()
factory.protocol = EchoServer
reactor.listenSSL(8007,factory,ssl.DefaultOpenSSLContextFactory('../ssl/server.key','../ssl/server.crt')) # 配置密钥文件和证书文件路径
reactor.run()

客户端方面:

from twisted.internet import ssl,reactor
from twisted.internet.protocol import ClientFactory if __name__ == '__main__':
factory = ClientFactory()
reactor.connectSSL('192.168.1.10',8000,factory,ssl.ClientContextFactory())# SSL连接
reactor.run()

这样TCP服务器和客户端就可以密文通信了

认证客户端身份的SSL通信

在应用中除了需要保证通信的私密性服务器还需要防止伪造的客户端与服务器通信,所以需要改造TCP客户端,

客户端身份通过客户端证书进行标识

from twisted.internet import ssl,reactor
from twisted.internet.protocol import ClientFactory class MySSLContext(ssl.ClientContextFactory):
def getContext(self):
self.method = ssl.SSL.SSLv3_METHOD #SSL协议版本
ctx = ssl.ClientContextFactory.getContext(self)
ctx.use_certificate_file('../ssl/client.crt') #客户端证书
ctx.use_privatekey_file('../ssl/client.key') # 客户端密钥
return ctx if __name__ == '__main__':
factory = ClientFactory()
reactor.connectSSL('192.168.1.10',8000,factory,MySSLContext())# SSL连接
reactor.run()

服务器端需要根据客户端提交的证书验证是否允许其与自己通信

from twisted.internet import ssl,reactor
from twisted.internet.protocol import Factory,Protocol
from OpenSSL import SSL class Echo(Protocol):
def dataReceived(self, data):
self.transport.write(data) def verifyCallback(connection,x509,errnum,errdepth,ok):
print("_verify(ok =%d):" % ok) # CA是否匹配
print('subject:',x509.get_subject()) # 客户端证书subject
print('issuer:',x509.get_issuer()) # 客户端证书发行方
print('errnum %s,errdepth %d' % (errnum,errdepth)) # 错误代码
return True # 是否允许通信 if __name__ == '__main__':
factory = Factory()
factory.protocol = Echo
myContextFactory = ssl.DefaultOpenSSLContextFactory('../ssl/server.key','../ssl/server.crt') # 服务器端的密钥和证书文件
ctx = myContextFactory.getContext()
ctx.set_verify(ssl.SSL.VERIFY_PEER | ssl.SSL.VERIFY_FAIL_IF_NO_PEER_CERT,verifyCallback)
ctx.load_verify_locations('../ssl/ca.crt') # 客户端证书的发行CA reactor.listenSSL(8007,factory,myContextFactory) # 配置密钥文件和证书文件路径
reactor.run()

Twisted 安全信道的更多相关文章

  1. Python自动化运维之15、网络编程之socket、socketserver、select、twisted

    一.TCP/IP相关知识 TCP/UDP提供进程地址,两个协议互不干扰的独自的协议       TCP :Transmission Control Protocol 传输控制协议,面向连接的协议,通信 ...

  2. Mina、Netty、Twisted一起学(八):HTTP服务器

    HTTP协议应该是目前使用最多的应用层协议了,用浏览器打开一个网站就是使用HTTP协议进行数据传输. HTTP协议也是基于TCP协议,所以也有服务器和客户端.HTTP客户端一般是浏览器,当然还有可能是 ...

  3. Twisted随笔

    学习了socket后决定尝试使用框架,目标锁定了Twisted. 什么是Twisted? twisted是一个用python语言写的事件驱动的网络框架,他支持很多种协议,包括UDP,TCP,TLS和其 ...

  4. Python 安装Twisted 提示python version 2.7 required,which was not found in the registry

    由于我安装Python64位的,下载后没注册,安装Twisted时老提示“python version 2.7 required,which was not found in the registry ...

  5. Python - twisted web 入门学习之一

    原文地址:http://zhouzhk.iteye.com/blog/765884 python的twisted框架中带了一个web server: twisted web.现在看看怎么用. 一)准备 ...

  6. 【科普】为什么WiFi自动信道选到的信道多数在1/6/11

    http://bbs.hiwifi.com/thread-4126-1-1.html 论坛上不少朋友很困惑,为什么小极的自动信道选择选到的信道只会在1.6.11这三个信道呢?WiFi不是一共有10几个 ...

  7. BLE 信道

    广播信道频点的选择原则上是为了远离诸如WiFi接入点的严重干扰.这些接入点通常选择802.11信道中的3个:信道1.6.11.这几个信道的中心频率分别为2412/2437/2462,宽度大概为20MH ...

  8. Twisted

    Twisted是一个事件驱动的网络框架,其中包含了诸多功能,例如网络协议,线程,数据库管理,网络操作,电子邮件等 事件驱动 一,注册事件 二,触发事件 自定义事件框架  event_fram.py # ...

  9. Mina、Netty、Twisted一起学(十):线程模型

    要想开发一个高性能的TCP服务器,熟悉所使用框架的线程模型非常重要.MINA.Netty.Twisted本身都是高性能的网络框架,如果再搭配上高效率的代码,才能实现一个高大上的服务器.但是如果不了解它 ...

随机推荐

  1. docker进阶-搭建私有企业级镜像仓库Harbor

    为什么要搭建私有镜像仓库   对于一个刚刚接触Docker的人来说,官方的Docker hub是用于管理公共镜像.既然官方提供了镜像仓库我们为什么还要去自己搭建私有仓库呢?虽然也可以托管私有镜像.我们 ...

  2. Project入门学习

    Microsoft Office Project制定项目计划时,针对每项任务是可以分配具体的资源的,比如由某个人完成某项任务,或者把某项设备分配到某项任务,这样便于项目的管理和人员.设备的安排及有效利 ...

  3. [BZOJ4825][HNOI2017]单旋spaly

    BZOJ Luogu 题目太长了,就不放了. 题解 首先声明一点,无论是splay还是spaly,插入一个新的元素,都要rotate到根!所以说题目也算是给了一个错误示范吧. 我们发现把最值旋转到根并 ...

  4. Oracle定时任务小案例

    需求简述 一个数据表中包含此数据的录入时间,此数据的初始状态是有效,五天后系统自动置该数据的状态为无效. 方案 写一个存储过程,用于更新字段(改状态): 写一个job,用于定时执行存储过程: 方案逻辑 ...

  5. PHP 秒数 转时分秒 函数

    function secondsToHour($seconds){ if(intval($seconds) < 60) $tt ="00时00分".sprintf(" ...

  6. Mysql 忘记管理员密码更改

    对管理员设置密码 第一种方式: #mysqladmin -u root password 'new-password'; #mysqladmin -u root -h localhost passwo ...

  7. 【翻译】《向“弹跳球”演示程序添加新功能》 in MDN

    文章地址: https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/%E5%90%91%E2%80%9C%E5%BC%B9% ...

  8. 基于新浪SAE平台的微信开发

      自己的微信公众平台开发差不多了,欢迎关注试用哦,我会不定期在那里分享技术文章! 主要功能: 输入t+中文或者英文返回对应的英中翻译 输入[m]随机来首音乐听,建议在wifi下听 输入[ly+你的留 ...

  9. JavaIO 总结

    另外参考文章:http://www.ibm.com/developerworks/cn/java/j-lo-javaio/ 一. File类 file.createNewFile();file.del ...

  10. 数据库连接问题之:Caused by: java.sql.SQLException: Connections could not be acquired from the underlying database!

    要么是驱动问题(没加载到工程中去或者其他问题)要么是账号密码或者url或者driver写错 driver:com.mysql.jdbc.Driver url:jdbc:mysql://localhos ...