2012-04-02 2 views
0

Я потянулся к comp.lang.python, чтобы узнать, есть ли у кого-нибудь идеи по этой проблеме. Я не получил ответа в списке рассылки, поэтому решил обратиться сюда.Python M2Crypto.SSL.Checker.NoCertificate Exception

У меня есть странная причуда с модулем M2Crypto, и я надеюсь, что кто-то сможет указать мне в правильном направлении. Я работаю с коллегой по разработке внутреннего инструмента для проверки SSL-сертификатов в списке адресов IPv4, полученных через stdin.

Мы используем M2Crypto для проверки сертификатов. Если мы проверим только один IPv4-адрес, он сможет предоставить нам правильный сертификат, и мы сможем выполнить наши проверки проверки информации, содержащейся в сертификате SSL.

Однако, если мы попытаемся проверить несколько адресов IPv4, мы получим «M2Crypto.SSL.Checker.NoCertificate». В некоторых случаях мы должны получать это. Однако, независимо от того, какой второй или третий IPv4-адрес (даже если он прошел проверку как первый), он не удастся.

создание контекста:

global context 

    context = M2Crypto.SSL.Context() 
    if sys.platform.startswith('linux'): 
      context.load_verify_info(capath="/etc/ssl/certs/") 
    elif sys.platform.startswith('darwin'): 
      context.load_verify_info(cafile=certfile) 
    else: 
      print "Unknown platform, bail!" 
      exit(1) 
    context.set_allow_unknown_ca(True) 
    context.set_verify(M2Crypto.SSL.verify_none,9) 

Создание сокета:

conn = M2Crypto.SSL.Connection(context) 
    socket.setdefaulttimeout(2.0) 
    conn.set_socket_read_timeout(M2Crypto.SSL.timeout(sec=2)) 
    conn.set_socket_write_timeout(M2Crypto.SSL.timeout(sec=2)) 

    try: 
      conn.connect((ip,443)) 
    # we can the catch the exception here, but it shouldn't be failing 

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

Последний блок вызывается как часть цикла по массиву адресов. IP передается от вызывающего.

-Tim

ответ

0

Могу ли я спросить ... ты уверена, что это не просто проверка одного сертификата, но вместо этого подтверждения вы установили в вашем CERT-магазине «/ и т.д./SSL/сертификаты /» только сертификат

http://www.madboa.com/geek/openssl/#verify-new

+0

Это тянет сертификат от веб-сервера, размещенного на другой системе. Он использует файлы «.pem» в/etc/ssl/certs, чтобы определить, какие CAs доверены, а затем проверять их. В дистрибутивах Debian есть несколько файлов .pem, размещенных в '/ etc/ssl/certs'. Такая же проблема возникает и в системе Mac OS X, используя один файл, который был создан из доверенных центров сертификации Mozilla. – theckman

+0

Библиотека Python ssl построена поверх OpenSSL. Попробуйте вручную проверить сертификаты для подтверждения правильности настройки хранилища сертификатов. Правильное использование/etc/ssl/certs может быть проблемой. Вы можете проверить сертификаты, используя «Проверка OpenSSL». http://www.madboa.com/geek/openssl/#verify-standard – user590028

+0

Магазин сертификатов здесь не является проблемой. Когда мы проверяем один IP-адрес, он корректно проверяет. Он подключается, и наши проверки проверки работают. При попытке подключения для получения сертификата от любых последующих хостов мы получаем исключение NoCertificate. Поведет ли я, что он не получает сертификат с сервера, как это происходит во время подключения. OpenSSL также проверяет, что хранилище действительно. Traceback: http://paste.pocoo.org/show/575594/ – theckman

0

Таким образом, после рытья вокруг него получается, установив тайм-аут (ы) вызывает проблемы. Я удалил следующий код, и он начал работать отлично.

socket.setdefaulttimeout(2.0) 
conn.set_socket_read_timeout(M2Crypto.SSL.timeout(sec=2)) 
conn.set_socket_write_timeout(M2Crypto.SSL.timeout(sec=2)) 

-Tim