【问题标题】:File object in memory using Python使用Python在内存中的文件对象
【发布时间】:2010-08-08 03:05:43
【问题描述】:

我不知道如何准确地表达这一点,但我有一个脚本可以从 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']

【问题讨论】:

    标签: python file memory


    【解决方案1】:

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

    【讨论】:

    • 我试过了,它会产生以下错误 TypeError: sslwrap() argument 7 must be string or None, not instance
    • 似乎ssl.wrap_socket 需要证书的文件名并自行打开文件
    • 是的,完全正确。有没有办法通过在内存中创建一个看起来像实际文件名的变量来欺骗它?
    • 据我所知,文件以 c 扩展名打开。所以在不重写代码的情况下改变这种行为的机会不大。无赖
    • 我认为你是对的。我想我会保持原样。无论如何它都在工作。感谢您的帮助。
    【解决方案2】:

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

    缓存他们的根证书,或者更好的是,像你应该的那样将其与系统上的其余根证书一起安装。

    【讨论】:

    • 我同意你的看法。我不是每次都打。仅当文件不存在时。该脚本与安全性无关。这只是一个简单的脚本来查询服务器的证书以查看它何时到期。我不在乎它的有效性,因为它是我的服务器。由于我监控了数百个证书,因此我只想提醒到期日期。如果您有一个仅提取到期时间的解决方案,那对我来说是最好的。
    【解决方案3】:

    在下面一行:

    temp_file.write(root_cert.read())
    

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

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

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

    【讨论】:

    • 我明白你在说什么,但我无法让它与 ssl.wrap_socket 一起正常工作。当我这样做时,我收到以下错误 ssl.SSLError: [Errno 185090050] _ssl.c:326: error:0B084002:x509 certificate routines:X509_load_cert_crl_file:system lib 我认为这正是 ssl.wrap_socket 所期望的格式。我只能通过在磁盘上提供一个物理文件来使其工作。
    猜你喜欢
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    相关资源
    最近更新 更多