openssl,python 请求错误:“证书验证失败”

作者:编程家 分类: python 时间:2025-05-05

在使用Python进行网络请求时,我们经常会遇到一些证书验证的问题。其中一个常见的错误就是“证书验证失败”。这个错误通常是由于服务器返回的SSL证书无法通过验证导致的。为了解决这个问题,我们可以使用OpenSSL库来进行证书验证。

在进行网络请求时,我们经常会使用到Python的requests库。这个库提供了一种简单而强大的方式来发送HTTP请求。然而,在使用requests库发送HTTPS请求时,如果服务器返回的SSL证书无法通过验证,我们就会遇到“证书验证失败”的错误。

为了解决这个问题,我们可以使用OpenSSL库来手动进行证书验证。OpenSSL是一个开源的加密工具库,可以用于进行SSL/TLS协议的实现和证书的管理。通过使用OpenSSL库,我们可以自定义证书验证的逻辑,从而解决这个错误。

下面是一个使用OpenSSL库进行证书验证的示例代码:

python

import requests

import OpenSSL

def verify_certificate(cert):

store = OpenSSL.crypto.X509Store()

store.add_cert(cert)

ctx = OpenSSL.SSL.Context(OpenSSL.SSL.TLSv1_2_METHOD)

ctx.set_verify(OpenSSL.SSL.VERIFY_PEER, None)

ctx.set_cert_store(store)

conn = OpenSSL.SSL.Connection(ctx)

conn.set_connect_state()

conn.set_tlsext_host_name("example.com")

conn.do_handshake()

return conn.get_peer_certificate()

def make_request(url):

response = requests.get(url, verify=False)

cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, response.content)

verified_cert = verify_certificate(cert)

return verified_cert

url = "https://example.com"

cert = make_request(url)

print(cert.get_subject().CN)

在上面的代码中,我们首先定义了一个`verify_certificate`函数,用于验证证书的有效性。在这个函数中,我们创建了一个X509Store对象,并将服务器返回的证书添加到这个对象中。然后,我们创建了一个SSL Context对象,并设置了证书验证的方式。接下来,我们创建了一个SSL Connection对象,并进行了握手操作,以验证证书的有效性。最后,我们通过调用`get_peer_certificate`方法,获取到经过验证的证书。

在`make_request`函数中,我们使用requests库发送了一个HTTPS请求,并将服务器返回的证书通过OpenSSL库进行验证。最后,我们打印了验证后的证书的主题信息。

通过使用OpenSSL库,我们可以自定义证书验证的逻辑,从而解决“证书验证失败”的问题。这样,我们就可以在进行网络请求时,更好地保护数据的安全性。