如何通过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通过BF算法实现关键词匹配的方法
Mar 13 Python
python使用range函数计算一组数和的方法
May 07 Python
读写json中文ASCII乱码问题的解决方法
Nov 05 Python
Python迭代和迭代器详解
Nov 10 Python
Python实现简单求解给定整数的质因数算法示例
Mar 25 Python
Python的numpy库中将矩阵转换为列表等函数的方法
Apr 04 Python
python清除字符串中间空格的实例讲解
May 11 Python
python中csv文件的若干读写方法小结
Jul 04 Python
让你Python到很爽的加速递归函数的装饰器
May 26 Python
pytorch自定义二值化网络层方式
Jan 07 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
Nov 29 Python
用python修改excel表某一列内容的操作方法
Jun 11 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动态柱状图实现方法
2015/03/30 PHP
PHP获取文件扩展名的4种方法
2015/11/24 PHP
php 读取输出其他文件的实现方法
2016/07/26 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
2017/03/16 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
发现的以前不知道的函数
2006/09/19 Javascript
JQuery 弹出框定位实现方法
2010/12/02 Javascript
基于jquery的复制网页内容到WORD的实现代码
2011/02/16 Javascript
学习从实践开始之jQuery插件开发 菜单插件开发
2012/05/03 Javascript
jQuery.extend 函数的详细用法
2012/06/27 Javascript
关于jQuery object and DOM element
2013/04/15 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
JavaScript将XML转成JSON的方法
2015/03/12 Javascript
深入浅析JavaScript的API设计原则
2016/06/14 Javascript
全面了解构造函数继承关键apply call
2016/07/26 Javascript
浅析$(function) ready和onload 的区别
2016/09/03 Javascript
jQuery 表单序列化实例代码
2017/06/11 jQuery
Webpack如何引入bootstrap的方法
2017/06/17 Javascript
BootStrap selectpicker后台动态绑定数据的方法
2017/07/28 Javascript
vue 实现input表单元素的disabled示例
2019/10/28 Javascript
通过js随机函数Math.random实现乱序
2020/05/19 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
vue项目中播放rtmp视频文件流的方法
2020/09/17 Javascript
JS算法教程之字符串去重与字符串反转
2020/12/15 Javascript
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
python之yield和Generator深入解析
2019/09/18 Python
基于python修改srt字幕的时间轴
2020/02/03 Python
python的sys.path模块路径添加方式
2020/03/09 Python
鼠标滚轮事件和Mac触控板双指事件
2019/12/23 HTML / CSS
英国外籍人士的在线超市:British Corner Shop
2019/06/03 全球购物
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
英语专业学生的自我评价
2013/12/30 职场文书
幼儿园开学家长寄语
2014/01/19 职场文书
世界红十字日活动总结
2015/02/10 职场文书
创建文明城市倡议书
2015/04/28 职场文书
开业典礼致辞
2015/07/29 职场文书