web-dev-qa-db-ja.com

SSL証明書ファイルからサブジェクト代替名(SAN)をダンプする方法

次のコマンドを使用して、PEM証明書ファイルからすべての情報をダンプできることを知っています。

_openssl x509 -in certfile -noout -text
_

そして、証明書の有効期限のみを表示する別の直接パラメーターをすでに見つけました。

_openssl x509 -in certfile -noout -enddate
_

しかし、代替名のみを取得するためのショートカットもありますか?たとえば、www.example.comだけでなくexample.comでも証明書を使用できる場合と同様です。フルダンプでは、ここにあります:

_Certificate:
    Data:
        X509v3 extensions:
            X509v3 Subject Alternative Name: 
                DNS:www.example.com, DNS:example.com
_

この出力を解析してドメイン名のみを取得する手間を省きたいだけです。それは可能ですか?それ以外の場合、この出力を解析するためのベストプラクティスは何でしょうか?何が想定でき、何が変わる可能性がありますか? X509v3 Subject Alternative Name:\s*DNS:(\S+)(?:, DNS:(\S+))*のような正規表現を使用できますか?

4
ygoe

これがもう少し読みやすくするために私がすることです:

for i in $(openssl x509 -in certfile -noout -text | grep -A1 'Subject Alternative Name' | tail -n1 | tr -d ','); { echo $i | cut -f2 -d:; }

これにより、上記のサンプルと同じ入力を想定して、次のような長いリスト形式が得られます。

*.google.com
*.Android.com
*.appengine.google.com
*.cloud.google.com
...

ラインの生の出力は次のようになります。

DNS:*.google.com, DNS:*.Android.com, DNS:*.appengine.google.com, DNS:*.cloud.google.com

もちろん、リストに適切な形式を選択する必要があります。たとえば、その実際のGoogleリストは非常に長く、消費するのが困難です。特定の何かを探している場合は、各行のエントリを分割することで、探しているエントリをgrepして、他のすべての情報を削除できます。

したがって、これ(最後のgrepに注意してください)...

for i in $(openssl x509 -in certfile -noout -text | grep -A1 'Subject Alternative Name' | tail -n1 | tr -d ','); { echo $i | cut -f2 -d:; } | grep google.com

結果...

*.google.com
2
Brett Stauner

多くのエントリが存在する可能性があるため、次の行を選択し、awktrを使用してクリーンアップします。

openssl x509 -noout -text -in certfile | awk '/X509v3 Subject Alternative Name/ {getline;gsub(/ /, "", $0); print}' | tr -d "DNS:"

これがgoogle.comで得られるものです

*.google.com,*.Android.com,*.appengine.google.com,*.cloud.google.com,*.google-analytics.com,*.google.ca,*.google.cl,*.google.co.in,*.google.co.jp,*.google.co.uk,*.google.com.ar,*.google.com.au,*.google.com.br,*.google.com.co,*.google.com.mx,*.google.com.tr,*.google.com.vn,*.google.de,*.google.es,*.google.fr,*.google.hu,*.google.it,*.google.nl,*.google.pl,*.google.pt,*.googleadapis.com,*.googleapis.cn,*.googlecommerce.com,*.googlevideo.com,*.gstatic.cn,*.gstatic.com,*.gvt1.com,*.gvt2.com,*.Urchin.com,*.url.google.com,*.youtube-nocookie.com,*.youtube.com,*.youtubeeducation.com,*.ytimg.com,Android.com,g.co,goo.gl,google-analytics.com,google.com,googlecommerce.com,Urchin.com,youtu.be,youtube.com,youtubeeducation.com

この方法はgrep DNS:であるため、かなりうまく機能し、覚えやすいと思います。

$ openssl x509 -noout -text -in cert.pem | grep DNS:
                DNS:localhost, DNS:someserver1.somedom.local, DNS:someserver2.somedom.com, DNS:someserver3
2
slm

awkの使用に加えて、sedを使用できます。

openssl x509 -in cert_file_name.crt -noout -text | awk '/DNS:/' | sed 's/DNS://g'

これにより、SANリストから:

DNS:domain1.com, DNS:www.domain2.com, DNS:domain3.com, DNS:sub.domain3.com

domain1.com, www.domain2.com, domain3.com, sub.domain3.com
1
ec0g