2015-01-20 9 views
6
import OpenSSL 

key = ... 
signature = ... 
data = ... 

x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_ASN1, key) 
OpenSSL.crypto.verify(x509, signature, data, 'sha1') 

지금까지 모든 문제없이이 모든 작업을 수행 할 수있었습니다. 그러나 열쇠 자체가 URL을 통해 나에게 주어지기 때문에 보안이 충분하지 않다고 느끼지 않으며 서명을 작성하는 메소드가 공개되어 있습니다.Python을 사용하여 인증 기관으로 공개 키를 인증하는 방법은 무엇입니까?

예를 들어, "VeriSign Class 3 Code Signing 2010 CA"에 의해 확인 된 키는 누구든지 유효한 청구인지 확인하는 방법을 알려줄 수 있습니까?

나는 내 컴퓨터에 로컬로 VeriSign 인증서가 있어야한다고 생각합니다. 내가 그렇게한다고 가정하면, 거기에서 어디로 가야합니까?

감사합니다.

* URL이 JSON 요청의 매개 변수로 나에게 제공됩니다. 물론 URL은 HTTPS가 될 것이고 도메인 이름과 그 모든 것을 확인할 수 있습니다. 하지만 인증서 자체를 확인해야하는 것 같습니다.

답변

2

당신은 인증서 자체를 확인해야합니다. 그리고 예, 검사 할 인증서에 서명 한 VeriSign 루트 인증서 (및 기타 모든 중간 인증서가 완전한 신뢰 체인을 유지해야합니다)가 필요합니다.

현재 시만텍 (VeriSign) 루트 인증서는 에 here입니다.

zip 파일을 다운로드하여 압축을 풀고 신뢰할 수있는 모든 인증서를 찾아서 (pem 형식으로) 하나의 인증서 번들 파일로 저장하십시오.

이제 실제 인증을 수행해야합니다.불행히도 OpenSSL 전화는 X509_verify_certificate입니다. 나는 pyopenssl과 M2Crypto의 소스를 살펴 보았고 그 호출을 노출하지 않았으므로이 패키지 중 하나를 사용하여 인증서를 확인하기 위해 호출 할 수있는 직접적인 Python 코드는 없습니다.

그러나 pyopenssl을 사용하고 있으므로 분명히 openssl 라이브러리를 사용할 수 있습니다. 따라서 이미 openssl 명령 줄 도구 모음을 설치했거나 쉽게 설치할 수 있습니다. 그렇다면,이 같은 수행하여 파이프를 통해 OpenSSL을 verify 명령을 호출 할 수 있습니다 : 당신은 OpenSSL이 익숙하지 않다면 위의 파이프, 마지막 명령을

openssl verify -CAfile ca.bundle certificate.pem 

를 실행

cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_ASN1, key) 
# the command like likes pem format 
cert_pem = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, cert) 

# the bundle that you created from the zip extraction 
certificate_bundle = 'verisign-root-bundle.pem' 

# Pipe the cert to the openssl verify command and check the return code 
# a return code of 0 is successful verify 
import subprocess 
p = subprocess.Popen(['openssl', 'verify', '-CAfile', certificate_bundle], 
        stdin=subprocess.PIPE) 
p.communicate(input=cert_pem) 
p.wait() 
if (p.returncode == 0): 
    print('Certificate Verified.') 
else: 
    print('Problem with certificate') 

을, 인증서를 표시하는 명령은

openssl x509 -inform PEM -text -in certificate.pem 

희망입니다.

2

어쩌면 부분적으로 만 질문에 답변 할 수 있습니다. 가장 큰 걱정은 키를 가져 오는 채널의 보안입니다. 키를 얻는 방법에 대한 코드는 표시하지 않지만 HTTPS를 통해 검색하고 이제는 인증서 확인을 통해이 연결의 진위 여부를 확인하려고한다고했습니다.

잘 구축 된 타사 웹 클라이언트 프레임 워크 requests을 사용하면 편안하게 수행 할 수 있습니다. the docs에서

인용구 :

요청 그냥 웹 브라우저처럼, HTTPS 요청에 SSL 인증서를 확인할 수 있습니다. 호스트의 SSL 인증서를 확인하려면, 당신은이 인수를 확인 사용할 수 있습니다 또한

requests.get(url, verify=True) 

:

당신은 CA를 신뢰 의 인증서와 CA_BUNDLE 파일의 경로를 확인 전달할 수 있습니다. 당신이 정말로 제어 할 (과 복잡성을 줄일 수), 다음 http://www.symantec.com/page.jsp?id=roots에서 바로 파일을로드하고 verify='/path/to/cert.pem' 접근을 할 경우

requests.get(url, verify='/path/to/cert.pem') 

처럼

후자는 볼 수 있었다. 당신이 필요합니다 같아요 http://www.symantec.com/content/en/us/enterprise/verisign/roots/Class-3-Public-Primary-Certification-Authority-G2.pem

+1

페이로드가 유효한지 확인하지 않습니다. 나는 그 "열쇠"가이 HTTPS 연결을 통해 얻는 것이 무엇인지 정확하게 모른다. 하지만이 키는 HTTPS를 통해 전송되는 다른 페이로드 데이터로 취급된다는 점을 확신 할 수 있습니다. –