本篇文章给大家带来了关于java的相关知识,ocsp在线证书状态协议是为了替换crl而提出来的;对于现代web服务器来说一般都是支持ocsp的,ocsp也是现代web服务器的标配,下面一起来看一下,希望对大家有帮助。
推荐学习:《java视频教程》
ocsp在线证书状态协议是为了替换crl而提出来的。对于现代web服务器来说一般都是支持ocsp的,ocsp也是现代web服务器的标配。
但是ocsp stapling却不是所有的web服务器都支持。但是现实工作中我们可能需要知道具体某个网站对ocsp的支持程度。
支持ocsp stapling的网站怎么判断一个web站点是否支持ocsp stapling呢?
最简单的方法就是去第三方网站查看网站的证书信息。比如我们之前提到过的entrust.ssllabs.com,通过输入对应的网站信息,在
protocol details一节中,可以找到网站是否支持ocsp stapling的具体信息,如下所示:
可以看到这个网站是开启了ocsp stapling的。但是事实上这个世界上的绝大部分网站是没有开启ocsp stapling的。
那么除了在第三方网站上查看ocsp stapling之外,还有没有其他办法呢?
事实上我们可以使用openssl神器轻松的做到这一点。当然前提是这个网站支持https。
接下来我们会详细讲解从获取服务器的证书到验证服务器是否支持ocsp stapling的一整套流程。
本文要验证的网站是微软的官网www.squarespace.com,这是一个支持ocsp stapling的网站。
获取服务器的证书要校验服务器是否支持oscp,我们首先需要获取到这个服务器的证书,可以用openssl提供的 openssl s_client -connect来完成这个工作。
openssl s_client -connect www.squarespace.com:443
这个命令会输出建立连接的所有内容,其中包含了要访问网站的证书信息。
因为我们只需要网站的证书,所以需要把-----begin certificate-----和-----end certificate-----之间的内容保存即可。
那么最终的命令如下:
openssl s_client -connect www.squarespace.com:443 | sed -n '/-----begin/,/-----end/p' > ca.pem
这里我们使用一个sed -n命令从输出中截取以-----begin开头和以-----end结尾的数据。
最终我们得到了网站的证书。
除了网站本身的证书之外,网站的证书本身是由其他的证书来签发的,这些证书叫做intermediate certificate,我们需要获取到整个证书链。
同样使用openssl的openssl s_client -showcerts命令可以获取所有的证书链:
openssl s_client -showcerts -connect www.squarespace.com:443 | sed -n '/-----begin/,/-----end/p' > chain.pem
如果你打开chain.pem文件可以发现,文件里面有两个证书,最上面的一个就是服务器本身的证书,而第二个就是用于签名服务器证书的intermediate certificate。
获取ocsp responder地址如果证书中包含有ocsp responder的地址,那么可以用下面的命令来获取:
openssl x509 -noout -ocsp_uri -in ca.pem
我们可以得到网站的ocsp responder地址是:http://ocsp.digicert.com。
还有一种方法可以获得ocsp responder的地址:
openssl x509 -text -noout -in ca.pem
这个命令会输出证书的所有信息,我们可以看到下面的内容:
authority information access: ocsp - uri:http://ocsp.digicert.com ca issuers - uri:http://cacerts.digicert.com/digicerttlsrsasha2562020ca1-1.crt
其中ocsp - uri就是ocsp responder的地址。
发送ocsp请求有了ocsp responder的地址,我们就可以进行ocsp验证,在这个命令中我们需要用到服务器的证书和intermediate证书。
具体的请求命令如下:
openssl ocsp -issuer chain.pem -cert ca.pem -text -url http://ocsp.digicert.com
从输出中我们可以得到两部分,第一部分是ocsp request data,也就是ocsp请求数据:
ocsp request data: version: 1 (0x0) requestor list: certificate id: hash algorithm: sha1 issuer name hash: 521ee36c478119a9cb03fab74e57e1197af1818b issuer key hash: 09262ca9dcff639140e75867e2083f74f6eaf165 serial number: 120014f1ec2395d56fdcc4dcb700000014f1ec request extensions: ocsp nonce: 04102873cfc7831ab971f3fdfbfcf3953ec5
从请求数据中,我们可以看到详细的ocsp请求数据结构,包括issuer的内容和ocsp nonce。
第二部分是响应数据,很遗憾我们得到了下面的请求错误响应数据:
ocsp response data: ocsp response status: successful (0x0) response type: basic ocsp response version: 1 (0x0) responder id: b76ba2eaa8aa848c79eab4da0f98b2c59576b9f4 produced at: apr 30 04:36:26 2022 gmt responses: certificate id: hash algorithm: sha1 issuer name hash: e4e395a229d3d4c1c31ff0980c0b4ec0098aabd8 issuer key hash: b76ba2eaa8aa848c79eab4da0f98b2c59576b9f4 serial number: 0f21c13200ae502d52bbe8dfeab0f807 cert status: good this update: apr 30 04:21:01 2022 gmt next update: may 7 03:36:01 2022 gmt
上面返回结果中,cert status: good表示的是ocsp请求成功了,这个网站是一个支持ocsp协议的网站。
后面的两行是ocsp上次更新的时间和下次更新的时间:
this update: apr 30 04:21:01 2022 gmt next update: may 7 03:36:01 2022 gmt
说明这个网站还支持ocsp stapling。
另外,请求某些网站的ocsp url的时候可能会得到下面的异常:
error querying ocsp responder4346349100:error:27fff072:ocsp routines:crypto_internal:server response error:/appleinternal/library/buildroots/66382bca-8bca-11ec-aade-6613bcf0e2ee/library/caches/com.apple.xbs/sources/libressl/libressl-2.8/crypto/ocsp/ocsp_ht.c:251:code=400,reason=bad request
为什么会这样呢?
这是因为ocsp.msocsp.com这个网站不支持ocsp默认的http 1.0请求,在http 1.0请求中默认是没有host这个请求头的。所以我们需要添加上host请求头,然后再执行一次即可。
一个更加简单的方法以上我们实际上是将请求拆开来一步步执行的。我们还可以使用openssl一步执行任务如下:
openssl s_client -tlsextdebug -status -connect www.squarespace.com:443
从输出中,我们可以看到下面的数据:
ocsp response:======================================ocsp response data: ocsp response status: successful (0x0) response type: basic ocsp response version: 1 (0x0) responder id: b76ba2eaa8aa848c79eab4da0f98b2c59576b9f4 produced at: apr 27 04:36:26 2022 gmt responses: certificate id: hash algorithm: sha1 issuer name hash: e4e395a229d3d4c1c31ff0980c0b4ec0098aabd8 issuer key hash: b76ba2eaa8aa848c79eab4da0f98b2c59576b9f4 serial number: 0f21c13200ae502d52bbe8dfeab0f807 cert status: good this update: apr 27 04:21:02 2022 gmt next update: may 4 03:36:02 2022 gmt
上面的命令直接输出了ocsp response结果,从结果中我们很清楚的看到该网站是否支持ocsp和ocsp stapling。
推荐学习:《java视频教程》
以上就是java使用openssl检测网站是否支持ocsp的详细内容。