Мне нужно создать зашифрованное соединение между двумя одноранговыми узлами, и мне нужно аутентифицировать оба. Оба партнера уже имеют отпечаток пальца (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()
Спасибо всем заранее за ваши ответы и советы.
Спасибо. Это все, что мне нужно знать! В любом случае, я думаю об использовании SSL.Checker для элегантности, но я не знаю, является ли «отпечаток пальца» X509 уже дайджестом ключа DER, или он является дайджестом полного сертификата (включая ключ и поля)? Поскольку я могу генерировать сертификаты с открытого ключа, я опасаюсь, что незначительные изменения в OpenSSL могут генерировать разные отпечатки пальцев и нарушать вещи. Если это так, что делать с собственным классом Checker или наследовать его? это считается элегантным или довольно взломанным? – Kiwi
В SSL.Checker этот отпечаток означает принятие хэша всего сертификата в формате DER. Я считаю, что это то же самое, что и opensl x509 -fingerprint. Если вы вычисляете отпечаток пальца по-другому, вы, конечно, можете свободно писать свою рутину. –