Генерация сертификата для Python Twisted SSL - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь выяснить, как настроить ссылку SSL с помощью библиотеки Python Twisted. Мне удалось создать сертификат, который работает на стороне сервера, но я полностью застрял, когда дело доходит до стороны клиента.

Пример с витого сайта гласит:

В следующих примерах используются файлы server.pem (закрытый ключ и самозаверяющий сертификат вместе) и public.pem (общедоступный сервер сертификат сам по себе).

Я сгенерировал себе сертификат и ключ, используя OpenSSL:

Generate Private Key:
openssl genrsa -des3 -out certs/server.key 2048

Generate Certificate Signing Request:
openssl req -new -key certs/server.key -sha256 -out certs/server.csr

Generate a Self-Signed Certificate:
openssl x509 -req -days 365 -in certs/server.csr -signkey certs/server.key -sha256 -out certs/server.crt

Convert the CRT to PEM format:
Openssl x509 -in certs/server.crt -out certs/server.pem -outform PEM

Для серверной части я объединяю certs / server.crt и certs / server.key для создания server.pem и пытаюсь использовать server.crt для публичного доступа.

Когда я пытаюсь запустить мою тестовую программу, используя:

certificate = ssl.PrivateCertificate.loadPEM(certData)

Я получаю ошибку об отсутствии стартовой строки. Какой сертификат я должен использовать для клиента, если это не server.crt, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

В случае, если вы хотите, чтобы на клиентах также была установлена ​​аутентификация на основе сертификатов:

У меня была такая проблема некоторое время назад, и я написал сообщение в блоге о моем решении.Он также содержит руководство по созданию сертификатов и подписи их собственным центром сертификации.Вы можете найти пример кода Python по адресу GitHub .

Он использует Twisted для простого JSONRPCServer с аутентификацией на основе сертификатов как для сервера, так и для клиентов.

Главное - определить собственный AltCtxFactory для клиентов:

# Use our own context factory to use our certificate to authenticate
# against the server and ensure that we are using a strong SSL/TLS
# encryption method
class AltCtxFactory(ssl.ClientContextFactory):
    def getContext(self):
        # Used TLS/SSL encryption method
        sslMethod = SSL.TLSv1_2_METHOD
        # Clients private Key, used for authentication
        privKey = "<PATH TO YOUR PRIVATE KEY>"
        # Clients certificate, used for authentication
        certificate = "<PATH TO YOUR CERTIFICATE>"
        # Our trusted Certificate Authority for server connections
        accepted_ca = "<PATH TO YOUR ACCEPTED CERTIFICATE AUTHORITY>"

        self.method = sslMethod
        ctx = ssl.ClientContextFactory.getContext(self)
        # Ensure that we verify server's certificate and use our own
        # verifyCallback method to get further details of invalid certificates
        ctx.set_verify(SSL.VERIFY_PEER | SSL.VERIFY_FAIL_IF_NO_PEER_CERT,
                   verifyCallback)
        # Ensure that we only trust our CA
        ctx.load_verify_locations(accepted_ca)
        # Use our own Callback mehtod if a password is needed to decrypt our
        # private key
        ctx.set_passwd_cb(password_cb)
        # Use our certificate for authentication against server
        ctx.use_certificate_file(certificate)
        # Use our private key for authentication against server
        ctx.use_privatekey_file(privKey)
        return ctx

Не стесняйтесь использовать код в своих проектах.

0 голосов
/ 21 января 2019

Когда я пытаюсь запустить мою тестовую программу, используя:

certificate = ssl.PrivateCertificate.loadPEM (certData) Я получаю ошибку о не стартовой линии. Какой сертификат я должен использовать для клиент, если это не server.crt, пожалуйста?

Это должен быть ssl.Certificate.LoadPEM (certData), если вы посмотрите на пример на странице Twisted howto.

...