Безопасный канал Python gRPC 'ssl_transport_security.cc:1807] Не найдено совпадений для имени сервера' на удаленном экземпляре

У меня есть экземпляр Debian GCP, на котором я пытаюсь запустить сервер Python gRPC. У моего экземпляра статический IP-адрес, и я пытаюсь установить безопасный канал между моим удаленным экземпляром (сервером) и локальным клиентом.

Я создал самоподписанные сертификаты OpenSSL на сервере и использую те же сертификаты на клиенте. Для создания я использовал:

openssl req -newkey rsa:2048 -nodes -keyout ML.key -x509 -days 365 -out ML.crt

Мой сервер настроен так (файлы .key и .crt загружаются с open как 'rb'):

server_credentials = grpc.ssl_server_credentials(((private_key, certificate_chain,),))
self.server.add_secure_port('0.0.0.0:%d' % self.port, server_credentials)
self.server.start()

Мой клиент настроен как:

    host = '78.673.121.16' #this is the instance's static IP
    port = 9063

    certificate_chain = __load_ssl_certificate() #this loads the certificate file

    # create credentials
    credentials = grpc.ssl_channel_credentials(root_certificates=certificate_chain)

    # create channel using ssl credentials
    channel = grpc.secure_channel('{}:{}'.format(host, port), credentials)

а затем я продолжаю делать запрос.

На сервере я столкнулся со следующей ошибкой в ​​ответ на свой запрос:

E1017 17:21:22.964227087    1881 ssl_transport_security.cc:1807] No match found for server name: 78.673.121.16.

Я попытался изменить общее имя (CN) сертификата на localhost, 0.0.0.0 и 78.673.121.16, но безуспешно.

Есть какие-нибудь предложения?


person Panos Filianos    schedule 17.10.2020    source источник


Ответы (3)


У меня была аналогичная проблема, и я наконец смог ее решить. В моем случае я размещал сервер в кластере Kubernetes со статическим IP-адресом и портом. Ключевыми компонентами решения были (в сертификате сервера):

  1. Используйте статический IP-адрес в качестве общего имени
  2. Добавьте статический IP-адрес как DNSName в расширение SubjectAlternativeName сертификата.

Шаг 2 оказался критическим. В python (с использованием grpc версии 1.34.0) это было выполнено с помощью:

from cryptography import x509
host = '78.673.121.16'
builder = x509.CertificateBuilder()
...
builder = builder.add_extension(x509.SubjectAlternativeName([x509.DNSName(host)]), critical=False)
person Michael Potter    schedule 25.06.2021

попробуйте передать эти параметры в вызове функции secure_channel

options = {
    'grpc.ssl_target_name_override' : 'localhost',
    'grpc.default_authority': 'localhost'
}
channel = grpc.secure_channel('{}:{}'.format(host, port), credentials, options)
person Chandan    schedule 24.10.2020
comment
Насколько мне известно, это вызывает проблемы с безопасностью из-за ручного переопределения общего имени запроса SSL. Я не хочу так скомпрометировать свое приложение. - person Panos Filianos; 24.10.2020

Мне не удалось найти, как решить эту проблему, и я решил вместо этого настроить постоянный DNS для своего экземпляра. Я использовал GCP, который на момент написания статьи не давал возможности назначить это экземпляру.

Я переключился на Azure, назначил DNS своему экземпляру и использовал этот DNS и CN в своем самозаверяющем сертификате SSL.

После этого я сменил клиента (сервер остался прежним) как:

    host = 'myinstance.westus.azure.com' #this is the instance's DNS
    port = 9063

Это решило мою проблему.

person Panos Filianos    schedule 26.10.2020