2014-10-10 3 views
1

서버에서 개인 키인 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')) 

답변

0

내 CA는 3 개의 다른 crt 파일을 제공했습니다. 내 솔루션은 context.load_verify_locations에 전달 된 올바른 CA 체인을 생성하기 위해 특정 순서로 추가하는 것이 었습니다. 전제는 여전히 동일합니다, 해당 게시물은 아파치가 특정,

http://billpatrianakos.me/blog/2014/04/04/installing-comodo-positive-ssl-certs-on-apache-and-openssl/이 부여 된 공급자로 COMODO를 사용하는 사람들을위한

, 여기에 블로그 게시물입니다. 문제의 명령은 다음과 같습니다

cat COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > yourdomain.com.cer 

당신은 다음을 수행합니다 예상대로

context.load_verify_locations('yourdomain.com.cer') 

모든 작동합니다.

관련 문제