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. JQuery移动动画实现点击按钮切换图片--JQuery基础

    直接贴源码了哈,这些都是自己总结的……汗水几何?希望能帮到大家. <%@ Page Language="C#" AutoEventWireup="true" ...

  2. RobotFramework自动化测试框架-DatabaseLibrary库的使用(对数据库的操作)

    在自动化过程中,我们经常需要连接不同的数据库,并且对数据库进行很多不同的操作,RobotFramework中,提供了DatabaseLibrary这个库来操作数据库,我们可以按照官网中的说明来安装Da ...

  3. iOS学习——自动定位

    最近在项目中需要做自动定位功能,就是你在参加会议通过扫描二维码签到的时候自动定位并将你的定位信息在签到中上传,这样可以避免我们进行假签到.在这个功能中,主要用到的是系统自带的定位模块,首先我们是需要配 ...

  4. UVA10294 Arif in Dhaka (群论,Polya定理)

    UVA10294 Arif in Dhaka (群论,Polya定理) 题意 : 给你一个长为\(n\)的项链和手镯,每个珠子有\(m\)种颜色. 两个手镯定义为相同,即它们通过翻转和旋转得到一样的手 ...

  5. [BZOJ4291] [PA2015] Kieszonkowe

    Description 给定n个数,请从中选出若干个数,使得总和为偶数,请最大化这个总和.  Input 第一行包含一个正整数n(1<=n<=1000000). 第二行包含n个正整数a_1 ...

  6. js 实现table每列可左右拖动改变列宽度 【转载】

    <!DOCTYPE HTML> <html> <head> <meta charset="gbk"> <title>ta ...

  7. 动态增加表单元素并获取元素的text和value提交

    以上是效果图 需求是这样的: 专家设置好条件,然后设备检测到达到相应的条件之后,设备发出提醒给用户. 这就需要专家设置好能看懂的条件之后,然后把给专家看的,正常人能看懂的条件和发送的设备的,设备能够识 ...

  8. Java 对IP请求进行限流.

    高并发系统下, 有三把利器 缓存 降级 限流. 缓存: 将常用数据缓存起来, 减少数据库或者磁盘IO 降级: 保护核心系统, 降低非核心业务请求响应 限流: 在某一个时间窗口内对请求进行限速, 保护系 ...

  9. 深入java虚拟机学习 -- 类的加载机制(四)

    类加载的命名空间 每个类加载器都有自己的命名空间,命名空间由所有以此加载器为初始类加载器的类组成,不同命名空间的两个类是不可见的,但只要得到类所对应的Class对象的refrence(反射),还是可以 ...

  10. DevExpress中GridControl自定义汇总列值(有选择性的汇总)

    今天碰到有同事遇到这个方面的需求,贴一下吧. private void gvTop_CustomSummaryCalculate(object sender, CustomSummaryEventAr ...