Python M2Crypto SSL: невозможно получить сертификат локального эмитента - PullRequest
1 голос
/ 12 марта 2012

Я пытаюсь заставить работать равноправную аутентификацию с использованием сертификатов X509 / M2Crypto.SSL

  1. Я создаю корневой CA (эмитент & subject = ca_hostC) на клиенте (hostC)

  2. Я подписываю сертификат клиента локально с этим CA (эмитент: ca_hostC, субъект: hostC)

  3. Я генерирую CSR на хосте, копирую егов hostC, подпишите его с помощью корневого CA из шага 1 и переместите ca_cert и подписанный сертификат в hostS.

Я создаю контекст:

import M2Crypto.SSL as SSL
ctx = SSL.Context('tlsv1')
ctx.load_cert('x.crt', 'private/x.key')
ctx.load_verify_locations(cafile='ca.crt')
ctx.set_verify ( SSL.verify_peer | SSL.verify_fail_if_no_peer_cert , 0, verify_callback)

Iconnect:

s = SSL.Connection(ctx)
s.connect(server_address)

, но на клиенте я получаю

ERROR: 20
unable to get local issuer certificate

, однако, когда я печатаю тему и издателя сертификата, полученного с сервера, я вижу правильную информацию.Кроме того, сертификат можно проверить из утилиты командной строки openssl.

Есть мысли ??

1 Ответ

0 голосов
/ 12 марта 2012

понял - почему-то я думал, что глубина = 0 означает бесконечную глубину. из документации openssl

глубина: установить предел, до которого сертификаты глубины в цепочке используются во время процедуры проверки. Если цепочка сертификатов длиннее допустимой, сертификаты, превышающие ограничение, игнорируются. Сообщения об ошибках генерируются так, как если бы эти сертификаты не присутствовали, скорее всего, будет выдано X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY . Глубина отсчета

level 0: peer certificate, 
level 1: CA certificate, 
level 2: higher level CA certificate, 

и так далее. Установка максимальной глубины до 2 допускает уровни 0, 1 и 2. Предельное значение глубины по умолчанию - 9, что позволяет для сертификата однорангового узла и дополнительных 9 сертификатов CA.

...