我想为我信任的来源创建一个 grpc 通道,但我缺少其证书。使用默认凭据设置安全通道失败:
import gprc
ssh_channel = grpc.secure_channel(<gprc url>, grpc.ssl_channel_credentials())
grpc.channel_ready_future(ssh_channel).result()
Run Code Online (Sandbox Code Playgroud)
结果是:
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.
Run Code Online (Sandbox Code Playgroud)
我知道这是可能的,因为例如在 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(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取badssl.com子域的服务器证书(例如https://expired.badssl.com).
import ssl
ssl.get_server_certificate(('expired.badssl.com', 443))
Run Code Online (Sandbox Code Playgroud)
但是在检查上面生成的证书时,我看到证书有
身份:badssl-fallback-unknown-subdomain-or-no-sni
这意味着SNI失败了.如何获取badssl.com的不同子域的服务器证书?(我使用的是python 2.7.12)
我使用以下代码来验证ssl证书状态,我们是否可以使用请求模块或urllib获取有关证书的更多详细信息,如公用名(CN),到期日期和颁发者
import requests
def check_ssl(url):
try:
req = requests.get(url, verify=True)
print url + ' has a valid SSL certificate!'
except requests.exceptions.SSLError:
print url + ' has INVALID SSL certificate!'
check_ssl('https://google.com')
check_ssl('https://example.com')
Run Code Online (Sandbox Code Playgroud) 我知道可以使用 OpenSSL 或 M2Crypto 在 Python 中读取证书,如如何使用 python 检索远程主机的 TLS/SSL 对等证书?,但我希望能够使用不受信任的证书来做同样的事情。
不可信,我的意思是我(例如)刚刚生成的证书并将 csr 输出粘贴到我的 python 函数中。
这是我生成 csr 的方式:
openssl req -new -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr
Run Code Online (Sandbox Code Playgroud)
并将 domain.csr 的输出用于之前 SO 问题中的代码。
正如预期的那样,这行不通。为了更快,使用 Openssl 执行相同操作会导致相同的错误:
openssl x509 -text -in Domain.csr -noout
Run Code Online (Sandbox Code Playgroud)
无法加载证书 139698977908608:error:0906D06C:PEMroutines:PEM_read_bio:no start >line:pem_lib.c:703:Expecting: TRUSTED CERTIFICATE
期望:受信任的证书是这里的关键问题。
我能怎么做 ?
感谢您的帮助 !
更新:通过搜索更多,我读到如果私钥在此 SO 答案/sf/answers/861909611/ 中的证书(又名 pem)内,这将起作用,但我正在尝试实施是一个可以从来自其他人而不是我的证书中提取信息的系统。而且我很确定“其他人”不会想要分享他们的私钥,所以我仍然被卡住了。有任何想法吗 ?
更新 2: x509 和 req 证书之间似乎存在差异。如前所述,使用之前的命令生成的是一个请求。
所以现在我现在可以使用第一个 SO 链接读取 x509 证书,但是如何在 python 中读取 req …