2010-01-29 5 views
1

Мне нужно создать зашифрованное соединение между двумя одноранговыми узлами, и мне нужно аутентифицировать оба. Оба партнера уже имеют отпечаток пальца (SHA256 хэш) другого открытого открытого ключа. Я не использую ключи/сертификаты X509 или OpenPGP, поскольку они слишком большие и громоздкие для моих нужд, и они не подходят для модели безопасности.m2crypto проверка подлинности сертификата

Я пытаюсь построить связь с M2Crypto (хорошая библиотека), злоупотребляя его x509 модель:

  • дал РКА частный ключ, создать selfsigned почти пустой серт.

  • подключиться к другому партнеру, предлагая мой серт

  • проверить другую пэр CE открытого ключа отпечатка пальца;

Безопасен ли следующий код? это правильно? есть ли способ сделать это лучше (возможно, с другими библиотеками)? Мои сомнения в том, что 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. Я считаю, что это то же самое, что и opensl x509 -fingerprint. Если вы вычисляете отпечаток пальца по-другому, вы, конечно, можете свободно писать свою рутину. –

-2

Ответ на вопрос: используйте надлежащие сертификаты x509 и проверьте/проверьте симметрично. «Это безопасно?» - Нет, потому что ты должен спросить.

Ваше решение может работать, но тот факт, что вы просите совета по поводу «Это безопасно?» говорит, что вы, вероятно, должны использовать материал прямо из коробки.

+0

Я вполне уверен в теории, я не уверен, что это код внутри me2crypto (и openssl). Мое единственное беспокойство в том, что openssl использует или не открытый ключ в сертификатах во время рукопожатия. Если бы я мог распространять сертификаты, я бы даже не спросил. В этом контексте нет «правильного» способа использования X509. M2Crypto имеет функцию выполнения пользовательских проверок SSL.Context.set_verify (,, callback()), но я не нахожу документацию. – Kiwi