Мне нужно создать зашифрованное соединение между двумя узлами, и мне нужно аутентифицировать обоих.
Оба узла уже имеют отпечаток (хэш SHA256) другого открытого ключа узла.
Я не использую ключи / сертификаты X509 или OpenPGP, так как они слишком большие и громоздкие для моих нужд и не соответствуют модели безопасности.
Я пытаюсь установить соединение с M2Crypto (хорошая библиотека), злоупотребляя его моделью x509:
с учетом закрытого ключа rsa создайте самоподписанный почти пустой сертификат.
подключиться к другому партнеру, предлагающему мой сертификат
проверка отпечатка пальца другого открытого сертификата сертификата;
Безопасен ли следующий код? это правильно? Есть ли способ сделать это лучше (может быть, с другими библиотеками)?
Я сомневаюсь, что OpenSSL фактически не использует открытый ключ сертификата для аутентификации, поскольку я не запрашиваю никакой проверки сертификатов.
Мне просто нужно использовать зашифрованные потоки, аутентифицированные ключами 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()
Спасибо всем заранее за ваши ответы и советы.