2009-10-05 2 views
8

파이썬으로 서버에서 자체 서명 된 인증서를 검증하는 방법을 알아 내려고했습니다. Google에서 많은 데이터를 찾을 수 없습니다. 또한 서버 URL을 확인하고 싶습니다.파이썬을 사용하여 SSL 피어 확인하기

미리 감사드립니다.

답변

10

의견에서 내 첫 번째 회신까지는 '인증서의 의미를 검증하는'것이 일반적이라는 오해가 있음을 알 수 있습니다. 나는 환상의 일부를 제거하기 위해 여기에 간단한 설명을 쓰려고 노력할 것이다.

인증서 확인은 일부 암호화 서명에 대한 인증서 메타 데이터 (예 : 제목, 유효 기간, 내선 번호 등)의 서명을 확인하는 것입니다.

유효성 확인을위한 모든 것이 자체 서명 된 인증서 인 경우, 사용자는 키 인증서의 키를 미리 알지 못하는 경우와 완전히 동일한 메타 데이터가 아닌 다른 키와 다른 자체 서명 된 인증서를 구별 할 수 없습니다. 이 미리 공유 된 지식을 갖도록 요구 사항을 제거하기 위해이 모든 검증 절차를 수립해야한다는 것을 잊지 마십시오. 정기적 인 인증서 확인을 통해 사전 정의 된 지식 ("CA 인증서"라고도 함)의 제 3 자 인증서 인 요구 사항을 완전히 제거 할 수는 없습니다. 이 지식은 사전 공유되어 있기 때문에 이러한 인증서에는 자체 서명이있을 수 있지만 검증 과정이 아닌 일부 외부 지식으로부터 해당 인증서의 유효성에 대한 정보를 받았습니다.

피어간에 신뢰할 수있는 'CA 인증서'집합을 배포 한 경우이를 사용하여 다른 인증서에 서명하고 신뢰할 수있는 CA의 미리 공유 된 지식에 대해 서명을 확인할 수 있습니다.

그러나 인증서 자체를 제외하고 자체 서명 된 인증서에 대한 추가 지식이없는 경우 신뢰할 수있는 서버뿐 아니라 일부 악의적 인 해커가 발급 할 수 있으므로이 인증서에 대한 신뢰에 대한 가정을 할 수 없습니다.

모든 종류의 인증서 확인 프로세스를 구현하기 전에 일반적으로 Man in the middle attack, Public key infrastructurePublic key cryptography에 대한 지식을 습득하십시오.

자체 서명 된 인증서를 숨김으로 사용해도 일반적으로 인터넷 보안을 고려하지 않아도 사용자 네트워크의 영리한 해커로부터 보호받을 수는 없습니다.

편집자 : 질문 작성자는 실제로 M2Crypto 바인딩을 사용하여 인증서의 베리사인 (또는 다른 CA) 서명을 확인하는 방법을 찾고 있음을 분명히했습니다. 여기에 두 가지 예는 다음과 같습니다 당신이 (종종 더 편리합니다) 많은 CA 인증서와 디렉토리는 <hash>가 인증서 주체의 해시 <hash>.0 각 인증서의 이름을 변경해야합니다 사용하려는 경우

from M2Crypto import X509, SSL 

# manual validation of a signature on a certificate using a given CA cert: 
ca = X509.load_cert('/path/to/ca_cert.pem') 
cert = X509.load_cert('certificate_to_validate.pem') 
print "Verification results:", cert.verify(ca.get_pubkey()) 

# adding a given CA cert to the SSL Context for verification 
ctx = SSL.Context() 
# load a certificate from file 
ctx.load_verify_locations(cafile='/path/to/ca_cert.pem') 
# or use all certificate in a CA directory 
ctx.load_verify_locations(capath='/path/to/ca/dir') 
# or you can specify both options at the same time. 

(얻을 openssl x509 -noout -hash -in cert.pem).

+0

죄송합니다, 제 질문이 잘못되었습니다. – Bhargava

+0

실제로 M2Crypto를 사용하여 Verisign 서명 인증서 확인을 찾고있었습니다. – Bhargava

+0

M2Crypto 예제로 답변을 업데이트했습니다. – abbot

0

자체 서명 인증서는 본질적으로 자체 서명 인증서를 확인할 수 없습니다. 자체 서명 인증서입니다.

다른 신뢰할 수있는 제 3 자의 인증서로 무엇이든 확인할 수있는 인증서에 서명해야하며이 후에는 해당 타사의 인증서를 신뢰할 수있는 CA 목록에 추가하면 인증서를 확인할 수 있습니다 해당 인증서/CA가 서명 한 인증서.

파이썬에서이 작업을 수행하는 방법에 대한 권장 사항을 보려면 파이썬 용 SSL 라이브러리가 있으므로 사용중인 SSL 라이브러리의 이름을 제공해야합니다.

+0

모든 최상위 CA 인증서는 자체 서명되며 아무런 문제도 확인 (트러스트)되지 않습니다. 물론 –

+0

자체 서명 인증서를 확인할 수 있습니다. 인증서를 로컬로 복사해야합니다. 기본적으로 공개/개인 키 인증입니다. 많은 로컬 인증 시스템이이 방법으로 작동하여 x.509 인증서를 사용하여 호스트가 합법적인지 확인합니다. certmaster 및 func에서 파이썬 예제보기 – JimB

2

일부 OpenSSL 바인딩을 사용한다고 가정합니다. 나는 당신의 문제를 해결하는 2 가지 방법을 본다.

  1. 인증서를 openssl 디렉토리에 추가 할 수 있습니다 (시스템에서는 openssl version -d을 실행하십시오). 이것은 컴퓨터에서 openssl을 사용하는 모든 프로그램에 영향을 미칩니다.
  2. 로드 인증서와는 런타임 (아래 코드 스케치 PyOpenSSL입니다,하지만 다른 바인딩과 유사해야합니다) 추가 :

합니다.

x509 = OpenSSL.crypto.load_certificate(...) 
ctx = OpenSSL.SSL.Context(...) 
store = ctx.get_cert_store() 
store.add_cert(x509) 
ctx.set_verify(VERIFY_PEER | VERIFY_FAIL_IF_NO_PEER_CERT, ...) 
+0

이 코드를 사용하면 자체 서명 인증서를 검증하지 않고 명시 적으로 신뢰할 수있는 인증서 저장소에 추가하므로 자체적으로 '검증'됩니다. openssl 디렉토리에 인증서를 추가하는 것은 똑같습니다. 다시 자체 서명 인증서를 확인할 수 없습니다. 자체 서명 인증서는 사용자의 확인 테스트를 통과합니다. – abbot

관련 문제