ssl.SSLError:[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败,Python套接字,ssl,gmail smtp连接

时间:2017-06-03 12:49:27

标签: python sockets email ssl

我想使用安全套接字连接到gmail SMTP服务器。我已经使用我的浏览器下载了mail.google.com.crt证书文件 - Firefox(我只是打开了一个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()

1 个答案:

答案 0 :(得分:1)

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

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

  

加载一组用于验证其他同行证书的“证书颁发机构”(CA)证书......