如何通过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 相关文章推荐
浅谈Python数据类型判断及列表脚本操作
Nov 04 Python
python爬虫_实现校园网自动重连脚本的教程
Apr 22 Python
python清除字符串中间空格的实例讲解
May 11 Python
Python pymongo模块常用操作分析
Sep 01 Python
一行代码让 Python 的运行速度提高100倍
Oct 08 Python
在numpy矩阵中令小于0的元素改为0的实例
Jan 26 Python
python+OpenCV实现车牌号码识别
Nov 08 Python
Python configparser模块配置文件过程解析
Mar 03 Python
python如何删除文件、目录
Jun 23 Python
python如何进入交互模式
Jul 06 Python
使用jupyter notebook运行python和R的步骤
Aug 13 Python
Python datetime 如何处理时区信息
Sep 02 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
php5中类的学习
2008/03/28 PHP
php设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
使用PHP遍历文件目录与清除目录中文件的实现详解
2013/06/24 PHP
Symfony2创建页面实例详解
2016/03/18 PHP
CL vs ForZe BO5 第三场 2.13
2021/03/10 DOTA
javascript 使td内容不换行不撑开
2012/11/29 Javascript
jquery的map与get方法详解
2013/11/04 Javascript
在myeclipse中如何加入jquery代码提示功能
2014/06/03 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
Highcharts 多个Y轴动态刷新数据的实现代码
2016/05/28 Javascript
AngularJS 面试题集锦
2016/09/06 Javascript
jquery文字填写自动高度的实现方法
2016/11/07 Javascript
微信小程序 共用变量值的实现
2017/07/12 Javascript
javascript填充默认头像方法
2018/02/22 Javascript
vant(ZanUi)结合async-validator实现表单验证的方法
2018/12/06 Javascript
Vue项目中使用flow做类型检测的方法
2020/03/18 Javascript
Js数组扁平化实现方法代码总汇
2020/11/11 Javascript
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
python通过pil为png图片填充上背景颜色的方法
2015/03/17 Python
web.py在SAE中的Session问题解决方法(使用mysql存储)
2015/06/24 Python
Python实现模拟时钟代码推荐
2015/11/08 Python
Python入门必须知道的11个知识点
2018/03/21 Python
python实现textrank关键词提取
2018/06/22 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
2020/03/09 Python
python 日志模块logging的使用场景及示例
2021/01/04 Python
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
英国二手iPhone、音乐、电影和游戏商店:musicMagpie
2018/10/26 全球购物
如何用Lucene索引数据库
2016/02/23 面试题
Ref与out有什么不同
2012/11/24 面试题
大二自我鉴定范文
2013/10/05 职场文书
单位成立周年感言
2014/01/26 职场文书
广告传媒专业应届生求职信
2014/03/01 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
上帝为你开了一扇窗之Tkinter常用函数详解
2021/06/02 Python
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android