У меня есть следующий код питона в качестве сервера TLS сервера:SSL-сертификаты и ключи в скрученном питоне - отсутствует клиентская сторона с закрытым ключом?
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.sendLine('STARTTLS')
self.transport.startTLS(self.factory.options)
self.sendLine('Go ahead, secure now')
else:
self.sendLine("ack: " + line)
def main(reactor):
certData = getModule(__name__).filePath.sibling('servercert.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)
И servercert.pem выглядит следующим образом:
-----BEGIN CERTIFICATE-----
(PEM BITS SNIPPED FOR BREVITY AND PRIVACY/SECURITY!)
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
(PEM BITS SNIPPED FOR BREVITY AND PRIVACY/SECURITY!)
-----END RSA PRIVATE KEY-----
Для стороне клиента (работает на той же машине curently), я 've создал clientcert.pem - это в основном только раздел сертификата servercert.pem выше. Но это не удается:
# openssl s_client -connect localhost:8000 -starttls smtp -cert clientcert.pem
unable to load client certificate private key file
140310331250504:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: ANY PRIVATE KEY
Я пытался производить открытый ключ из CERT и вставив его в верхней части clientcert.pem - нет никакой разницы. Я довольно смущен, почему он ожидает частной клиентской стороны. Мое понимание TLS заключается в том, что закрытый ключ остается очень тем, что - частный сервер?
Может кто-нибудь, пожалуйста, сообщите, где я иду не так? Это серверная сторона - файл pem или код сервера? Или содержимое моего clientcert.pem?
Спасибо :)
Надеюсь, это был не сертификат производственного сервера? :) – Glyph