根据Jean-Paul Calderone的建议,我正在尝试修改下面的扭曲的“starttls_server”示例以支持使用ssl.ClientCertificateOptions,以允许我指定我的私钥,证书和可信根,根据http://twistedmatrix.com/documents/14.0.0/api/twisted.internet.ssl.CertificateOptions.html
from twisted.internet import ssl, protocol, defer, task, endpoints
from twisted.protocols.basic import LineReceiver
from twisted.python.modules import getModule
class TLSServer(LineReceiver):
def lineReceived(self, line):
print("received: " + line)
if line == "STARTTLS":
print("-- Switching to TLS")
self.sendLine('READY')
self.transport.startTLS(self.factory.options)
def main(reactor):
certData = getModule(__name__).filePath.sibling('server.pem').getContent()
cert = ssl.PrivateCertificate.loadPEM(certData)
factory = protocol.Factory.forProtocol(TLSServer)
factory.options = cert.options()
endpoint = endpoints.TCP4ServerEndpoint(reactor, 8000)
endpoint.listen(factory)
return defer.Deferred()
if __name__ == '__main__':
import starttls_server
task.react(starttls_server.main)
我的理解是,我实际上需要用cert = ssl.PrivateCertificate...
替换cert.options = ssl.PrivateCertificate....
和certopts = ssl.CertificateOptions(privateKey=pKeyData, certificate=certData, trustRoot=caCertsData)
行(已将相应的文件读入certData,caCertsData和pKeyData)然后把它传递给factory.options
- 但是没有粘贴我尝试的每一个代码变体,我还没有正确地解决这个问题 - 我的努力产生了不同的结果来自经典的“OpenSSL.crypto.Error:[] “ - 似乎只是将我的3个PEM文件的内容转储到屏幕并退出!
任何人都可以开导我吗?谢谢:))
答案 0 :(得分:1)
cert.options()
已经返回CertificateOptions
。问题是options
将权限(作为Certificate
个对象)作为位置参数,并且不允许您通过所有其他配置值,因此您可能希望构造一个{{ 1}}直接。
只需将CertificateOptions
行更改为factory.options = cert.options()
。
但是,factory.options = ssl.CertificateOptions(...)
将pyOpenSSL CertificateOptions
对象作为其PKey
,而不是关键数据。因此,您需要使用OpenSSL API来加载该密钥,或者您可以从privateKey
中提取它。
If you read the signature of CertificateOptions
very carefully,所需的类型应该相当清楚。您可能还需要查阅pyOpenSSL文档。