Python无法验证SSL/TLS连接的任何CRL

Python无法验证SSL/TLS连接的任何CRL,python,ssl,Python,Ssl,在Python3.4中,一种verify\u flags,通过将其设置为verify\u CRL\u check\u LEAF或verify\u CRL\u check\u CHAIN,可以用来检查证书是否被撤销 我写了一个简单的测试程序。但在我的系统上,这个脚本无法验证任何连接,即使它完全有效 import ssl import socket def tlscheck(domain, port): addr = domain ctx = ssl.create

在Python3.4中,一种
verify\u flags
,通过将其设置为
verify\u CRL\u check\u LEAF
verify\u CRL\u check\u CHAIN
,可以用来检查证书是否被撤销

我写了一个简单的测试程序。但在我的系统上,这个脚本无法验证任何连接,即使它完全有效

import ssl
import socket

def tlscheck(domain, port):
        addr = domain

        ctx = ssl.create_default_context()
        ctx.options &= ssl.CERT_REQUIRED
        ctx.verify_flags = ssl.VERIFY_CRL_CHECK_LEAF

        ctx.check_hostname = True

        #ctx.load_default_certs()
        #ctx.set_default_verify_paths()
        #ctx.load_verify_locations(cafile="/etc/ssl/certs/ca-certificates.crt")

        sock = ctx.wrap_socket(socket.socket(), server_hostname=addr)
        sock.connect((addr, port))

        import pprint
        print("TLS Ceritificate:")
        pprint.pprint(sock.getpeercert())
        print("TLS Version:", sock.version())
        print("TLS Cipher:", sock.cipher()[0])
        exit()

tlscheck("stackoverflow.com", 443)
我的代码总是随着ssl.SSLError:[ssl:CERTIFICATE\u VERIFY\u FAILED]CERTIFICATE VERIFY FAILED(\u ssl.c:645)退出

首先,我怀疑证书数据库没有正确加载。但在我尝试了加载默认证书(),
设置默认验证路径()
加载验证位置(cafile=“/etc/ssl/certs/ca certificates.crt”)
之后,它们都不起作用

另外,
ctx.options&=ssl.CERT\u REQUIRED
也可以按预期工作,它可以判断证书链是否受信任。但不适用于CRL。。。这也表明我的CA是正确的


我知道“/etc/ssl/certs/ca certificates.crt”包含有效的ca。问题是什么?

要检查CRL,您必须手动下载CRL并将其放置在正确的位置,以便底层OpenSSL库能够找到它。没有自动下载CRL,并且指定查找CRL的位置也不直观。您可以做什么:

  • 从证书中获取CRL分发点。对于stackoverflow.com,一个是
  • 从那里下载当前的CRL
  • 将其从DER格式转换为PEM格式,因为这是下一步的预期内容:
    opensslcrl-inform der-in-sha2-ha-server-g5.crl>sha2-ha-server-g5.crl.pem
  • 将位置添加到验证位置:
    ctx.load\u verify\u位置(cafile=“./sha2-ha-server-g5.crl.pem”)

这样,您可以根据CRL验证证书

要检查CRL,您必须手动下载CRL并将其放置在正确的位置,以便底层OpenSSL库能够找到它。没有自动下载CRL,并且指定查找CRL的位置也不直观。您可以做什么:

  • 从证书中获取CRL分发点。对于stackoverflow.com,一个是
  • 从那里下载当前的CRL
  • 将其从DER格式转换为PEM格式,因为这是下一步的预期内容:
    opensslcrl-inform der-in-sha2-ha-server-g5.crl>sha2-ha-server-g5.crl.pem
  • 将位置添加到验证位置:
    ctx.load\u verify\u位置(cafile=“./sha2-ha-server-g5.crl.pem”)

这样,您可以根据CRL验证证书

无需将文件保存到磁盘或手动转换,因为
load\u verify\u locations()。无论如何,Python中的
ssl
模块有一个糟糕的设计,它没有提供任何API来检查已知证书是否被吊销!这意味着我无法在创建连接后检查CRL,但需要一个两次通过的过程:建立一个连接以获取CRL,并建立另一个连接以进行通信……无论如何,它是在一个忽略正确加密的时代编写的@比尔盖子: 这实际上是底层openssl库的设计。除此之外,您通常不希望加载巨大的CRL文件来检查吊销。要走的路是OCSP。但是看起来python不支持一种简单的OCSP检查方法,类似于其他各种编程语言。是的,这正是问题所在。各种语言的斯诺登之前的加密标准库都存在这些问题。不必将文件保存到磁盘,也不必手动转换,因为
load\u verify\u locations()
接受一个名为
cadata
的参数,其中二进制bytestring可以以DER或PEM格式传递。非常感谢。无论如何,Python中的
ssl
模块有一个糟糕的设计,它没有提供任何API来检查已知证书是否被吊销!这意味着我无法在创建连接后检查CRL,但需要一个两次通过的过程:建立一个连接以获取CRL,并建立另一个连接以进行通信……无论如何,它是在一个忽略正确加密的时代编写的@比尔盖子: 这实际上是底层openssl库的设计。除此之外,您通常不希望加载巨大的CRL文件来检查吊销。要走的路是OCSP。但是看起来python不支持一种简单的OCSP检查方法,类似于其他各种编程语言。是的,这正是问题所在。各种语言的斯诺登之前的加密标准库都存在这些问题。