Twisted 安全信道
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 安全信道的更多相关文章
- Python自动化运维之15、网络编程之socket、socketserver、select、twisted
一.TCP/IP相关知识 TCP/UDP提供进程地址,两个协议互不干扰的独自的协议 TCP :Transmission Control Protocol 传输控制协议,面向连接的协议,通信 ...
- Mina、Netty、Twisted一起学(八):HTTP服务器
HTTP协议应该是目前使用最多的应用层协议了,用浏览器打开一个网站就是使用HTTP协议进行数据传输. HTTP协议也是基于TCP协议,所以也有服务器和客户端.HTTP客户端一般是浏览器,当然还有可能是 ...
- Twisted随笔
学习了socket后决定尝试使用框架,目标锁定了Twisted. 什么是Twisted? twisted是一个用python语言写的事件驱动的网络框架,他支持很多种协议,包括UDP,TCP,TLS和其 ...
- 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 ...
- Python - twisted web 入门学习之一
原文地址:http://zhouzhk.iteye.com/blog/765884 python的twisted框架中带了一个web server: twisted web.现在看看怎么用. 一)准备 ...
- 【科普】为什么WiFi自动信道选到的信道多数在1/6/11
http://bbs.hiwifi.com/thread-4126-1-1.html 论坛上不少朋友很困惑,为什么小极的自动信道选择选到的信道只会在1.6.11这三个信道呢?WiFi不是一共有10几个 ...
- BLE 信道
广播信道频点的选择原则上是为了远离诸如WiFi接入点的严重干扰.这些接入点通常选择802.11信道中的3个:信道1.6.11.这几个信道的中心频率分别为2412/2437/2462,宽度大概为20MH ...
- Twisted
Twisted是一个事件驱动的网络框架,其中包含了诸多功能,例如网络协议,线程,数据库管理,网络操作,电子邮件等 事件驱动 一,注册事件 二,触发事件 自定义事件框架 event_fram.py # ...
- Mina、Netty、Twisted一起学(十):线程模型
要想开发一个高性能的TCP服务器,熟悉所使用框架的线程模型非常重要.MINA.Netty.Twisted本身都是高性能的网络框架,如果再搭配上高效率的代码,才能实现一个高大上的服务器.但是如果不了解它 ...
随机推荐
- Redis总结(七)Redis运维常用命令
redis 服务器端命令 redis 127.0.0.1:6380> time ,显示服务器时间 , 时间戳(秒), 微秒数 1) "1375270361" 2) &quo ...
- [BZOJ2326] [HNOI2011] 数学作业 (矩阵乘法)
Description Input Output Sample Input Sample Output HINT Source Solution 递推式长这样:$f[n]=f[n-1]*10^k+n$ ...
- ------ Tor(洋葱路由器)匿名网络源码分析——主程序入口点(一)------
--------------------------------------------------------<概览> tor 的源码包可以从官网下载,可能需要预先利用其它FQ软件才能访 ...
- c#多线程同步之Semaphore
一提到Semaphore(信号量)的使用,还挺有意思的,它允许多个线程同时访问多个稀有资源,我立马想到银行的ATM机取钱的场景.看下面的代码: ); public static void StartT ...
- Python爬虫获取异步加载站点pexels并下载图片(Python爬虫实战3)
1. 异步加载爬虫 对于静态页面爬虫很容易获取到站点的数据内容,然而静态页面需要全量加载站点的所有数据,对于网站的访问和带宽是巨大的挑战,对于高并发和大访问访问量的站点来说,需要使用AJAX相关的技术 ...
- 解决Win10下_findnext()异常
在win10中,使用文件遍历函数_findnext会报0xC0000005错误 ,发生访问冲突错误 错误定位到ntdll.dll 原因: _findnext()第一个参数"路径句柄" ...
- Problem : 1202 ( The calculation of GPA )
Losers always whine about their best. Winners go home and fuck the prom queen. 很操蛋却非常有意思的题目,注意变量的类型, ...
- 问题排查:The requested URL /test/index.jsp was not found on this server
问题描述 添加一个新模块,部署在服务器上.服务器上还部署有其他模块且访问正常,新模块和其他模块共用同一个域名.服务部署之后,请求如下: http://my.domain.com/test/index. ...
- Linux系统命令归纳
常规操作命令: # netstat -atunpl |egrep "mysql|nginx"# vimdiff php.ini*# runlevel# rpm -e httpd - ...
- 吐槽net下没有靠谱的FastDFS的sdk之使用thrift实现JAVA和C#互通
事情是这样的,在一个新项目中引入了fastdfs,用这玩意做一些小数据的存储还是很方便的,然后在nuget上就找一个对接FastDFS的sdk,如下图: 一眼就看到了这个top1的sdk,应该会比较靠 ...