遵循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文件正在显示并退出!谁能启发我?谢谢 :)
最佳答案
cert.options()
已经返回了CertificateOptions
。问题在于options
将权限(作为Certificate
对象)作为位置args,并且不允许您传递所有其他配置值,因此您可能希望直接构造CertificateOptions
。
只需将factory.options = cert.options()
行更改为factory.options = ssl.CertificateOptions(...)
。
但是,CertificateOptions
将pyOpenSSL PKey
对象作为其privateKey
,而不是密钥数据。因此,您需要使用OpenSSL API加载该密钥,也可以从PrivateCertificate
中提取它。
If you read the signature of CertificateOptions
very carefully,所需的类型应该相当清楚。您可能还需要参考pyOpenSSL文档。