下面是一个完整的 TCP + SSL 服务端与客户端示例,适用于 Python 3,使用 socket 模块和 ssl 模块,常用于实现安全通信。
一、生成 SSL 证书和私钥
打开命令行(终端),输入以下命令生成自签名证书(有效期 365 天)。
openssl req -new -x509 -days 365 -nodes -out server.crt -keyout server.key按照提示填写(可以直接回车),将生成两个文件:
server.crt:服务器端证书
server.key:服务器私钥
这两个文件需与服务端脚本放在同一目录下。
提示:
要在系统中事先安装 OpenSSL。
Windows 用户可通过 Git Bash 或安装 OpenSSL for Windows。
https://slproweb.com/products/Win32OpenSSL.html
二、TCP + SSL 服务端(server_tcp_ssl.py)
import socket
import ssl
HOST = '127.0.0.1'
PORT = 8888
# 创建 TCP socket
server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sock.bind((HOST, PORT))
server_sock.listen(1)
print("等待客户端连接...")
# 加载证书和密钥
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain(certfile='server.crt', keyfile='server.key')
# 包装 socket
with context.wrap_socket(server_sock, server_side=True) as ssock:
conn, addr = ssock.accept()
print("客户端已连接:", addr)
try:
while True:
data = conn.recv(1024)
if not data:
break
print("收到消息:", data.decode('utf-8'))
reply = input("回复客户端:")
conn.sendall(reply.encode('utf-8'))
except Exception as e:
print("通信异常:", e)
finally:
conn.close()三、TCP + SSL 客户端(client_tcp_ssl.py)
import socket
import ssl
HOST = '127.0.0.1'
PORT = 8888
context = ssl.create_default_context()
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE # 忽略证书验证(测试用)
try:
with socket.create_connection((HOST, PORT)) as sock:
with context.wrap_socket(sock, server_hostname=HOST) as ssock:
print("已连接服务器,可发送消息(输入 q 退出)")
while True:
msg = input("你说:")
if msg.lower() == 'q':
break
ssock.sendall(msg.encode('utf-8'))
reply = ssock.recv(1024).decode('utf-8')
print("服务器回应:", reply)
except Exception as e:
print("连接异常:", e)◆ ◆ ◆
使用说明
1、先运行服务端,建议在命令行中运行。
python server_tcp_ssl.py确保服务端所在端口未被防火墙拦截。
2、再运行客户端(client_tcp_ssl.py)。可在 Python 编辑器中运行。
如遇 UnicodeDecodeError,请确认服务端与客户端使用统一编码(UTF-8)。
3、客户端或服务端输入文字后回车,对方会回应。
4、在客户端输入 q 键即可退出。
“点赞有美意,赞赏是鼓励”
热门跟贴