使用Python在内存中的文件对象

时间:2010-08-08 03:05:44

标签: python file memory

我不确定如何准确地说出来,但我有一个脚本从Web服务器下载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 个答案:

答案 0 :(得分:4)

urllib的响应是文件对象。只需使用那些使用实际文件的地方。这假设消耗文件对象的代码当然不需要写入它们。

答案 1 :(得分:4)

哇,不要这样做。你每次都在点击cacert的网站吗?那令人难以置信的粗鲁和不必要的吃掉他们的资源。这也是一个非常糟糕的安全实践。您应该获得根证书一次并验证它是正确的根证书而不是伪造,否则您不能依赖它签名的证书的有效性。

缓存他们的根证书,或者更好的是,将其与您系统上的其他根证书一起安装。

答案 2 :(得分:1)

在以下行中:

temp_file.write(root_cert.read())

您实际上是在将证书读入内存并再次将其写出来。该行相当于:

filedata = root_cert.read()
temp_file.write(filedata)

现在filedata是一个包含根证书字节的变量,您可以以任何您喜欢的方式使用它(包括不将其写入temp_file并使用它做其他事情。)< / p>