Python3+ssl实现加密通信

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: Python3+ssl实现加密通信

一、说明


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实现双向认证教程(服务端代码+客户端代码+证书生成)

 

3.1 socket通信运行结果


客户端:


服务端:

 

3.2 ssl通信运行结果


客户端:


服务端:

 


相关文章
|
2月前
|
安全 网络安全 数据安全/隐私保护
SSL/TLS证书**是一种用于加密网络通信的数字证书
SSL/TLS证书**是一种用于加密网络通信的数字证书
97 6
|
3月前
|
安全 Linux 数据安全/隐私保护
python知识点100篇系列(15)-加密python源代码为pyd文件
【10月更文挑战第5天】为了保护Python源码不被查看,可将其编译成二进制文件(Windows下为.pyd,Linux下为.so)。以Python3.8为例,通过Cython工具,先写好Python代码并加入`# cython: language_level=3`指令,安装easycython库后,使用`easycython *.py`命令编译源文件,最终生成.pyd文件供直接导入使用。
python知识点100篇系列(15)-加密python源代码为pyd文件
|
3月前
|
应用服务中间件 网络安全 Apache
Discuz! X3.5 开启ssl证书加密后微信、公众号无消息、支付宝通讯中断等
Discuz! X3.5 开启ssl证书加密后微信、公众号无消息、支付宝通讯中断等、支付宝支付实际支付成功,显示未支付等,都属于通讯中断,需要联系DZ官方付费修改程序,屏蔽防CC!
67 4
|
3月前
|
算法 安全 Go
RSA加密算法详解与Python和Go实现
RSA加密算法详解与Python和Go实现
210 1
|
3月前
|
存储 算法 安全
Python 加密算法详解与应用
Python 加密算法详解与应用
57 1
|
3月前
|
数据安全/隐私保护 Python
python学习十一:python常用模块使用,如 加密模块pyarmor,时间模块time等
这篇文章介绍了Python中两个常用模块的使用:加密模块pyarmor用于保护代码,以及时间模块time用于处理时间相关的功能。
100 0
|
3月前
|
数据安全/隐私保护 Python
Python中的MD5加密“解密”
Python中的MD5加密“解密”
118 0
|
3月前
|
安全 测试技术 Go
Python 和 Go 实现 AES 加密算法的技术详解
Python 和 Go 实现 AES 加密算法的技术详解
154 0
|
3月前
|
安全 数据安全/隐私保护 开发者
保护敏感数据:使用Python加密数据的实用方法
保护敏感数据是一项基本的安全实践,Python通过上述库提供了强大的加密工具来实现这一目标。选择哪种方法取决于具体的应用场景和安全需求:对称加密(如AES)适合快速处理大量数据,而非对称加密(如RSA)更适合安全地交换密钥或进行身份验证。哈希函数则用于验证数据的完整性和一致性。通过合理使用这些技术,开发者可以大大增强其应用程序的安全性。
102 0
|
10天前
|
小程序 安全 网络协议
小程序免费SSL证书获取申请
小程序免费SSL证书的获取与申请流程包括:1. 选择可靠的证书颁发机构(如JoySSL);2. 注册并申请证书,填写注册码230922;3. 根据需求选择单域名或通配符证书;4. 提交并完成域名所有权验证;5. 下载并安装证书文件;6. 配置小程序的HTTPS设置;7. 启用并测试SSL证书;8. 定期更新维护证书。通过这些步骤,确保小程序数据传输的安全性和可靠性。

热门文章

最新文章