grpc Python: игнорировать ненадежный сертификат - PullRequest
0 голосов
/ 17 октября 2018

Я хочу создать канал grpc для источника, которому я доверяю, но чей сертификат у меня отсутствует.Не удается настроить безопасный канал с учетными данными по умолчанию:

import gprc
ssh_channel = grpc.secure_channel(<gprc url>, grpc.ssl_channel_credentials())
grpc.channel_ready_future(ssh_channel).result()

Результаты:

E1017 10:05:15.783011100   11539 ssl_transport_security.cc:1229] Handshake failed with fatal error SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED.
E1017 10:05:16.846366639   11539 ssl_transport_security.cc:1229] Handshake failed with fatal error SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED.
E1017 10:05:18.688887874   11539 ssl_transport_security.cc:1229] Handshake failed with fatal error SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED.
E1017 10:05:21.557399186   11539 ssl_transport_security.cc:1229] Handshake failed with fatal error SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED.

Я знаю, что это возможно, поскольку, например, в Java можно сделать следующее:

import io.grpc.netty.GrpcSslContexts;
import io.grpc.netty.NettyChannelBuilder;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
...
sslContext = GrpcSslContexts.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build();
channel = NettyChannelBuilder.forAddress(<gprc url>, 443).sslContext(sslContext).build();

Однако я не нашел аналогичного способа для Python.Документация grpc.secure_channel также описывает аргумент option, который в соответствии с документацией:

Необязательный список пар ключ-значение (аргументы канала во время выполнения ядра gRPC) для настройки канала..

Ссылка на аргументы канала здесь также не помогает.Есть идеи?

ОБНОВЛЕНИЕ: (19/01/14):

Есть открытый запрос на извлечение, чтобы добавить эту опцию в код Python, но он застрялв PR по месяцам: https://github.com/grpc/grpc/pull/12656

1 Ответ

0 голосов
/ 17 октября 2018

Возможно, вам придется получить сертификат с сайта в отдельном шаге.Если это может быть разовым, просто используйте ваш браузер и сохраните сертификат в удобном месте.В противном случае см. Как я могу получить сертификат равноправного TLS / SSL удаленного хоста, используя python? .

В моем случае я сохранил сертификат в своем браузере и сделал следующее (мне нужно былопереопределить целевое имя на имя в сертификате, так как оно было подписано самостоятельно, а имя домена не совпадает):

with open(cert_path, 'rb') as f:
    cert_bytes = f.read()

credentials = grpc.ssl_channel_credentials(cert_bytes)
# Deal with cert being self-signed:
cert_cn = "cn.from.cert.com" # or parse it out of the cert data
options = (('grpc.ssl_target_name_override', cert_cn,),)

channnel = grpc.secure_channel(target, credentials, options)
...