2014-09-25 1 views
2

У меня есть следующий код питона в качестве сервера 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?

Спасибо :)

+0

Надеюсь, это был не сертификат производственного сервера? :) – Glyph

ответ

3

Так что я думаю, , что вы пытаетесь сделать здесь сказать клиенту доверять сертификат с собственной подписью сервера, рассказав его явно о сертификате сервера в качестве органа сертификации ,

«Клиентский сертификат» - это не то, как вы это делаете. Сертификат клиента является закрытым ключом для клиента, который является , подтвержденным сервером. Ваш сервер в этом примере кода не настроен для проверки клиентских сертификатов.

Рассказывать инструмент openssl s_client командной строки для использования clientcert.pem (что было бы правильнее назвать serverauthority.pem) вы бы сказали openssl s_client -CAfile clientcert.pem).

+0

Спасибо @ Glyph Я думаю, знаю, чего я пытаюсь достичь лучше, чем я! Как я понимаю из наших систем здесь (старая система, основанная на perl, внедряется в C21st!) ... Нам нужен клиент, чтобы иметь ключ pvt, который проверяется сервером. Глядя на [link] https://twistedmatrix.com/documents/14.0.0/core/howto/ssl.html#client-authentication, код клиента и сервера BOTH, похоже, хочет использовать те же файлы для данных auth и cert - неужели это неправильно? Не могли бы вы объяснить новичкам TLS, что ДОЛЖНЫ идти в этих исходных файлах? Они даже делают то, что я хочу/думаю? Еще раз спасибо! –

+1

Описание того, как настроить собственный центр сертификации, немного выходит за рамки ответа на переполнение стека :). Возможно, добавьте новый вопрос о том, как выполнить аутентификацию клиента, и я могу ответить на это отдельно? – Glyph

+0

Привет @ Glyph ... Очень ценю вашу помощь. Я думаю, что моя проблема больше связана с скрученными примерами: https://twistedmatrix.com/documents/14.0.0/core/howto/ssl.html#client-authentication - и какие файлы (что должно быть в них) от наши существующие действующие сертификаты и т. д., которые у нас есть здесь, я должен использовать и как. Также мне кажется, что приведенные выше скрученные примеры неверны - например, ssl_clientauth_ [server/client] .py оба используют public.pem и server.pem - неужели это неправильно? Если я задаю новый вопрос, который более конкретен для получения приведенных выше примеров, является ли это правильным вопросом для stackoverflow? –

Смежные вопросы