【问题标题】:SSL error on Raspberry Pi树莓派上的 SSL 错误
【发布时间】:2013-06-10 19:15:24
【问题描述】:

我最近购买了一个 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

【问题讨论】:

  • openssl version,然后openssl s_client -connect smtp.live.com:587 -starttls smtp 你得到250 OK吗?
  • 是的,没有任何问题
  • 那么它可能比libssl更与python相关。对我来说,它闻起来不兼容的密码配置。我会尝试那样挖掘。

标签: python openssl raspberry-pi smtplib raspbian


【解决方案1】:

我昨天遇到了这个问题。首先要尝试的是更改您要从中向其他提供商发送电子邮件的帐户:例如,尝试使用 gmail。就我而言,它立即开始工作。

如果您也是这种情况(微软的错?),请使用 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 you can give an additional context argument instarttls 中,您应该能够在context 中定义一些密码参数。选项列表可以在here 找到。
我必须承认,我只使用 gmail 帐户比获得 python 3.3 更容易(在 rpi 上,你有 3.2,无法指定上下文),甚至不确定它是否会有所帮助。不过,我希望这些信息对您有所帮助。

【讨论】:

  • 第一行甚至在 ehlo 之后就提出了wrong version number,甚至不让我登录。第二个字符串似乎有效,如果我找不到通过脚本指定它的方法,我可能会尝试通过 os.system 传递它并从那里工作
猜你喜欢
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 2018-07-08
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多