暗号化シリーズ:opensslを使用して、Webサイトがocspをサポートしているかどうかを検出します

創造を続け、成長を加速させましょう!「ナゲッツデイリーニュープラン・6月アップデートチャレンジ」に参加して3日目です。クリックしてイベントの詳細をご覧ください。

序章

CRLの代わりにOCSPオンライン証明書ステータスプロトコルが提案されました。最新のWebサーバーの場合、OCSPは一般的にサポートされており、OCSPは最新のWebサーバーの標準でもあります。

ただし、OCSPステープリングはすべてのWebサーバーでサポートされているわけではありません。ただし、実際の作業では、特定のWebサイトによるOCSPのサポートレベルを知る必要がある場合があります。

OCSPステープリングをサポートするWebサイト

WebサイトがOCSPステープリングをサポートしているかどうかを判断するにはどうすればよいですか?

最も簡単な方法は、サードパーティのWebサイトにアクセスして、Webサイトの証明書情報を確認することです。たとえば、前述のentrust.ssllabs.comでは、対応するWebサイト情報を入力することにより、[
プロトコルの詳細]セクションで、以下に示すように、WebサイトがOCSPステープリングをサポートしているかどうかに関する特定の情報を見つけることができます。

このWebサイトでOCSPステープリングが有効になっていることがわかります。しかし実際には、世界中のほとんどのWebサイトでOCSPステープリングが有効になっていません。

では、サードパーティのWebサイトでOCSPステープリングを見る以外に他の方法はありますか?

実際、opensslアーティファクトを使用してこれを簡単に行うことができます。もちろん、このウェブサイトがhttpsをサポートしていることが前提です。

次に、サーバーの証明書を取得してから、サーバーがOCSPステープリングをサポートしているかどうかを確認するまでのプロセス全体について詳しく説明します。

この記事で検証するWebサイトは、Microsoftの公式Webサイトwww.squarespace.comです。これは、OCSPステープリングをサポートするWebサイトです。

サーバーの証明書を取得する

サーバーがOSCPをサポートしているかどうかを確認するには、最初にサーバーの証明書を取得する必要があります。これは、opensslが提供するopenssls_client-connectを使用して実行できます。

 openssl s_client -connect www.squarespace.com:443
复制代码

このコマンドは、アクセスするWebサイトの証明書情報を含め、接続を確立するすべてのものを出力します。

Webサイトの証明書のみが必要なため、との間でコンテンツを保存する必要が-----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 responder
4346349100: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
复制代码

为什么会这样呢?

これは、Webサイトocsp.msocsp.comがOCSPのデフォルトのHTTP 1.0要求をサポートしておらず、HTTP1.0要求にデフォルトでホスト要求ヘッダーがないためです。したがって、Hostリクエストヘッダーを追加して再度実行する必要があります。

より簡単な方法

上記では、実際に実行するリクエストを段階的に分割しています。次のように、opensslを使用してタスクを1つのステップで実行することもできます。

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応答結果を直接出力します。その結果から、WebサイトがOCSPおよびOCSPステープリングをサポートしているかどうかを明確に確認できます。

要約する

ほとんどのWebサイトはOCSPステープリングをサポートしていませんが、上記のコマンドを使用して効果的に判断できます。

詳細については、  www.flydean.com/44-openssl-…を参照してください。

最も人気のある解釈、最も深遠な乾物、最も簡潔なチュートリアル、そしてあなたが知らない多くのトリックがあなたが発見するのを待っています!

私の公式アカウントに注意を払うことを歓迎します:「それらをプログラムする」、テクノロジーを理解し、あなたをよりよく理解する!

おすすめ

転載: juejin.im/post/7103895982407942152