2017-03-24 1 views
0

사용자 인증에 TLS 클라이언트 인증서를 사용하는 웹 서비스가 있습니다. 이제는 서비스가 인증서 인증을 올바르게 구현 ("수행하도록 구성되었습니다")하는 경우 전체 스택 테스트를 작성하려고합니다.일치하지 않는 키/인증서의 경우 TLS 인증서 인증

특히 제시된 클라이언트 인증서와 일치하지 않는 키를 사용하여 요청을 암호화 할 수 있는지 궁금합니다.

테스트는 Python으로 작성하는 것이 가장 이상적이지만 다른 일반적인 언어도 사용합니다.

그래서 내 첫 번째 시도는 파이썬의 requests 패키지를 사용하여이었다

requests.post(url, data=payload, cert=(cert_path, key_path), verify=False) 

키가 인증서와 일치하지만, 불일치의 경우 그냥 얻을 경우 작동 클라이언트가

requests.exceptions.SSLError: [X509: KEY_VALUES_MISMATCH] key values mismatch (_ssl.c:2718) 

요청이 서버에 결코 도달하지 않으므로 (그리고 따라서 아무 것도 테스트하지 않습니다.)

내 질문은 : 실제로 잘못된 인증서를 제시 할 수 있습니까 아니면 프로토콜 디자인으로 불가능합니까? 그러한 테스트를 구현하는 방법에 대한 힌트가 있습니까?

+0

올바른 개인 키가없는 한 인증서를 제시 할 수 없습니다. 개인 키를 사용하여 만든 디지털 서명을 제시해야만 인증서를 소유 할 수 있습니다. SSL API를 사용할 수 없다는 것을 알고 있습니다. – EJP

답변

2

TLS 프로토콜에서 포함 된 서명이 클라이언트가 보낸 인증서와 일치하지 않는 메시지 인 CertificateVerify을 보낼 수 있습니다. 따라서 프로토콜 설계에 의해 제외되지 않으며이 서명의 목적은 클라이언트가 전송 된 인증서와 일치하는 개인 키에 대한 액세스 권한을 가지고 있음을 증명하기위한 것이므로이를 제외시키는 것은 불가능합니다.

그러나 requests을 사용하면 실제적인 실수로부터 사용자를 보호하려고하는 매우 높은 수준의 테스트를 수행하게됩니다. 유효하지 않은 서명 등을 사용하여 테스트를 수행하려는 경우 하위 레벨에서 작업해야합니다 (예 : scapy을 사용하여 자체 TLS 핸드 셰이크를 구성하는 경우). TLS가 그러한 테스트를 수행하는 방법에 대한 깊은 지식이 필요합니다.

1

HTTPS를 실행한다고 가정하면 거부하도록 서버를 구성한 경우 기본 SSL 연결을 "불량"인증서로 완료 할 수 없습니다.

SSL 연결이 없으므로 모든 종류의 HTTP 요청을 전달할 수 없습니다.

디자인의 요점은 원치 않는 클라이언트를 완전히 없애는 것입니다.