如何通过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删除nginx缓存文件示例(python文件操作)
Mar 26 Python
Python自动重试HTTP连接装饰器
Apr 28 Python
python判断给定的字符串是否是有效日期的方法
May 13 Python
TensorFlow Session使用的两种方法小结
Jul 30 Python
人工神经网络算法知识点总结
Jun 11 Python
python循环定时中断执行某一段程序的实例
Jun 29 Python
pytorch 自定义卷积核进行卷积操作方式
Dec 30 Python
Python TCPServer 多线程多客户端通信的实现
Dec 31 Python
PyTorch的SoftMax交叉熵损失和梯度用法
Jan 15 Python
Python timer定时器两种常用方法解析
Jan 20 Python
基于Python pyecharts实现多种图例代码解析
Aug 10 Python
python装饰器三种装饰模式的简单分析
Sep 04 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
PHP中调用JAVA
2006/10/09 PHP
PHP中文分词的简单实现代码分享
2011/07/17 PHP
php获取用户IPv4或IPv6地址的代码
2012/11/15 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
JavaScript实际应用:innerHTMl和确认提示的使用
2006/06/22 Javascript
制作特殊字的脚本
2006/06/26 Javascript
删除重复数据的算法
2006/11/23 Javascript
javascript void(0)的妙用
2009/10/21 Javascript
基于jQuery的弹出消息插件 DivAlert之旅(一)
2010/04/01 Javascript
jQuery学习笔记之jQuery选择器的使用
2010/12/22 Javascript
JSON 数字排序多字段排序介绍
2013/09/18 Javascript
javascript定时器完整实例
2015/02/10 Javascript
详解addEventListener的三个参数之useCapture
2015/03/16 Javascript
JS弹窗 JS弹出DIV并使整个页面背景变暗功能的实现代码
2018/04/21 Javascript
vue.js图片转Base64上传图片并预览的实现方法
2018/08/02 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
2018/09/14 Javascript
js form表单input框限制20个字符,10个汉字代码实例
2019/04/12 Javascript
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
python的tkinter布局之简单的聊天窗口实现方法
2014/09/03 Python
Python基于Tkinter实现的记事本实例
2015/06/17 Python
使用celery和Django处理异步任务的流程分析
2020/02/19 Python
Python如何省略括号方法详解
2020/03/21 Python
美国在线乐器和设备商店:Musician’s Friend
2018/07/06 全球购物
斯洛伐克家具和时尚装饰品购物网站:Butlers.sk
2019/09/08 全球购物
Kipling澳洲官网:购买凯浦林包包
2020/12/17 全球购物
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
品质管理部岗位职责范文
2014/03/01 职场文书
集中整治工作方案
2014/05/01 职场文书
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
大学生党员批评与自我批评
2014/09/28 职场文书
公司表扬信格式
2015/05/04 职场文书
如何书写授权委托书?
2019/06/25 职场文书
Node与Python 双向通信的实现代码
2021/07/16 Javascript
Redis高并发防止秒杀超卖实战源码解决方案
2021/11/01 Redis
MySQL创建管理KEY分区
2022/04/13 MySQL