두 피어간에 암호화 된 연결을 만들어야하며 두 가지 모두를 인증해야합니다. 두 피어는 이미 다른 피어 공개 키의 지문 (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()
가 귀하의 답변과 조언을 사전에 여러분 모두 감사합니다.
감사합니다. 내가 알아야 할 모든 것! 어쨌든 SSL.Checker를 우아함으로 사용하려고 생각하고 있지만 X509 "지문"이 이미 DER 키의 다이제스트인지 또는 전체 인증서 (키와 필드 포함)의 요약인지 여부를 알지 못합니다. 맨손으로 키로 인증서를 생성 할 수 있기 때문에 OpenSSL의 미묘한 변경으로 인해 지문이 서로 달라 지거나 물건이 손상 될 수 있습니다. 그렇다면 자체 Checker 클래스를 수행하거나 상속하는 것은 어떻습니까? 그것은 우아한 또는 상당히 해킹으로 간주됩니까? – Kiwi
SSL.Checker에서 지문은 DER 형식으로 전체 인증서 해시를 가져 오는 것을 의미합니다. 나는 이것이 openssl x509-fingerprint가하는 것과 동일하다고 생각합니다. 지문을 다른 방식으로 계산하면 물론 자신의 체커 루틴을 자유롭게 작성할 수 있습니다. –