Автоматический ввод парольной фразы в случае Python ssl Client / Server - PullRequest
5 голосов
/ 05 мая 2010

Мне нужно создать приложение клиент / сервер для отправки файлов с клиентов на сервер. Я использую простые сокеты ssl для этого и аутентифицируюсь с сертификатами.

 
ms = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = ssl.wrap_socket(ms,
                           keyfile=".../newCA/my_client.key",
                           certfile=".../newCA/my_client.crt",
                           server_side=0,
                           cert_reqs=ssl.CERT_REQUIRED,
                           ca_certs=".../newCA/CA/my-ca.crt"
                           )
ssl_sock.connect((HOST, MPORT))

А на стороне сервера:


msock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.ssl_sock = ssl.wrap_socket(msock,
                           keyfile=".../newCA/my_server.key",
                           certfile=".../newCA/my_server.crt",
                           server_side=1,
                           cert_reqs=ssl.CERT_REQUIRED,
                           ca_certs=".../newCA/CA/my-ca.crt"
                           )
        self.ssl_sock.bind(('', self.PORT))
        self.ssl_sock.listen(self.QUEUE_MAX)

Проблема заключается в следующем: когда клиент пытается подключиться к серверу, он требует ввести пароль для закрытого ключа для обоих: для стороны сервера и для стороны клиента.

  • В Java нам нужно установить системное свойство: javax.net.ssl.keyStorePassword = "", и оно должно использоваться автоматически, но как оно используется в Python? Я не могу вводить фразу-пароль все время, когда клиент подключается.

Проблема в том, что мое приложение: клиент должен использовать уже подписанный сертификат, а сервер должен использовать уже подписанный сертификат. Я не могу это изменить. И Serever, и Clients являются долгоживущими приложениями, поэтому мы просто запускаем их, и нам не нужно их искать. Но, как я понимаю, Python не предоставляет стандартного способа автоматического ввода пароля для закрытого ключа. Могут быть другие предложения?

Ответы [ 3 ]

4 голосов
/ 11 февраля 2015

Вы также можете ссылаться на SSLSocket пароль / пароль в Python . Допустимо удалить фразу-пароль файла закрытого ключа для случая на стороне сервера. OpenSSL предоставляет утилиты для этого. Например:

openssl pkey -in yourkey-with-pass.pem -out yourkey-without-pass.pem

3 голосов
/ 05 мая 2010

Парольная фраза предназначена для ввода человеком в качестве средства идентификации. Если вы хотите жестко закодировать его, ключ SSL без ключевой фразы обеспечивает такой же уровень безопасности. Чтобы избавиться от пароля, см. Также: http://aleph -null.tv / article / 20080714-1337-917.xml / Apache, -SSL, -and- & quot% 3BGetting-Rid-of-the- Passphrase & Quot% 3B

0 голосов
/ 19 мая 2019

Вот решение, которое я нашел, черпая вдохновение из этой статьи:
Создание сеанса запросов Python с использованием защищенной паролем фразы Клиентская сторона Сертификат

import ssl
import requests
from requests.adapters import HTTPAdapter

class SSLAdapter(HTTPAdapter):

    def init_poolmanager(self, *args, **kwargs):
        context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
        context.load_cert_chain(certfile='my_certificate.crt',
                                password='my_passphrase')
        kwargs['ssl_context'] = context
        return super().init_poolmanager(*args, **kwargs)

session = requests.session()
session.mount('https://my_protected_site.com', SSLAdapter())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...