如何通过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的Django框架使用的一些实用建议
Apr 03 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
Apr 13 Python
python获取指定目录下所有文件名列表的方法
May 20 Python
python获取程序执行文件路径的方法(推荐)
Apr 26 Python
python3 爬取图片的实例代码
Nov 06 Python
Python实现的批量修改文件后缀名操作示例
Dec 07 Python
Python 实现子类获取父类的类成员方法
Jan 11 Python
Python画图实现同一结点多个柱状图的示例
Jul 07 Python
python实现H2O中的随机森林算法介绍及其项目实战
Aug 29 Python
django-crontab 定时执行任务方法的实现
Sep 06 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
Dec 05 Python
sklearn中的交叉验证的实现(Cross-Validation)
Feb 22 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中文本操作的类
2007/03/17 PHP
PHP 手机归属地查询 api
2010/02/08 PHP
php实现学生管理系统
2020/03/21 PHP
JavaScript打字小游戏代码
2011/12/26 Javascript
JS删除数组元素的函数介绍
2013/03/27 Javascript
轻松创建nodejs服务器(7):阻塞操作的实现
2014/12/18 NodeJs
浅谈js图片前端预览之filereader和window.URL.createObjectURL
2016/06/30 Javascript
Jquery实现遮罩层的简单实例(就是弹出DIV周围都灰色不能操作)
2016/07/14 Javascript
javaScript事件机制兼容【详细整理】
2016/07/23 Javascript
JS判断form内所有表单是否为空的简单实例
2016/09/09 Javascript
jQuery extend()详解及简单实例
2017/05/06 jQuery
jQuery+ajax实现局部刷新的两种方法
2017/06/08 jQuery
Vue中计算属性computed的示例解读
2017/07/26 Javascript
彻底弄懂 JavaScript 执行机制
2018/10/23 Javascript
JavaScript Reflect Metadata实现详解
2019/12/12 Javascript
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
UEditor 自定义图片视频尺寸校验功能的实现代码
2020/10/20 Javascript
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
javascript实现倒计时关闭广告
2021/02/09 Javascript
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
python实现输入任意一个大写字母生成金字塔的示例
2019/10/27 Python
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
HTML5制作3D爱心动画教程 献给女友浪漫的礼物
2014/11/05 HTML / CSS
Exception类的常用方法
2012/06/16 面试题
工商企业管理实习自我鉴定
2013/12/04 职场文书
高三地理教学反思
2014/01/11 职场文书
大学生旅游业创业计划书
2014/01/29 职场文书
大学生毕业鉴定
2014/01/31 职场文书
公司委托书范本5篇
2014/09/20 职场文书
寻衅滋事罪辩护词
2015/05/21 职场文书
春节慰问简报
2015/07/21 职场文书
解除租赁合同协议书
2016/03/21 职场文书
2016年大学生党员承诺书
2016/03/24 职场文书
新员工入职感言范文!
2019/07/04 职场文书
HTML中实现音乐或视频自动播放案例详解
2022/05/30 HTML / CSS