python - ssl.SSLError : [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed, Python 套接字、ssl、gmail smtp 连接

标签 python sockets email ssl

我想使用安全套接字连接到 gmail SMTP 服务器。我已经使用我的浏览器 - Firefox 下载了 mail.google.com.crt 证书文件(我只是打开了一个 gmail.com 页面,然后使用我的浏览器导出了证书导出证书按钮)。

不过好像有问题,不知道是什么原因。当我将 mail.google.com.crt 更改为 GeoTrustGlobalCA.pem(我在网上某处找到它)时,它起作用了(没有显示错误)。我是不是没看懂?

if __name__ == '__main__':

    HOST = 'smtp.gmail.com'
    PORT = 465

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((HOST, PORT))

    context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
    context.verify_mode = ssl.CERT_REQUIRED
    context.load_verify_locations('mail.google.com.crt')

    # check SNI extension
    if ssl.HAS_SNI:
        secure_sock = context.wrap_socket(sock, server_hostname=HOST)
    else:
        secure_sock = context.wrap_socket(sock)

    cert = secure_sock.getpeercert()
    print cert

    if not cert or ('commonName', 'smtp.google.com') not in cert['subject'][4]: raise Exception("erroe" )

    secure_sock.recv(1024)

    secure_sock.close()
    sock.close()

最佳答案

context.load_verify_locations('mail.google.com.crt')

验证位置应包含受信任的 CA 证书。您指定的服务器证书不是 CA 证书。来自documentation :

Load a set of “certification authority” (CA) certificates used to validate other peers’ certificates ...

关于python - ssl.SSLError : [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed, Python 套接字、ssl、gmail smtp 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44344125/

相关文章:

Python 从列表中删除特定的重复项

python - "while 1"和 "while True"有什么区别?

sockets - 当所有 IP 地址都相同时,指定用于 UDP 写入的以太网端口

email - Sonar 定期电子邮件报告

python - Django 不会提供我的 CSS 或 Javascript 文件——静态文件

java - 如何在java中将接收到的字节显示为文本?

java - 通过 socket 包裹

ruby-on-rails - 主机名与服务器证书不匹配-无法发送电子邮件

java - 如何在 GWT 应用程序中发送电子邮件

python - Python (Twisted + ZSI) 中的 Web 服务调用在 chroot jail 中不起作用