Python M2Crypto.SSL.Checker.NoCertificate Exception - PullRequest
0 голосов
/ 03 апреля 2012

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

У меня странная причуда с модулем 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

Ответы [ 2 ]

0 голосов
/ 04 апреля 2012

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

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

0 голосов
/ 03 апреля 2012

Могу я спросить ... вы уверены, что это не просто проверка одного сертификата, а проверка единственного сертификата, который вы установили в вашем хранилище сертификатов "/ etc / ssl / certs /"

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

...