我正在尝试获取远程服务器的证书,然后我可以使用它来添加到我的密钥库并在我的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/
但得到同样的错误 .
This source说我可以使用那个CApath标志,但它似乎没有帮助 . 我尝试了多条路径无济于事 .
请让我知道我哪里出错了 .
10 回答
使用SNI
如果远程服务器正在使用SNI(即,在单个IP地址上共享多个SSL主机),则需要发送正确的主机名才能获得正确的证书 .
没有SNI
如果远程服务器未使用SNI,则可以跳过
-servername
参数:要查看站点证书的完整详细信息,您还可以使用此命令链:
虽然我同意Ari的回答(并赞同它:),但我需要做一个额外的步骤,让它在Windows上运行Java(需要部署它):
在添加
openssl x509 -outform DER
转换之前,我从Windows上的keytool收到错误,抱怨证书的格式 . 导入.der文件工作正常 .事实证明这里有更多的复杂性:我需要提供更多细节才能实现这一目标 . 我认为它与需要客户端身份验证的连接这一事实有关,并且hankshake需要更多信息才能继续到转储证书的阶段 .
这是我的工作命令:
希望这对任何能够提供更多信息的人来说都是正确的方向 .
最简单的命令行,包括将其添加到密钥库的PEM输出,以及人类可读输出,还支持SNI,如果您使用的是HTTP服务器,这很重要:
-servername选项用于启用SNI支持,openssl x509 -text以人类可读格式打印证书 .
要获取远程服务器的证书,您可以使用
openssl
工具,您可以在BEGIN CERTIFICATE
和END CERTIFICATE
之间找到它,您需要将其复制并粘贴到证书文件(CRT)中 .这是展示它的命令:
要从链返回所有证书,只需添加
g
(全局),如:然后,您只需将证书文件(
file.crt
)导入到您的钥匙串中并使其受信任,因此Java不应该抱怨 .在OS X上,您可以双击该文件或拖放您的Keychain Access,这样它就会出现在登录/证书中 . 然后双击导入的证书并使其始终信任SSL .
在CentOS 5上,您可以将它们附加到
/etc/pki/tls/certs/ca-bundle.crt
文件中(并运行:sudo update-ca-trust force-enable
),或者在CentOS 6中将它们复制到/etc/pki/ca-trust/source/anchors/
并运行sudo update-ca-trust extract
.在Ubuntu中,将它们复制到
/usr/local/share/ca-certificates
并运行sudo update-ca-certificates
.一个单行程序以PEM格式从远程服务器提取证书,这次使用
sed
:您可以使用下一个bash脚本获取并存储服务器根证书:
只需覆盖所需的变量 .
仅打印证书链而不打印服务器的证书:
在CentOS / RHEL 6/7上更新CA信任:
在CentOS / RHEL 5上:
为了像我这样的人在访问AWS CloudFront但是失败时试图遵循这些好建议的好处,诀窍是添加
-servername domain.name..
.资料来源:https://serverfault.com/a/780450/8972