gpt4 book ai didi

python - 使用 Python smtplib 发送没有 key 文件(仅 certfile)的电子邮件

转载 作者:太空宇宙 更新时间:2023-11-04 01:16:31 26 4
gpt4 key购买 nike

尝试使用以下脚本发送带有证书文件的电子邮件:

import smtplib

client = smtplib.SMTP(myhost, myport)
client.ehlo()
client.starttls(certfile=mycertfile)
client.ehlo()

client.login(myusername, mypassword)
client.sendmail(sender, receiver, Message)
client.quit()

我收到以下错误:

SSLError: error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib

我认为文档(smtplib.htmlssl.html)说我需要提供私钥。我只有证书文件(base64 PEM 格式)。我的 devops 说在这种情况下不需要私钥,因为我不需要识别连接的本地端。

问题

有没有办法在不提供私钥的情况下发送电子邮件?如果需要私钥,为什么?

最佳答案

有两种使用 SSL/TLS 的方式:经过客户端身份验证的方式和客户端未经身份验证的“基本”方式。在经过客户端身份验证的连接中,服务器和客户端都向对方发送证书。在“基本”中,只有服务器会这样做。

如果您既没有通过证书也没有通过 key 文件,smtplib将使用基本连接,其中客户端已通过身份验证。

如果您使用证书,它将用于客户端验证连接。在这种情况下,服务器将要求客户端通过签署握手消息来表明它拥有该证书。为了使客户端能够做到这一点,它还需要私钥,私钥可以在证书文件中,也可以作为单独的 key 文件。

长话短说,如果要使用客户端证书,还必须使用 key 。如果没有,您可以将两者都留空。


OTOH,也许您有要用于连接的服务器证书文件或 CA 列表?

在这种情况下,您需要将其传递给 ssl.wrap_socketca_certs范围。由于您使用的是 Python 2.6,因此没有简单的方法可以使用 smtplib 来做到这一点。 (Python 3.3+ 有一个 context 参数到 starttls )。

如何解决这个问题取决于您的应用程序。例如,如果您不需要 ssl对于其他任何事情,一个骇人听闻的解决方案是使用 monkey-patch ssl.wrap_socket与一个提供你的 ca_cert (可能还有 cert_reqs=CERT_REQUIRED)。

一个更完善的解决方案是扩展 smtplib.SMTP使用您自己的允许传递这些参数的变体。

关于python - 使用 Python smtplib 发送没有 key 文件(仅 certfile)的电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24250020/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com