Я потянулся к 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
Это тянет сертификат от веб-сервера, размещенного на другой системе. Он использует файлы «.pem» в/etc/ssl/certs, чтобы определить, какие CAs доверены, а затем проверять их. В дистрибутивах Debian есть несколько файлов .pem, размещенных в '/ etc/ssl/certs'. Такая же проблема возникает и в системе Mac OS X, используя один файл, который был создан из доверенных центров сертификации Mozilla. – theckman
Библиотека Python ssl построена поверх OpenSSL. Попробуйте вручную проверить сертификаты для подтверждения правильности настройки хранилища сертификатов. Правильное использование/etc/ssl/certs может быть проблемой. Вы можете проверить сертификаты, используя «Проверка OpenSSL». http://www.madboa.com/geek/openssl/#verify-standard – user590028
Магазин сертификатов здесь не является проблемой. Когда мы проверяем один IP-адрес, он корректно проверяет. Он подключается, и наши проверки проверки работают. При попытке подключения для получения сертификата от любых последующих хостов мы получаем исключение NoCertificate. Поведет ли я, что он не получает сертификат с сервера, как это происходит во время подключения. OpenSSL также проверяет, что хранилище действительно. Traceback: http://paste.pocoo.org/show/575594/ – theckman