如何通过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使用dis模块把Python反编译为字节码的用法详解
Jun 14 Python
python实现m3u8格式转换为mp4视频格式
Feb 28 Python
Python基于百度AI的文字识别的示例
Apr 21 Python
python sys.argv[]用法实例详解
May 25 Python
python实现名片管理系统
Nov 29 Python
Pandas实现dataframe和np.array的相互转换
Nov 30 Python
python数据库编程 Mysql实现通讯录
Mar 27 Python
使用Pytorch搭建模型的步骤
Nov 16 Python
python飞机大战游戏实例讲解
Dec 04 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
Jan 08 Python
python基础之文件操作
Oct 24 Python
Python进程间的通信之语法学习
Apr 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的输入输出流
2007/02/14 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
JS 强制设为首页的代码
2009/01/31 Javascript
jQuery select的操作实现代码
2009/05/06 Javascript
js获得参数的getParameter使用示例
2014/02/26 Javascript
jquery控制select的text/value值为选中状态
2014/06/03 Javascript
jQuery实现瀑布流布局
2014/12/12 Javascript
Javascript中for循环语句的几种写法总结对比
2017/01/23 Javascript
Angularjs中数据绑定的实例详解
2017/08/25 Javascript
angularjs路由传值$routeParams详解
2020/09/05 Javascript
JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码
2017/09/23 jQuery
NodeJS实现自定义流的方法
2018/08/01 NodeJs
详解vantUI框架在vue项目中的应用踩坑
2018/12/06 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
Python中os和shutil模块实用方法集锦
2014/05/13 Python
Python3中多线程编程的队列运作示例
2015/04/16 Python
研究Python的ORM框架中的SQLAlchemy库的映射关系
2015/04/25 Python
Python Queue模块详细介绍及实例
2016/12/27 Python
python 中if else 语句的作用及示例代码
2018/03/05 Python
基于pandas数据样本行列选取的方法
2018/04/20 Python
python Spyder界面无法打开的解决方法
2018/04/27 Python
Tensorflow中使用tfrecord方式读取数据的方法
2018/06/19 Python
python使用thrift教程的方法示例
2019/03/21 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
python tkinter控件布局项目实例
2019/11/04 Python
python异步Web框架sanic的实现
2020/04/27 Python
Python 代码调试技巧示例代码
2020/08/11 Python
wedgwood加拿大官网:1759年成立的英国国宝级陶瓷餐具品牌
2018/07/17 全球购物
质检部部长职责
2013/12/16 职场文书
超市中秋节促销方案
2014/03/21 职场文书
生育关怀行动实施方案
2014/03/26 职场文书
电话客服专员岗位职责
2014/06/28 职场文书
委托公证书样本
2015/01/23 职场文书
骨干教师个人总结
2015/02/11 职场文书
文言文辞职信
2015/02/28 职场文书