我正在尝试获得远程服务器的证书,然后可以将其添加到我的密钥存储库中并在Java应用程序中使用。

一位高级开发人员(他正在度假:)告诉我,我可以运行这个:

openssl s_client -connect host.host:9999

来获得一个原始证书,然后我可以复制和导出。我收到以下输出:

depth=1 /C=NZ/ST=Test State or Province/O=Organization Name/OU=Organizational Unit Name/CN=Test CA
verify error:num=19:self signed certificate in certificate chain
verify return:0
23177:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1086:SSL alert number 40
23177:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:

我也尝试过这个选项:

-showcerts

还有这个(在Debian上运行):

-CApath /etc/ssl/certs/

但是我得到了同样的错误。

这个消息来源说我可以使用CApath标志,但它似乎没有帮助。我尝试了多种途径,但都无济于事。

请告诉我哪里做错了。


当前回答

我也有同样的挑战,然后我发现openssl不返回根ca。我已经专门为此目的构建了一个替代方案,这可能对其他开发人员有用,参见这里:GitHub -证书开锁器

使用

打印到控制台

crip print --url=https://stackoverflow.com/ --format=pem

导出到p12信任库

crip export pkcs12 --url=https://stackoverflow.com/

如果需要不同的输出,可以将pkcs12选项替换为pem或der。

其他回答

为了让像我这样尝试在访问AWS CloudFront时遵循这里的好建议但失败的人受益,诀窍是添加-servername domain.name…

来源:https://serverfault.com/a/780450/8972

您可以使用next bash脚本获取并存储服务器根证书:

CERTS=$(echo -n | openssl s_client -connect $HOST_NAME:$PORT -showcerts | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p')
echo "$CERTS" | awk -v RS="-----BEGIN CERTIFICATE-----" 'NR > 1 { printf RS $0 > "'$SERVER_ROOT_CERTIFICATE'"; close("'$SERVER_ROOT_CERTIFICATE'") }'

只需覆盖所需的变量。

启动客户端:

openssl s_client -showcerts stackoverflow.com:443

通过停止STDIN (CTRL+D)或终止进程(CTRL+C)退出。

禁用输入,并在显示证书后强制客户端退出。

openssl s_client -showcerts stackoverflow.com:443 < /dev/null

从远程服务器以PEM格式提取证书的一行程序,这次使用sed:

openssl s_client -connect www.google.com:443 2>/dev/null </dev/null |  sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'

我也有同样的挑战,然后我发现openssl不返回根ca。我已经专门为此目的构建了一个替代方案,这可能对其他开发人员有用,参见这里:GitHub -证书开锁器

使用

打印到控制台

crip print --url=https://stackoverflow.com/ --format=pem

导出到p12信任库

crip export pkcs12 --url=https://stackoverflow.com/

如果需要不同的输出,可以将pkcs12选项替换为pem或der。