서버에서 개인 키인 caroot.crt 파일에서로드하는 CA에서 제공 한 certfile로 SSLContext를 초기화합니다. 이제 노드와 같은 것으로 초기화 할 때 모든 것이 잘 작동합니다 (예 : Setting up SSL with node.js). 내 의도는 모든 것을 같은 방식으로 설정하는 것이 었습니다. 내 가정은 핸드 셰이크 중에 서버가 내 노드 서버와 마찬가지로 클라이언트에 CA를 제공한다는 것입니다. 그게 아닌 것처럼 보입니다. 내가 도대체 뭘 잘못하고있는 겁니까?발급 된 TLSV1_ALERT_UNKNOWN_CA의 CA입니다. 왜?
ssl.CERT_REQUIRED가 사용되지 않으면 모든 것이 완벽하게 작동하지만 엔드 포인트 (서버)가 그들이 말하는 사람인지를 검증하고자합니다.
# Server
import socket
import ssl
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
context.load_cert_chain(certfile='./path/to/certfile.crt',
keyfile='./path/to/keyfile.pem')
context.load_verify_locations('./path/to/caroot.crt')
context.set_default_verify_paths()
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('', 23000))
server_socket.listen(socket.SOMAXCONN)
def handle_client(ssl_socket):
data = ssl_socket.read()
while data:
print("%s" % (str(data)))
data = ssl_socket.read()
while True:
client_socket, addr = server_socket.accept()
ssl_client_socket = context.wrap_socket(client_socket, server_side=True)
handle_client(ssl_client_socket)
# Client
import socket
import ssl
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
# I'm assuming this is not necessary, but I'd like to load the system provided CAs
context.set_default_verify_paths()
# Require CA validation to prevent MITM.
context.verify_mode = ssl.CERT_REQUIRED
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_client = context.wrap_socket(client_socket)
ssl_client.connect(('', 23000))
ssl_client.send(bytes('hello, world!', 'UTF-8'))