如何通过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 相关文章推荐
wxpython 学习笔记 第一天
Feb 09 Python
使用python在校内发人人网状态(人人网看状态)
Feb 19 Python
python列表的常用操作方法小结
May 21 Python
python 利用for循环 保存多个图像或者文件的实例
Nov 09 Python
python学习开发mock接口
Apr 28 Python
python的mysql数据库建立表与插入数据操作示例
Sep 30 Python
pytorch的梯度计算以及backward方法详解
Jan 10 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
Feb 18 Python
Python大批量搜索引擎图像爬虫工具详解
Nov 16 Python
python3.9实现pyinstaller打包python文件成exe
Dec 13 Python
python文件名批量重命名脚本实例代码
Apr 22 Python
请求模块urllib之PYTHON爬虫的基本使用
Apr 08 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
利用递归把多维数组转为一维数组的函数
2006/10/09 PHP
php在线生成ico文件的代码
2007/10/09 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
php获取手机端的号码以及ip地址实例代码
2018/09/12 PHP
Thinkphp5框架使用validate实现验证功能的方法
2019/08/27 PHP
Javascript 验证上传图片大小[客户端]
2009/08/01 Javascript
js 走马灯简单实例
2013/11/21 Javascript
JS实现根据出生年月计算年龄
2014/01/10 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
jQuery实现调整表格单列顺序完整实例
2016/06/20 Javascript
jquery.pagination.js分页使用教程
2018/10/23 jQuery
微信小程序自定义弹窗wcPop插件
2018/11/19 Javascript
手挽手带你学React之React-router4.x的使用
2019/02/14 Javascript
Vue.js轮播图走马灯代码实例(全)
2019/05/08 Javascript
布同自制Python函数帮助查询小工具
2011/03/13 Python
django 删除数据库表后重新同步的方法
2018/05/27 Python
tensorflow 打印内存中的变量方法
2018/07/30 Python
python程序 创建多线程过程详解
2019/09/23 Python
python获取栅格点和面值的实现
2020/03/10 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
使用Python爬取小姐姐图片(beautifulsoup法)
2021/02/11 Python
荷兰的时尚市场:To Be Dressed
2019/05/06 全球购物
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
自我鉴定200字
2013/10/28 职场文书
学校经典推荐信
2013/10/30 职场文书
优秀生推荐信范文
2013/11/28 职场文书
合作意向书模板
2014/03/31 职场文书
副科竞争上岗演讲稿
2014/05/12 职场文书
安全宣传标语
2014/06/10 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
故宫英文导游词
2015/01/31 职场文书
医生个人年度总结
2015/02/28 职场文书
违反纪律检讨书范文
2015/05/07 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书
Python 正则模块详情
2021/11/02 Python
vue elementUI批量上传文件
2022/04/26 Vue.js