如何通过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使用htpasswd实现基本认证授权的例子
Jun 10 Python
Python脚本实现集群检测和管理功能
Mar 06 Python
python对象及面向对象技术详解
Jul 19 Python
Python实现七彩蟒蛇绘制实例代码
Jan 16 Python
Python对多属性的重复数据去重实例
Apr 18 Python
利用Python求阴影部分的面积实例代码
Dec 05 Python
python对矩阵进行转置的2种处理方法
Jul 17 Python
python实现多线程端口扫描
Aug 31 Python
解决ROC曲线画出来只有一个点的问题
Feb 28 Python
python如何随机生成高强度密码
Aug 19 Python
python爬取招聘要求等信息实例
Nov 20 Python
Python中常见的反爬机制及其破解方法总结
Jun 10 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用星号隐藏部份用户名、身份证、IP、手机号等实例
2014/04/08 PHP
php操作csv文件代码实例汇总
2014/09/22 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
2017/08/28 PHP
慎用 somefunction.prototype 分析
2009/06/02 Javascript
juqery 学习之五 文档处理 包裹、替换、删除、复制
2011/02/11 Javascript
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
2013/01/23 Javascript
JS性能优化笔记搜索整理
2013/08/21 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
JS实现完全语义化的网页选项卡效果代码
2015/09/15 Javascript
jquery实现倒计时效果
2015/12/14 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
2016/02/18 Javascript
jQuery ajax提交Form表单实例(附demo源码)
2016/04/06 Javascript
ES6中Generator与异步操作实例分析
2017/03/31 Javascript
jQuery创建折叠式菜单
2019/06/15 jQuery
vue引入微信sdk 实现分享朋友圈获取地理位置功能
2019/07/04 Javascript
js编写简易的计算器
2020/07/29 Javascript
pyv8学习python和javascript变量进行交互
2013/12/04 Python
Perl中著名的Schwartzian转换问题解决实现
2015/06/02 Python
Python多进程同步简单实现代码
2016/04/27 Python
python实现斐波那契数列的方法示例
2017/01/12 Python
linux环境下的python安装过程图解(含setuptools)
2017/11/22 Python
python学习笔记之列表(list)与元组(tuple)详解
2017/11/23 Python
Python解决八皇后问题示例
2018/04/22 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
2018/12/31 Python
Django Sitemap 站点地图的实现方法
2019/04/29 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
2020/02/20 Python
Python图像处理二值化方法实例汇总
2020/07/24 Python
微软开源最强Python自动化神器Playwright(不用写一行代码)
2021/01/05 Python
服装公司总经理岗位职责
2013/11/30 职场文书
个人求职信范文分享
2014/01/06 职场文书
垃圾分类的活动方案
2014/08/15 职场文书
2014党员民主评议个人总结
2014/09/10 职场文书
群众路线自查报告及整改措施
2014/11/04 职场文书
早会开场白台词大全
2015/06/01 职场文书
升学宴家长致辞
2015/07/27 职场文书
SQL SERVER触发器详解
2022/02/24 SQL Server