Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python在内存中创建文件对象_Python_File_Memory - Fatal编程技术网

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

使用Python在内存中创建文件对象,python,file,memory,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.urlope

我不知道该如何确切地说,但我有一个脚本,可以从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']

来自
urllib
的响应是一个文件对象。只要在使用实际文件的地方使用这些文件即可。这是假设使用文件对象的代码当然不需要写入它们。

下一行:

temp_file.write(root_cert.read())
实际上,您正在将证书读入内存,然后再次将其写出。这条线相当于:

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

现在,
filedata
是一个包含根证书字节的变量,您可以以任何方式使用它(包括不将其写入
temp\u文件,而是使用它执行其他操作)。

哇,不要这样做。你每次都访问cacert的网站?这太粗鲁了,不必要地消耗了他们的资源。这也是非常糟糕的安全措施。您应该获得根证书一次,并验证它是正确的根证书,而不是伪造的,否则您不能依赖由它签名的证书的有效性


缓存他们的根证书,或者更好的方法是,按照您的要求将其与系统上的其余根证书一起安装。

我尝试过,它会产生以下错误类型错误:sslwrap()参数7必须是字符串或无,不是instanceit看起来像是ssl。wrap_socket
需要证书的文件名,并自己打开文件是的。有没有办法在内存中创建一个看起来像实际文件名的变量来欺骗它?据我所知,这些文件是以c扩展名打开的。因此,在不重写代码的情况下,改变这种行为的可能性不大。我认为你是对的。我想我会保持原样。不管怎么说,它都起作用了。谢谢你的帮助。我明白你的意思,但我无法让它与ssl.wrap_套接字一起正常工作。当我这样做时,我得到以下错误ssl.SSLError:[Errno 185090050]\u ssl.c:326:error:0B084002:x509证书例程:x509\u load\u cert\u crl\u file:system lib我想这正是ssl.wrap\u socket所期望的格式。我只能通过在磁盘上输入一个物理文件来让它工作。我同意你的看法。我不是每次都打。仅当文件不存在时。不过,这个脚本根本不是关于安全性的。这只是一个简单的脚本,用于查询服务器的证书以查看其何时过期。我不在乎它的有效性,因为它是我的服务器。我只想提醒我到期日期,因为我监控了数百个证书。如果你有一个解决方案,只提取过期,这将是最好的为我。