如何通过Python3和ssl实现加密通信功能


Posted in Python onMay 09, 2020

一、说明

1. python标准库ssl可实现加密通信

2. ssl库底层使用openssl,做了面向对像化改造和简化,但还是可以明显看出openssl的痕迹

3. 本文先给出python实现的socket通信,在此基础上再给出ssl通信以便读者更方便地看到socket和ssl在python编程中的区别

4. 说到ssl很多人都会想到https,但本质而言ssl是在传输层和应用层之间新插入的一个层,根据不同层无关原则ssl和https并没有任何绑定关系,ssl之上完全可以是其他任何应用层协议(比如pop/imap/telnet等等)

二、程序实现

2.1 socket通信实现

客户端代码:

import socket

class client_class:
 def send_hello(self):
  # 与服务端建立连接
  client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  client_socket.connect(('127.0.0.1',9999))

  # 向服务端发送消息
  msg = "do i connect with server ?".encode("utf-8")
  client_socket.send(msg)
  # 接收服务端返回的消息
  msg = client_socket.recv(1024).decode('utf-8')
  print(f"receive msg from server : {msg}")
  client_socket.close()

if __name__ == "__main__":
 client = client_class()
 client.send_hello()

服务端代码:

import socket

class server_class :
 def build_listen(self):
  # 监听端口
  server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  server_socket.bind(('127.0.0.1',9999))
  server_socket.listen(5)

  while True:
   # 接收客户端连接
   client_socket, addr = server_socket.accept()
   # 接收客户端信息
   msg = client_socket.recv(1024).decode("utf-8")
   print(f"receive msg from client {addr}:{msg}")
   # 向客户端发送信息
   msg = f"yes , you have client_socketect with server.\r\n".encode("utf-8")
   client_socket.send(msg)
   client_socket.close()

if __name__ == "__main__":
 server = server_class()
 server.build_listen()

2.2 ssl通信实现

客户端代码:

import socket
import ssl

class client_ssl:
 def send_hello(self,):
  # 生成SSL上下文
  context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
  # 加载信任根证书
  context.load_verify_locations('cert/ca.crt')

  # 与服务端建立socket连接
  with socket.create_connection(('127.0.0.1', 9443)) as sock:
   # 将socket打包成SSL socket
   # 一定要注意的是这里的server_hostname不是指服务端IP,而是指服务端证书中设置的CN,我这里正好设置成127.0.1而已
   with context.wrap_socket(sock, server_hostname='127.0.0.1') as ssock:
    # 向服务端发送信息
    msg = "do i connect with server ?".encode("utf-8")
    ssock.send(msg)
    # 接收服务端返回的信息
    msg = ssock.recv(1024).decode("utf-8")
    print(f"receive msg from server : {msg}")
    ssock.close()

if __name__ == "__main__":
 client = client_ssl()
 client.send_hello()

服务端代码:

import socket
import ssl

class server_ssl:
 def build_listen(self):
  # 生成SSL上下文
  context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
  # 加载服务器所用证书和私钥
  context.load_cert_chain('cert/server.crt', 'cert/server_rsa_private.pem.unsecure')

  # 监听端口
  with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
   sock.bind(('127.0.0.1', 9443))
   sock.listen(5)
   # 将socket打包成SSL socket
   with context.wrap_socket(sock, server_side=True) as ssock:
    while True:
     # 接收客户端连接
     client_socket, addr = ssock.accept()
     # 接收客户端信息
     msg = client_socket.recv(1024).decode("utf-8")
     print(f"receive msg from client {addr}:{msg}")
     # 向客户端发送信息
     msg = f"yes , you have client_socketect with server.\r\n".encode("utf-8")
     client_socket.send(msg)
     client_socket.close()

if __name__ == "__main__":
 server = server_ssl()
 server.build_listen()

三、运行结果

当前项目结构如图所示,证书生成可参考:openssl实现双向认证教程

