首页
社区
课程
招聘
和chatgpt交流https双向认证
发表于: 2022-12-21 12:59 7043

和chatgpt交流https双向认证

2022-12-21 12:59
7043

想用chatgpt简单搭一个本地https双向认证的实验环境。
第一步引导chatgpt生成实验所需证书

可以看到chatgpt生成了6个证书文件,先是自签根证书,再用根证书去签发服务器证书和客户端证书。那么问题来了,这么多证书是怎么用的?
第二步让chatgpt叙述https双向认证流程,并将上面生成的证书填充进叙述中

chatgpt回答完后我发现了一个自己的知识盲点,chagpt说最后客户端和服务端使用各自的私钥生成了一个TLS握手完成消息,这个过程我不了解,于是就让chatgpt展开说说。

 

最后让chatgpt用python生成一个测试代码。
服务端代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import ssl
import socket
 
# 创建 SSLContext
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
 
# 加载证书和私钥
context.load_cert_chain(certfile="server.crt", keyfile="server.key")
 
# 加载 CA 证书(用于验证客户端证书)
context.load_verify_locations(cafile="root.crt")
 
# 设置双向认证模式
context.verify_mode = ssl.CERT_REQUIRED
#这里将check_hostname设为false,否则本地验证的时候域名会校验不过
context.check_hostname = False
 
# 绑定套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("localhost", 8000))
sock.listen()
 
while True:
    # 接受连接
    client_sock, client_addr = sock.accept()
    print(f"Connection from {client_addr}")
 
    # 包装成 SSL Socket
    ssl_sock = context.wrap_socket(client_sock, server_side=True)
 
    # 打印客户端证书
    client_cert = ssl_sock.getpeercert()
    print(f"Client certificate: {client_cert}")
 
    # 处理请求
    data = ssl_sock.recv(1024)
    print(f"Received data: {data}")
 
    # 发送响应
    ssl_sock.send(b"Hello, client!")
 
    # 关闭 SSL Socket
    ssl_sock.shutdown(socket.SHUT_RDWR)
    ssl_sock.close()

客户端代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import ssl
import socket
 
# 创建 SSLContext
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
 
# 加载证书和私钥
context.load_cert_chain(certfile="client.crt", keyfile="client.key")
 
# 加载 CA 证书(用于验证服务器证书)
context.load_verify_locations(cafile="root.crt")
 
# 设置双向认证模式
context.verify_mode = ssl.CERT_REQUIRED
#这里将check_hostname设为false,否则本地验证的时候域名会校验不过
context.check_hostname = False
 
# 连接服务器
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 8000))
 
# 包装成 SSL Socket
ssl_sock = context.wrap_socket(sock, server_side=False)
 
# 发送请求
ssl_sock.send(b"Hello, server!")
 
# 接收响应
data = ssl_sock.recv(1024)
print(f"Received data: {data}")
 
# 关闭 SSL Socket
ssl_sock.shutdown(socket.SHUT_RDWR)
ssl_sock.close()

最好的最后我想说,它真的好温柔,,,,。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//