如何通过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使用Socket(Https)Post登录百度的实现代码
May 18 Python
Python程序员鲜为人知但你应该知道的17个问题
Jun 04 Python
详细探究Python中的字典容器
Apr 14 Python
浅谈python 四种数值类型(int,long,float,complex)
Jun 08 Python
python中文乱码不着急,先看懂字节和字符
Dec 20 Python
Python实现读取机器硬件信息的方法示例
Jun 09 Python
python中实现控制小数点位数的方法
Jan 24 Python
如何更优雅地写python代码
Jul 02 Python
python flask 如何修改默认端口号的方法步骤
Jul 12 Python
Python从入门到精通之环境搭建教程图解
Sep 26 Python
计算Python Numpy向量之间的欧氏距离实例
May 22 Python
解析目标检测之IoU
Jun 26 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 Undefined index的问题
2009/06/01 PHP
PHP 微信扫码支付源代码(推荐)
2016/11/03 PHP
谈谈关于JavaScript 中的 MVC 模式
2013/04/11 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
zTree插件之单选下拉菜单实例代码
2013/11/07 Javascript
基于jquery实现的图片在各种分辨率下未知的容器内上下左右居中
2014/05/11 Javascript
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
为什么JS中eval处理JSON数据要加括号
2015/04/13 Javascript
Jquery日历插件制作简单日历
2015/10/28 Javascript
整理JavaScript创建对象的八种方法
2015/11/03 Javascript
jQuery实现图片预加载效果
2015/11/27 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
2016/05/30 Javascript
js控件Kindeditor实现图片自动上传功能
2020/07/20 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
DropDownList控件绑定数据源的三种方法
2016/12/24 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
2017/04/13 Javascript
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
2018/04/26 jQuery
vue自动化表单实例分析
2018/05/06 Javascript
微信小程序功能之全屏滚动效果的实现代码
2018/11/22 Javascript
python基于隐马尔可夫模型实现中文拼音输入
2016/04/01 Python
TensorFlow如何实现反向传播
2018/02/06 Python
详解python字节码
2018/02/07 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
2019/07/23 Python
Python 模拟动态产生字母验证码图片功能
2019/12/24 Python
2020版Python学习路线图(附学习资料)
2020/09/15 Python
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
劳动之星获奖感言
2014/02/01 职场文书
中国入世承诺
2014/04/01 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
项目转让协议书
2014/10/27 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
小学生家长意见
2015/06/03 职场文书
2016年校园植树节广播稿
2015/12/17 职场文书
电子表的操作介绍说明书
2019/10/28 职场文书