【问题标题】:use stringIO object as ssl key/cert file使用 stringIO 对象作为 ssl 密钥/证书文件
【发布时间】:2018-09-13 07:34:58
【问题描述】:

我想从环境变量中提取我的 ssl 证书和密钥,而不是将它们存储在文件系统中。但是我遇到了一个扭曲的 ssl 的路障

from io import StringIO
from twisted.internet import reactor, task, threads, ssl

key = StringIO()
key.write(os.environ['SSLKEY'])
cert = StringIO()
cert.write(os.environ['SSLCERT'])

contextFactory = ssl.DefaultOpenSSLContextFactory(key, cert)    

给我以下异常

2018-04-03 16:01:28-0500 [-] TypeError: Path must be represented as bytes or unicode string

contextFactory = ssl.DefaultOpenSSLContextFactory(key.getvalue(), cert.getvalue())    

给了我以下异常。

2018-04-03 16:02:44-0500 [-] OpenSSL.SSL.Error: [('system library', 'fopen', 'File name too long'), ('BIO routines', 'file_ctrl', 'system lib'), ('SSL routines', 'SSL_CTX_use_certificate_file', 'system lib')]

twisted.internet.ssl 正在寻找文件名的字符串或字节对象,而 io.StringIO 给了我一个 io.StringIO 对象。

有没有办法做到这一点?

【问题讨论】:

    标签: python python-3.x twisted stringio twisted.internet


    【解决方案1】:

    Twisted 使用 OpenSSL 来实际实现 TLS。 Twisted 只是为 OpenSSL 的 API 提供了一个包装器,以使它们更易于使用。

    DefaultOpenSSLContextFactory 初始化程序采用证书和密钥文件名,而不是证书和密钥本身。所以,你不能用这个 API 完成你想要的。

    但是,twisted.internet.ssl.CertificateOptions 将接受密钥和证书对象到其初始化程序:

    from os import environb
    from twisted.internet.ssl import (
        CertificateOptions,
        PrivateCertificate,
    )
    
    cert = PrivateCertificate.loadPEM(
        environb['SSLKEY'] + b'\n' + environb['SSLCERT'],
    )
    key = cert.privateKey
    
    contextFactory = CertificateOptions(
        privateKey=key.original,
        certificate=cert.original,
    )
    

    可能还有更好的方法来使用cryptography 库加载证书(有望在不久的将来取代很多twisted.internet.ssl 密钥和证书管理API)。

    另请注意,将您的私钥放入进程中的环境变量会将其暴露给同一主机上的所有其他用户和进程。这是一个非常糟糕的主意(毕竟它不是很私密)。所以你可能应该把你的钥匙放在别的地方。

    【讨论】:

    • 我无法让它工作,但是我将其标记为成功,因为这是一个坏主意,我将这些秘密作为文件存储在系统上。
    【解决方案2】:

    使用io.BytesIO 代替io.StringIO

    from io import BytesIO
    key = BytesIO()
    key.write(os.environ['SSLKEY'].encode())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-17
      • 2016-07-10
      • 1970-01-01
      • 2011-06-06
      • 2013-01-02
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多