如何通过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的源码浅要剖析Python的内存管理
Apr 16 Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
Jun 07 Python
python xml解析实例详解
Nov 14 Python
深入理解Python中的内置常量
May 20 Python
python format 格式化输出方法
Jul 16 Python
详解windows python3.7安装numpy问题的解决方法
Aug 13 Python
scrapy-redis的安装部署步骤讲解
Feb 27 Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 Python
Python调用C语言的实现
Jul 26 Python
Django 限制访问频率的思路详解
Dec 24 Python
Python虚拟环境库virtualenvwrapper安装及使用
Jun 17 Python
浅谈Python爬虫原理与数据抓取
Jul 21 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
9个实用的PHP代码片段分享
2015/01/22 PHP
JAVASCRIPT  THIS详解 面向对象
2009/03/25 Javascript
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
xmlhttp缓存清除的2种解决方法
2013/12/13 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
JS实现的用来对比两个用指定分隔符分割的字符串是否相同
2014/09/19 Javascript
js数组的基本操作(很全自己整理的)
2014/10/16 Javascript
jQuery给动态添加的元素绑定事件的方法
2015/03/09 Javascript
Jquery网页内滑动缓冲导航的实现代码
2015/04/05 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
2015/05/18 Javascript
js窗口关闭提示信息(兼容IE和firefox)
2015/10/23 Javascript
JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)
2016/02/26 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
使用Dropzone.js上传的示例代码
2017/10/10 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
2017/11/14 Javascript
使用Angular CLI进行Build(构建)和Serve详解
2018/03/24 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
使用apifm-wxapi快速开发小程序过程详解
2019/08/05 Javascript
vue实现文字加密功能
2019/09/27 Javascript
微信小程序自定义联系人弹窗
2020/05/26 Javascript
Python实现windows下模拟按键和鼠标点击的方法
2015/03/13 Python
Python里disconnect UDP套接字的方法
2015/04/23 Python
Python内置模块turtle绘图详解
2017/12/09 Python
Python3内置模块random随机方法小结
2019/07/13 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
tensorboard显示空白的解决
2020/02/15 Python
Tensorflow之梯度裁剪的实现示例
2020/03/08 Python
Python判断字符串是否为空和null方法实例
2020/04/26 Python
Python文件夹批处理操作代码实例
2020/07/21 Python
pycharm中使用request和Pytest进行接口测试的方法
2020/07/31 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
H5仿微信界面教程(一)
2017/07/05 HTML / CSS
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
留学推荐信怎么写
2014/01/25 职场文书
外贸采购员岗位职责
2015/04/03 职场文书
客户付款通知书
2015/04/23 职场文书