使用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 对象?