使用stringIO对象作为ssl key / cert文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用stringIO对象作为ssl key / cert文件相关的知识,希望对你有一定的参考价值。

我想从环境变量中提取我的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对象。

反正有没有完成这个?

答案

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'
' + environb['SSLCERT'],
)
key = cert.privateKey

contextFactory = CertificateOptions(
    privateKey=key.original,
    certificate=cert.original,
)

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

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

另一答案

使用io.BytesIO而不是io.StringIO

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

以上是关于使用stringIO对象作为ssl key / cert文件的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法让 Roo 接受 StringIO 对象代替文件?

使用 Pandas Excelwriter 写入 StringIO 对象?

python wave模块可以接受StringIO对象吗

什么时候使用 StringIO,而不是加入字符串列表?

Centos 6.6,python 2.7.2 对象没有属性'StringIO

如何清除 stringio 对象?