Python3中使用ssl模块实现加密通信的完整指南
本文详细讲解如何利用Python3标准库ssl实现加密通信。通过对比纯Socket与SSL封装的代码,展示从建立连接到发送数据的具体步骤。文章包含客户端与服务端的完整实现代码,并说明SSL在传输层的作用及证书配置方法,帮助开发者理解基于TLS的安全通信机制。
SSL加密通信概述
一、说明
Python标准库中的ssl模块可用于实现加密通信功能。
该模块底层调用OpenSSL,并进行了面向对象化的改造与简化,但仍能清晰看到OpenSSL的设计痕迹。
本文首先介绍基于Python实现的普通Socket通信,随后在此基础上展示SSL通信的实现方式,以便读者更直观地对比两者在Python编程中的差异。
提及SSL时,许多人会联想到HTTPS,但从本质上看,SSL是在传输层与应用层之间新增的一层。依据分层无关原则,SSL与HTTPS并无绑定关系,其上层完全可以承载其他任何应用层协议(如POP、IMAP、Telnet等)。
Python代码实现
二、程序实现
2.1 socket通信实现
普通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()
SSL加密通信代码
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通信运行结果
客户端:

服务端:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









