2010-12-09 15 views
13

사용자 지정 CA에서 인증서에 서명했는지 확인해야합니다.어떻게 파이썬에서 SSL 인증서를 확인합니까?

# Custom CA file: ca-cert.pem 
# Cert signed by above CA: bob.cert 
$ openssl verify -CAfile test-ca-cert.pem bob.cert 
bob.cert: OK 

하지만 파이썬에서 같은 일을해야하고, 정말 명령 줄 유틸리티를 호출하고 싶지 않은 : OpenSSL을 명령 줄 유틸리티를 사용하여이 쉽게 할 수 있습니다. 내가 아는 한, M2Crypto는 OpenSSL을위한 "가장 완벽한"파이썬 래퍼이지만 커맨드 라인 유틸리티의 수행 방법을 이해할 수는 없습니다!

C 코드에서이 동일한 작업을 수행하는 방법을 나타내는 this question을 참조하면 약 절반 정도를 얻을 수있었습니다. 내가 선택한 변수 이름은 openssl verify 명령 줄 유틸리티의 소스 코드에서 사용 된 것과 동일합니다 (openssl-xxx/apps/verify.c 참조).

import M2Crypto as m2 
# Load the certificates 
cacert = m2.X509.load_cert('test-ca-cert.pem') # Create cert object from CA cert file 
bobcert = m2.X509.load_cert('bob.cert')  # Create cert object from Bob's cert file 
cert_ctx = m2.X509.X509_Store()    # Step 1 from referenced C code steps 
csc = m2.X509.X509_Store_Context(cert_ctx) # Step 2 & 5 
cert_ctx.add_cert(cacert)     # Step 3 
cert_ctx.add_cert(bobcert)     # ditto 
# Skip step 4 (no CRLs to add) 
# Step 5 is combined with step 2...I think. (X509_STORE_CTX_init: Python creates and 
# initialises an object in the same step) 
# Skip step 6? (can't find anything corresponding to 
# X509_STORE_CTX_set_purpose, not sure if we need to anyway???) 
# 
# It all falls apart at this point, as steps 7 and 8 don't have any corresponding 
# functions in M2Crypto -- I even grepped the entire source code of M2Crypto, and 
# neither of the following functions are present in it: 
# Step 7: X509_STORE_CTX_set_cert - Tell the context which certificate to validate. 
# Step 8: X509_verify_cert - Finally, validate it 

그래서 나는 절반이,하지만 난 실제로 검증이 완료 얻을 수없는 것! 내가 놓친 게 있니? M2Crypto에서 사용해야하는 다른 기능이 있습니까? OpenSSL의 완전히 다른 파이썬 래퍼를 찾고 있을까요? 어떻게하면 파이썬에서이 작업을 수행 할 수 있습니다!?!?

필자는 파일을 암호화/해독하기 위해 인증서를 사용하고 있으므로 SSL 연결이 없으므로 (SSL 연결 기반 피어 인증서 확인을 사용하는 데는 already been answered) 사용하고 싶지 않습니다. 진행.

+1

커맨드 라인 유틸리티를 호출하고 싶지 않은 이유가 있습니까? 당신이 두통을 피할 수 없을 것 같습니다 ... – katrielalex

+2

이것은 잠재적으로 임베디드 시스템을 포함하여 새롭거나 오래된, 크고 작은 많은 다른 운영 체제에 배포 될 소프트웨어 용입니다 (파이썬을 포함 할만큼 충분히 큼)). 최대한의 이식성과 최대의 성능을 원합니다. 필자가 피할 수 있다면 수천 개의 전화를 명령 줄에 넣고 싶지는 않습니다.많은 수의 인증서가 필요합니다. – Nathan

+0

관련 http://stackoverflow.com/q/2626792/4279 – jfs

답변

-3

당신이 말했듯이, 은 OpenSSL은 M2Crypto 좋은 검증을

이없는 연결을

을 필요로하는 방법이 독창적 인 아이디어에 대해 :

import os 
os.system('openssl verify -CAfile ../ca-cert.pem bob.cert') 
그것의 추악한

하지만 작품!

+3

질문에 : "정말로 커맨드 라인 유틸리티에 전화하고 싶지 않습니다." –

-1

불행히도 문서화되지 않은 X509.verify 메서드를 사용하면 인증서가 CA의 개인 키로 서명되었는지 여부를 확인할 수 있습니다. 이 OpenSSL을의 x509_verify 백그라운드에서 호출하는 것처럼,이 또한 제대로 (만료 등) 모든 매개 변수를 확인 확신 :

from M2Crypto X509 

cert = X509.load_cert("certificate-filename") 

caCertificate = X509.load_cert("trusted-ca-filename") 
caPublic = caCertificate.get_pubkey() 

if cert.verify(caPublic) == 1: 
    # Certificate is okay! 
else: 
    # not okay 
+0

틀렸어. 출처 : http://goo.gl/ fRhou X509_verify는 서명 만 검사합니다. – abbot

5
이 필요한 일부 포장하지 않기 때문에 당신은, 일반 M2Crypto이 작업을 수행 할 수

기능. 좋은 소식은 SWIG가 설치되어있는 경우 사용자가 직접 포장하고 M2Crypto 코드로 사용할 수 있다는 것입니다. 나는 약간의 추가 기능을 가진 모듈을 만든 적이있다. 그런 종류의 유효성 검사를하기 때문에 지금은 출판하기로했다. 여기에서 확인할 수 있습니다 : https://github.com/abbot/m2ext. 내 버그와 이메일을 무시했다

import sys 
from m2ext import SSL 
from M2Crypto import X509 

print "Validating certificate %s using CApath %s" % (sys.argv[1], sys.argv[2]) 
cert = X509.load_cert(sys.argv[1]) 
ctx = SSL.Context() 
ctx.load_verify_locations(capath=sys.argv[2]) 
if ctx.validate_certificate(cert): 
    print "valid" 
else: 
    print "invalid" 

불행하게도 M2Crypto 개발 (지난 2 년 동안 버그 추적기에는 폐쇄 문제) 정체를 없을 것으로 보인다 및 메인테이너 :이 방법이 모듈을 사용하여 인증서의 유효성을 검사하는 예입니다 이 패치들과 다른 패치들 ...

+0

최근 2 년 동안 http://is.gd/iPhP6에 버그 추적기에 * 폐쇄 된 문제가 있습니다 (https://bugzilla.osafoundation.org url이 댓글에 비해 너무 길음). @Heikki Toivonen (관리자)은 M2Crypto에 대한 몇 가지 질문에 답변합니다. http://stackoverflow.com/questions/4403012/how-do-i-verify-an-ssl-certificate-in-python/4457189#4457189 – jfs