使用Python在内存中创建文件对象
我不太确定怎么表达这个问题,但我有一个脚本,它可以从一个网络服务器下载SSL证书,以检查它的到期日期。
为了做到这一点,我需要下载CA证书。目前,我把它们写入/tmp目录下的一个临时文件,然后再读取回来,但我相信一定有办法可以不写入磁盘就完成这个操作。
下面是下载证书的代码部分:
CA_FILE = '/tmp/ca_certs.txt'
root_cert = urllib.urlopen('https://www.cacert.org/certs/root.txt')
class3_cert = urllib.urlopen('https://www.cacert.org/certs/class3.txt')
temp_file = open(CA_FILE, 'w')
temp_file.write(root_cert.read())
temp_file.write(class3_cert.read())
temp_file.close()
编辑:
这是使用文件来获取证书的代码部分:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = ssl.wrap_socket(s, ca_certs=CA_FILE, cert_reqs=ssl.CERT_REQUIRED)
ssl_sock.connect(('mail.google.com', 443))
date = ssl_sock.getpeercert()['notAfter']
3 个回答
1
在下面这一行:
temp_file.write(root_cert.read())
你实际上是在把证书读入内存,然后再把它写出来。这一行的意思和下面的代码是一样的:
filedata = root_cert.read()
temp_file.write(filedata)
现在,filedata
是一个变量,里面存储着根证书的字节数据,你可以随意使用它(比如不把它写入 temp_file
,而是用它做其他事情)。
4
哇,别这么做。你每次都去访问cacert的网站吗?这实在是太不礼貌了,而且还浪费他们的资源。这样做的安全性也非常差。你应该只获取一次根证书,然后确认它是正确的根证书,而不是伪造的,否则你就不能信任由它签发的证书的有效性。
把他们的根证书缓存起来,或者更好的是,像应该做的那样,把它和你系统上的其他根证书一起安装。
4
从 urllib
得到的响应是一个文件对象。你只需要在使用实际文件的地方用这个文件对象代替就可以了。当然,这里假设使用这些文件对象的代码不需要对它们进行写入操作。