如何通过Python3和ssl实现加密通信功能

3.1 socket通信运行结果

客户端:

如何通过Python3和ssl实现加密通信功能

服务端:

如何通过Python3和ssl实现加密通信功能

3.2 ssl通信运行结果

客户端:

如何通过Python3和ssl实现加密通信功能

服务端:

如何通过Python3和ssl实现加密通信功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用django-suit为django 1.7 admin后台添加模板
Nov 18 Python
在Mac OS上使用mod_wsgi连接Python与Apache服务器
Dec 24 Python
python 读取excel文件生成sql文件实例详解
May 12 Python
Python的语言类型(详解)
Jun 24 Python
最近Python有点火? 给你7个学习它的理由!
Jun 26 Python
对python 各种删除文件失败的处理方式分享
Apr 24 Python
pycharm 在windows上编辑代码用linux执行配置的方法
Oct 27 Python
Python 使用type来定义类的实现
Nov 19 Python
Python代码块及缓存机制原理详解
Dec 13 Python
python通过matplotlib生成复合饼图
Feb 06 Python
基于Python和openCV实现图像的全景拼接详细步骤
Oct 05 Python
Python中的 No Module named ***问题及解决
Jul 23 Python
详解Django配置JWT认证方式
May 09 #Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
May 08 #Python
win10从零安装配置pytorch全过程图文详解
May 08 #Python
Python reduce函数作用及实例解析
May 08 #Python
Python使用sqlite3模块内置数据库
May 07 #Python
Python打印特殊符号及对应编码解析
May 07 #Python
vscode写python时的代码错误提醒和自动格式化的方法
May 07 #Python
You might like
基于mysql的bbs设计(一)
2006/10/09 PHP
php url路由入门实例
2014/04/23 PHP
php和js实现根据子网掩码和ip计算子网功能示例
2019/11/09 PHP
快速保存网页中所有图片的方法
2006/06/23 Javascript
js 获取Listbox选择的值的代码
2010/04/15 Javascript
Chrome中模态对话框showModalDialog返回值问题的解决方法
2010/05/25 Javascript
jQuery-ui中自动完成实现方法
2010/06/10 Javascript
浅析JavaScript访问对象属性和方法及区别
2015/11/16 Javascript
js从外部获取图片的实现方法
2016/08/05 Javascript
js动态生成form 并用ajax方式提交的实现方法
2016/09/09 Javascript
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
JS实现全屏的四种写法
2016/12/30 Javascript
node.js中使用Export和Import的方法
2017/09/18 Javascript
jquery+ajaxform+springboot控件实现数据更新功能
2018/01/22 jQuery
基于datepicker定义自己的angular时间组件的示例
2018/03/14 Javascript
JS实现计算小于非负数n的素数的数量算法示例
2019/02/26 Javascript
js实现弹幕飞机效果
2020/08/27 Javascript
在vue中配置不同的代理同时访问不同的后台操作
2020/09/11 Javascript
[07:08]2014DOTA2西雅图国际邀请赛 小组赛7月11日TOPPLAY
2014/07/11 DOTA
教你如何在Django 1.6中正确使用 Signal
2014/06/22 Python
利用Opencv中Houghline方法实现直线检测
2018/02/11 Python
python多维数组切片方法
2018/04/13 Python
python 画三维图像 曲面图和散点图的示例
2018/12/29 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
在linux系统下安装python librtmp包的实现方法
2019/07/22 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
Python实现自动访问网页的例子
2020/02/21 Python
Python中bisect的用法及示例详解
2020/07/20 Python
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2014/07/21 面试题
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
教育课题研究自我鉴定范文
2013/12/28 职场文书
学生安全责任书
2014/04/15 职场文书
涨价通知
2015/04/23 职场文书
HTML速写之Emmet语法规则的实现
2021/04/07 HTML / CSS
Python中的socket网络模块介绍
2022/07/23 Python