如何在python中验证服务器的ssl证书?

时间:2015-03-09 23:13:11

标签: python ssl certificate verify

我已将服务器配置为仅提供https以创建自签名证书。我有一个客户端,我必须验证服务器的证书,然后从服务器下载文件。

如何在客户端实施验证?有代码示例吗?

我的问题与此类似:How can the SSL client validate the server's certificate? 但是虽然很好的解释,我没有找到任何帮助。

到目前为止,在我的代码中我创建了一个目录,然后我用urllib2下载了该文件:

[...] #imports

def dir_creation(path):
try:
    os.makedirs(path)
except OSError as exception:
    if exception.errno != errno.EEXIST:
        raise


def file_download(url):
ver_file = urllib2.urlopen(url)
data = ver_file.read()
with open(local_filename, "wb") as code:
    code.write(data)

dir_creation(path)
file_download(url)

1 个答案:

答案 0 :(得分:3)

您应该使用自签名证书作为证书颁发机构来签署服务器证书,而不是将服务器配置为提供自签名证书。 (如何做到这一点超出了你的问题的范围,但我相信你可以在Stack Overflow或其他地方找到帮助。)

现在,您必须将客户端配置为信任您的证书颁发机构。在python(2.7.9或更高版本)中,您可以使用ssl模块执行此操作:

import ssl

...  # create socket

ctx = ssl.create_default_context(cafile=path_to_ca_certificate)
sslsock = ctx.wrap_socket(sock)

然后,您可以在安全套接字上传输和读取数据。有关详细说明,请参阅ssl module documentation

urllib2 API更简单:

import urllib2

resp = urllib2.urlopen(url, cafile=path_to_ca_certificate)
resp_body = resp.read()

如果您希望使用请求,根据文档,您可以supply a path to the CA certificate作为verify参数的参数:

resp = requests.get(url, verify=path_to_ca_certificate)