如何通过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爬虫
Dec 25 Python
python中range()与xrange()用法分析
Sep 21 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
Jun 07 Python
python3设计模式之简单工厂模式
Oct 17 Python
python中正则表达式的使用方法
Feb 25 Python
使用Template格式化Python字符串的方法
Jan 22 Python
python学习开发mock接口
Apr 28 Python
Python 中list ,set,dict的大规模查找效率对比详解
Oct 11 Python
python学生信息管理系统实现代码
Dec 17 Python
基于python纯函数实现井字棋游戏
May 27 Python
pytorch中的numel函数用法说明
May 13 Python
Python django中如何使用restful框架
Jun 23 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使之能同时支持GIF和JPEG
2006/10/09 PHP
php之curl设置超时实例
2014/11/03 PHP
php验证session无效的解决方法
2014/11/04 PHP
php制作动态随机验证码
2015/02/12 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
JavaScript 节点操作 以及DOMDocument属性和方法
2007/12/06 Javascript
bgsound 背景音乐 的一些常用方法及特殊用法小结
2010/05/11 Javascript
js DOM的学习笔记
2011/12/22 Javascript
JavaScript中的document.referrer在各种浏览器测试结果
2014/07/18 Javascript
Nodejs+express+html5 实现拖拽上传
2014/08/08 NodeJs
Bootstrap每天必学之响应式导航、轮播图
2016/04/25 Javascript
JQuery的Pager分页器实现代码
2016/05/03 Javascript
JavaScript中的对象继承关系
2016/08/01 Javascript
轻松掌握JavaScript代理模式
2016/08/26 Javascript
React Native基础入门之初步使用Flexbox布局
2018/07/02 Javascript
vue.js2.0 实现better-scroll的滚动效果实例详解
2018/08/13 Javascript
angularJs在多个控制器中共享服务数据的方法
2018/09/30 Javascript
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
vue中的过滤器实例代码详解
2019/06/06 Javascript
在vue和element-ui的table中实现分页复选功能
2019/12/04 Javascript
Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
2020/03/08 Javascript
详解React 条件渲染
2020/07/08 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
2020/12/01 Javascript
使用Python编写类UNIX系统的命令行工具的教程
2015/04/15 Python
在Python程序中实现分布式进程的教程
2015/04/28 Python
python编程测试电脑开启最大线程数实例代码
2018/02/09 Python
seek引发的python文件读写的问题及解决
2019/07/26 Python
OpenCV中VideoCapture类的使用详解
2020/02/14 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
哥德堡通行证:Gothenburg Pass
2019/12/09 全球购物
综合办公室个人的自我评价
2013/12/22 职场文书
《尊严》教学反思
2014/02/11 职场文书
小学生环保演讲稿
2014/04/25 职场文书
计算机毕业大学生求职信
2014/06/26 职场文书
《爱的教育》读书心得
2014/11/08 职场文书
读《方与圆》有感:交友方圆有度
2020/01/14 职场文书