ssl获取linux终端打印信息,linux - 使用openssl从s获取证书

linux - 使用openssl从s获取证书

我正在尝试获取远程服务器的证书,然后我可以使用它来添加到我的密钥库并在我的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标志,但它似乎没有帮助。 我尝试了多条路径无济于事。

请让我知道我哪里出错了。

10个解决方案

331 votes

随着SNI

如果远程服务器正在使用SNI(即,在单个IP地址上共享多个SSL主机),则需要发送正确的主机名才能获得正确的证书。

openssl s_client -showcerts -servername www.example.com -connect www.example.com:443

没有SNI

如果远程服务器未使用SNI,则可以跳过-servername参数:

openssl s_client -showcerts -connect www.example.com:443

要查看站点证书的完整详细信息,您还可以使用此命令链:

$ echo | \

openssl s_client -servername www.example.com -connect www.example.com:443 2>/dev/null | \

openssl x509 -text

Ari Maniatis answered 2019-02-12T06:58:38Z

56 votes

虽然我同意Ari的回答(并赞同它:),但我需要做一个额外的步骤,让它在Windows上运行Java(需要部署它):

openssl s_client -showcerts -connect www.example.com:443 < /dev/null | openssl x509 -outform DER > derp.der

在添加openssl x509 -outform DER转换之前,我从Windows上的keytool收到错误,抱怨证书的格式。 导入.der文件工作正常。

David Jaquay answered 2019-02-12T06:59:11Z

34 votes

事实证明这里有更多的复杂性:我需要提供更多细节才能实现这一目标。 我认为它与需要客户端身份验证的连接这一事实有关,并且hankshake需要更多信息才能继续到转储证书的阶段。

这是我的工作命令:

openssl s_client -connect host:port -key our_private_key.pem -showcerts \

-cert our_server-signed_cert.pem

希望这对任何能够提供更多信息的人来说都是正确的方向。

nasty pasty answered 2019-02-12T06:59:51Z

28 votes

最简单的命令行,包括将其添加到密钥库的PEM输出,以及人类可读输出,还支持SNI,如果您使用的是HTTP服务器,这很重要:

openssl s_client -servername example.com -connect example.com:443 \

/dev/null | openssl x509 -text

-servername选项用于启用SNI支持,openssl x509 -text以人类可读格式打印证书。

Florian answered 2019-02-12T07:00:30Z

19 votes

要获得远程服务器的证书,您可以使用/usr/local/share/ca-certificates工具,您可以在sudo update-ca-certificates和/etc/pki/ca-trust/source/anchors/之间找到它,您需要将其复制并粘贴到您的证书文件(CRT)中。

这是展示它的命令:

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' file.crt

要从链中返回所有证书,只需添加/usr/local/share/ca-certificates(全局),如:

ex +'g/BEGIN CERTIFICATE/,/END CERTIFICATE/p'

然后,您只需将证书文件(/usr/local/share/ca-certificates)导入到您的钥匙串中并使其受信任,因此Java不应该抱怨。

在OS X上,您可以双击该文件或拖放您的Keychain Access,这样它就会出现在登录/证书中。 然后双击导入的证书并使其始终信任SSL。

在CentOS 5上,您可以将它们附加到/usr/local/share/ca-certificates文件(并运行:sudo update-ca-certificates),或者在CentOS 6中将它们复制到/etc/pki/ca-trust/source/anchors/并运行sudo update-ca-trust extract。

在Ubuntu中,将它们复制到/usr/local/share/ca-certificates并运行sudo update-ca-certificates。

kenorb answered 2019-02-12T07:01:47Z

5 votes

HOST=gmail-pop.l.google.com

PORT=995

openssl s_client -servername $HOST -connect $HOST:$PORT < /dev/null 2>/dev/null | openssl x509 -outform pem

akond answered 2019-02-12T07:02:07Z

4 votes

您可以使用下一个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'") }'

只需覆盖所需的变量。

Andrei Aleksandrov answered 2019-02-12T07:02:40Z

4 votes

仅打印证书链而不打印服务器的证书:

# MYHOST=myhost.com

# MYPORT=443

# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null

在CentOS / RHEL 6/7上更新CA信任:

# update-ca-trust enable

# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null /etc/pki/ca-trust/source/anchors/myca.cert

# update-ca-trust extract

在CentOS / RHEL 5上:

# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null >/etc/pki/tls/certs/ca-bundle.crt

Mathieu CARBONNEAUX answered 2019-02-12T07:03:20Z

4 votes

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

openssl s_client -connect www.google.com:443 2>/dev/null

André Fernandes answered 2019-02-12T07:03:46Z

1 votes

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

资料来源:[https://serverfault.com/a/780450/8972]

Amos Shapira answered 2019-02-12T07:04:20Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值