如何在Python SSL库中从PEM字符串加载CRL用于SSL验证?
如何在Python SSL上下文中直接加载PEM格式CRL(无需写入磁盘文件)
首先得明确:你不能直接用load_verify_locations(cadata=crl_data)来加载CRL——这个cadata参数是专门用来加载CA证书链的,不是给CRL用的,这就是你触发异常的原因。不过不用慌,有两种不用写磁盘文件就能加载CRL的方案:
方案1:把CRL和CA证书打包成一个PEM字符串传入
如果你的验证逻辑需要同时用到CA证书(用来验证证书合法性)和CRL(用来检查证书是否被吊销),可以把PEM格式的CA证书和CRL合并成一个字符串,一起传给cadata。代码示例:
import ssl if __name__ == "__main__": # 假设从webservice拿到的CRL数据 # crl_data = fetch_crl_from_webservice() # 加载CA证书数据(也可以从webservice获取) with open("path/to/your/ca_cert.pem", "r") as f: ca_cert_data = f.read() # 把CA证书和CRL合并成一个PEM格式的字符串 combined_pem = ca_cert_data + "\n" + crl_data # 创建SSL上下文 ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) # 传入合并后的PEM数据 ctx.load_verify_locations(cadata=combined_pem) # 重点!必须开启验证模式才会用CRL检查吊销 ctx.verify_mode = ssl.CERT_REQUIRED ctx.check_hostname = True
方案2:用内存临时文件加载CRL
如果你不想把CA和CRL混在一起,或者需要单独管理CRL,可以用Python的tempfile模块创建一个内存中的临时文件,这样既不用写磁盘,又能通过文件路径的方式加载CRL。代码示例:
import ssl import tempfile if __name__ == "__main__": # 从webservice获取的CRL数据 # crl_data = fetch_crl_from_webservice() ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) # 先加载CA证书(如果需要) ctx.load_verify_locations("path/to/your/ca_cert.pem") # 创建内存临时文件,写入CRL数据 with tempfile.SpooledTemporaryFile(mode='w+', suffix='.pem') as temp_crl_file: temp_crl_file.write(crl_data) temp_crl_file.seek(0) # 回到文件开头,确保能被读取 # 通过临时文件路径加载CRL ctx.load_verify_locations(cafile=temp_crl_file.name) # 开启验证模式,启用CRL检查 ctx.verify_mode = ssl.CERT_REQUIRED ctx.check_hostname = True
几个重要提醒
- 不管用哪种方案,一定要设置
ctx.verify_mode = ssl.CERT_REQUIRED——默认情况下Python不会启用CRL验证,就算你加载了CRL也不会生效。 - 确保你的CRL是标准的PEM格式,必须包含
-----BEGIN X509 CRL-----和-----END X509 CRL-----这两个标记,否则加载会失败。 - 如果你的场景真的只需要CRL(几乎很少见,一般都需要CA证书来验证证书本身),直接把CRL字符串传给
cadata也能行,但要确认你的OpenSSL环境支持这种方式。
内容的提问来源于stack exchange,提问作者zpasztor
相关产品推荐
相关产品推荐

