m2crypto таможенная проверка сертификата - PullRequest
1 голос
/ 29 января 2010

Мне нужно создать зашифрованное соединение между двумя узлами, и мне нужно аутентифицировать обоих. Оба узла уже имеют отпечаток (хэш 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()

Спасибо всем заранее за ваши ответы и советы.

Ответы [ 2 ]

0 голосов
/ 29 января 2010

Кажется, ваш подход должен работать, но уже есть встроенная проверка отпечатков пальцев, которую вы могли бы использовать. См. Здесь: Что указать для общего имени при создании ключа OpenSSL?

0 голосов
/ 29 января 2010

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

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

...