Python中的加密与认证协议(TLS/SSL)

2023-03-26 00:00:00 协议 加密 认证

在Python中,可以使用ssl模块实现TLS/SSL协议的加密和认证。

以下是一个使用ssl模块建立SSL连接并发送加密数据的示例:

import ssl
import socket

# SSL连接的服务器地址和端口号
server_address = ('pidancode.com', 443)

# 创建socket对象并建立SSL连接
sock = socket.create_connection(server_address)
context = ssl.create_default_context()
ssl_sock = context.wrap_socket(sock, server_hostname='pidancode.com')

# 向服务器发送加密数据
message = b'Hello, pidancode.com!'
ssl_sock.sendall(message)

# 从服务器接收加密数据并解密
data = ssl_sock.recv(1024)
print(data.decode())

# 关闭SSL连接和socket
ssl_sock.close()
sock.close()

以上代码首先创建了一个socket对象,然后使用ssl.create_default_context()方法创建了一个默认的SSL上下文对象,并使用context.wrap_socket()方法将socket对象包装成一个SSL socket对象。随后,向SSL socket对象发送加密数据,并使用ssl_sock.recv()方法从服务器接收加密数据并解密。最后,关闭SSL socket对象和socket对象。

以下是一个使用ssl模块实现SSL服务器的示例:

import ssl
import socket

# SSL服务器的地址和端口号
server_address = ('', 8443)

# 创建socket对象并绑定地址和端口号
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(server_address)

# 监听连接
sock.listen(1)

while True:
    # 接受连接并建立SSL连接
    conn, addr = sock.accept()
    context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
    context.load_cert_chain(certfile='server.crt', keyfile='server.key')
    ssl_conn = context.wrap_socket(conn, server_side=True)

    # 从客户端接收数据并回复
    data = ssl_conn.recv(1024)
    if data:
        message = "Received: {}".format(data.decode())
        ssl_conn.sendall(message.encode())

    # 关闭SSL连接和socket
    ssl_conn.close()
    conn.close()

以上代码首先创建了一个socket对象,并使用sock.bind()方法绑定了一个地址和端口号。然后,使用sock.listen()方法开始监听连接。在无限循环中,使用sock.accept()方法接受连接并建立SSL连接。使用ssl.create_default_context()方法创建了一个默认的SSL上下文对象,并使用context.load_cert_chain()方法加载了服务器的证书和私钥。随后,从SSL连接中接收数据并回复。最后,关闭SSL连接和socket对象。

在这个例子中,我们假设服务器的证书和私钥存储在server.crt和server.key文件中。

注意:在实际应用中,要使用真实的证书和私钥,以确保SSL连接的安全性。

相关文章