2010-01-29 5 views
1

두 피어간에 암호화 된 연결을 만들어야하며 두 가지 모두를 인증해야합니다. 두 피어는 이미 다른 피어 공개 키의 지문 (SHA256 해시)을 공유합니다. X509 또는 OpenPGP 키/인증서는 내 필요에 비해 너무 크고 크기가 커서 보안 모델에 적합하지 않기 때문에 사용하지 않습니다. m2crypto 사용자 지정 인증서 확인

나는 그것의 X509 모델을 남용하여 M2Crypto (좋은 라이브러리)과의 연결을 구축하기 위해 노력하고있어 :

는 RSA 개인 키를 부여
  • 는 자체 서명 된 거의 비어 인증서를 만듭니다.

  • 공개 키 지문 인증서 다른 피어를 확인 내 인증서 제공하는 다른 피어에 연결;

다음 코드는 안전한가요? 맞습니까? 거기에 더 나은 (어쩌면 다른 라이브러리) 할 방법이 있습니까? OpenSSL에 대한 의심은 실제로 인증 공개 키를 사용하지 않아서 인증 확인을 요청하지 않기 때문입니다.

필자는 der-encoded rsa 키로 암호화 된 스트림을 사용해야하며, Python 용 자유 소프트웨어 솔루션은 환영합니다. M2Crypto를 더 잘 알고 싶습니다. 이미 더 잘 알고 있고 이미 동일한 프로젝트에서이 코드를 사용하고 있기 때문입니다.

가 여기 내 코드입니다 (다만 클라이언트 피어, 서버가 비슷해야) :

other_fingerprints = [] #list of fingerprints, (binary data) 
mysocket = ... #any socket object 

CERTFILE, KEYFILE = "testcert","testkey" # private key wrapped in the cert 

from M2Crypto import * 
ctx = SSL.Context('sslv3') 
ctx.set_verify(SSL.verify_none, depth=1) 
ctx.load_cert(CERTFILE, KEYFILE) 
c = SSL.Connection(ctx, mysocket) 
c.connect_ssl() 
peercert = c.get_peer_cert() 
keyobj = peercert.get_pubkey() 
keydata = keyobj.as_der() 
md = EVP.MessageDigest('sha256') 
md.update(keydata) 
h = md.digest() 
if h not in other_fingerprints: 
    raise(IOError) #other party not auth'ed 
# from now on the connection is secure, right? 
c.send("Hello secret world!") 
print c.recv(4096) 
c.close() 

가 귀하의 답변과 조언을 사전에 여러분 모두 감사합니다.

답변

0

접근 방법이 효과적 일 것으로 보이지만 이미 사용할 수있는 내장 지문 검사기가 있습니다. 여기를 참조하십시오 : What to put for a commonName when making an OpenSSL key?

+0

감사합니다. 내가 알아야 할 모든 것! 어쨌든 SSL.Checker를 우아함으로 사용하려고 생각하고 있지만 X509 "지문"이 이미 DER 키의 다이제스트인지 또는 전체 인증서 (키와 필드 포함)의 요약인지 여부를 알지 못합니다. 맨손으로 키로 인증서를 생성 할 수 있기 때문에 OpenSSL의 미묘한 변경으로 인해 지문이 서로 달라 지거나 물건이 손상 될 수 있습니다. 그렇다면 자체 Checker 클래스를 수행하거나 상속하는 것은 어떻습니까? 그것은 우아한 또는 상당히 해킹으로 간주됩니까? – Kiwi

+0

SSL.Checker에서 지문은 DER 형식으로 전체 인증서 해시를 가져 오는 것을 의미합니다. 나는 이것이 openssl x509-fingerprint가하는 것과 동일하다고 생각합니다. 지문을 다른 방식으로 계산하면 물론 자신의 체커 루틴을 자유롭게 작성할 수 있습니다. –

-2

대답은 올바른 x509 인증서를 사용하고 대칭 적으로 확인/확인하는 것입니다. "안전합니까?" - 아니, 물어봐야 해.

해결책이 효과가있을 수 있지만 "안전합니까?"라는 질문을받는 것이 좋습니다. 상자에서 곧바로 물건을 사용해야한다고 나에게 말한다.

+0

저는 이론에 대해 확신합니다. me2crypto (및 openssl) 내부의 코드는 확실하지 않습니다. 나의 유일한 걱정은 핸드 셰이크 중 인증서에서 공개 키를 사용하는지 아닌지에 대한 openssl에 관한 것입니다. 나는 certs를 배포 할 수 있다면 나는 심지어 물어 보지 못했을 것이다. 이 컨텍스트에서 X509를 사용하는 "적절한"방법은 없습니다. M2Crypto에는 SSL.Context.set_verify (, callback())와 같은 사용자 정의 검사 기능이 있지만 문서를 찾지 못했습니다. – Kiwi

관련 문제