Ошибка SSL на Raspberry Pi

Недавно я купил Raspberry Pi для запуска некоторых скриптов Python, но когда я портировал его, функция, которую я написал для отправки электронных писем через Windows Live, внезапно начала выдавать ошибку SSL после успешного рукопожатия, а именно:

error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number

После долгих поисков я нашел много людей с одной и той же ошибкой, но все в совершенно разных ситуациях. Самое важное, что я смог найти, это то, что это проблема с определенной версией OpenSSL, но я ничего не смог найти о версии, работающей на моем Pi (1.0.1e).

Функция (которая прекрасно работает на Win7):

def wlive(adr_to, adr_fro, adr_pass, adr_subj, adr_file):

    saveout = smtplib.stderr
    logger = open('wlive.log', 'w')
    smtplib.stderr = logger

    msg = MIMEMultipart()
    msg['Subject'] = adr_subj
    msg['From'] = adr_fro
    msg['To'] = adr_to


    if adr_file != None:
    # subtype recognition based on extension
        filext = os.path.splitext(adr_file)[1]
        if filext == '.png':
            subt = 'png'
        else:
            subt = 'jpeg'

        fp = open(adr_file, 'rb')
        img = MIMEImage(fp.read(), subt)
        fp.close()
        msg.attach(img)


    try: 
        server = smtplib.SMTP('smtp.live.com', 587)
        server.set_debuglevel(1)
        server.ehlo()
        server.starttls()
        server.login(adr_fro, adr_pass)
        server.sendmail(adr_fro, adr_to, msg.as_string())
        server.quit()
        return True

    except Exception, e:
        print 'wlive exception:\n\n', str(e)
        return False

    smtplib.stderr = saveout
    logger.close()

Я запускаю полностью обновленный и обновленный образ Raspbian «Wheezy» и Python 2.7.3.


person Rutger Semp    schedule 10.06.2013    source источник
comment
openssl version, затем openssl s_client -connect smtp.live.com:587 -starttls smtp получается 250 OK?   -  person Michael Tabolsky    schedule 10.06.2013
comment
Да вообще без вопросов   -  person Rutger Semp    schedule 15.06.2013
comment
Тогда это, вероятно, больше связано с python, чем с libssl. Для меня это пахнет несовместимой конфигурацией шифров. Я бы попробовал копать так.   -  person Michael Tabolsky    schedule 15.06.2013


Ответы (1)


Я столкнулся с этой проблемой вчера. Первое, что нужно попробовать, это изменить учетную запись, с которой вы хотите отправить электронное письмо другому провайдеру: например, попробуйте gmail. В моем случае это заработало мгновенно.

Если у вас тоже так (вина Microsoft?), попробуйте еще что-нибудь с учетной записью Windows Live (аналогично тому, что предложено в комментарии):
openssl s_client -connect smtp.live.com:587 -starttls smtp -crlf -ign_eof

затем введите:
ehlo
auth login
В моем случае ничего не произошло. Нет ответа, только тайм-аут чтения. В этот раз попробуйте:
openssl s_client -connect smtp.live.com:587 -starttls smtp -crlf -ign_eof -no_tls1_2
Затем:
ehlo
auth login
Мне сразу же ответили. Если это все еще ваш случай, есть небольшая проблема. Я не нашел способа указать такой параметр (какие версии tls не использовать). Я обнаружил, что в python 3.3 вы можете указать дополнительный аргумент контекста instarttls< /a>, и вы сможете определить некоторые параметры шифрования в этом контексте< /а>. Список опций можно найти здесь.
Должен признать, что мне было проще просто использовать учетную запись gmail, чем получить python 3.3 (на rpi у вас 3.2 без возможности указания контекста), даже не будучи уверенным, что это поможет. Тем не менее, я надеюсь, что эта информация хоть как-то вам поможет.

person mmateoo    schedule 15.06.2013
comment
Первая строка поднимает wrong version number даже сразу после ehlo, даже не позволяет мне войти в систему. Кажется, вторая строка работает, я мог бы просто попытаться передать ее через os.system и работать оттуда, если я не могу найти способ указать ее через скрипт - person Rutger Semp; 17.06.2013