使用Python在内存中创建文件对象

2 投票
3 回答
4838 浏览
提问于 2025-04-16 02:29

我不太确定怎么表达这个问题,但我有一个脚本,它可以从一个网络服务器下载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 得到的响应是一个文件对象。你只需要在使用实际文件的地方用这个文件对象代替就可以了。当然,这里假设使用这些文件对象的代码不需要对它们进行写入操作。

撰写回答