SSL証明書・CSR 内容確認
SSL証明書や CSR の内容をブラウザ内で確認します。送信は一切ありません。
🖥 Reads an X.509 certificate or a PKCS#10 CSR entirely in your browser. Nothing is uploaded. A private key is refused rather than displayed.
概要
証明書は、署名された主張の集合を DER というバイナリで符号化し、転送のために Base64 で包んだものです。実務で証明書に起きる問題はすべてその主張の中に見えます。 SAN 一覧から抜けている名前、思っていたより早く終わる有効期間、リーフを貼るべき 場所に貼られた中間証明書、購入した用途を禁じている鍵用途です。
このビューアは PEM を復号し、DER を解析して中身を並べます。X.509 証明書と PKCS#10 の証明書要求の両方に対応します。これをブラウザ内で行い、秘密鍵は きっぱり拒否します。
使い方
-----BEGIN CERTIFICATE-----または-----BEGIN CERTIFICATE REQUEST-----で始まる PEM ブロックを貼ります。- 要約を読みます。種別、サブジェクト、発行者、有効期限、残日数です。
- SAN 一覧を、配信する予定のホスト名と突き合わせます。
サーバーから実際の証明書を取得するには次のようにします。
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509
有効な名前は SAN だけ
サブジェクトの Common Name は証明書の名前のように見えますが、ホスト名の検証には
使われません。Chrome はバージョン 58 から無視し、他のブラウザも続きました。
参照されるのは subjectAltName 拡張だけです。
実務上の帰結は次のとおりです。
- ホスト名が CN にしか 無い証明書は、現行のどのブラウザでも検証に失敗し、 そしてサブジェクトを目立つ位置に表示するツールでは完全に正しく見えます。
- ワイルドカード
*.example.comは 1 ラベルにだけ一致します。www.example.comを覆い、a.b.example.comは覆いません。裸のexample.comも覆いません。 その名前には自分の SAN 項目が必要で、だから証明書は両方を並べて記載します。 - SAN には型があります。
dNSName・iPAddress・rfc822Name・URIの各項目を 表示します。誤った型に入れたホスト名は一致しません。
鍵とその用途の読み方
鍵のアルゴリズムと長さは公開鍵の構造から読みます。RSA では法(モジュラス)の 長さがそのままビット長になります。EC では名前付き曲線が使われていればその名前を、 曲線名ではなく明示的パラメータを持つ場合はそう述べます。明示的パラメータは 現代の TLS スタックのほとんどが拒否するので、見えることに意味があります。曲線名が 無い場合は公開点の長さから長さを導きます。P-521 の鍵が、単純なバイト数から出る 528 ではなく 521 と報告されるのはそのためです。
keyUsage と extendedKeyUsage は鍵に許された用途を示し、どちらも強制されます。
EKU に serverAuth を持たない証明書は、他がすべて正しくても TLS には使えません。
クライアント証明書を誤ってサーバーに入れたときによく起きる結果です。
basicConstraints は証明書が CA かどうかを示します。リーフ証明書だと思って
貼ったものが CA と報告されたら、貼ったのは中間証明書です。ローカルでは検証が
通り他の環境では失敗する連鎖の、通常の原因です。
拡張の一覧は、存在するすべての拡張を critical フラグ付きで示します。RFC 5280 に より、クライアントが理解できない critical 拡張は拒否を引き起こさなければならない ので、見慣れない critical 拡張は調べる価値があります。
使用例
- 検証が通らない名前 — サブジェクトではなく SAN 一覧を確認します。ホスト名が CN にしか無ければ、証明書を再発行するしかありません。
- 送る前に CSR を読む — CSR はサブジェクトと公開鍵を確定します。送信前に名前を 確認すれば再発行の往復を避けられます。とくに CA が再発行を有償にしている場合に 重要です。
- どの証明書を持っているかの確認 — リーフ・中間・ルートはテキストとしては
似ています。
basicConstraintsとサブジェクト・発行者の関係で即座に判別できます。 ルートはサブジェクトと発行者が同一です。 - 更新の計画 — 残日数を直接表示します。業界が最大有効期間の大幅な短縮へ 向かっているため、年 1 回の証明書で成立していた手作業の更新手順はこの変化を 越えられません。
- バンドルの点検 — ブロックを 1 つずつ貼ります。順序が誤っているバンドルや、 無関係な証明書が混ざったバンドルは、一部のクライアントでのみ現れる連鎖エラーの 頻出原因です。
注意事項
受け付けるのは CERTIFICATE と CERTIFICATE REQUEST の PEM ブロックだけです。
それ以外のブロック種別(すべての秘密鍵形式を含む)は、見つかったものを示す
エラーで拒否します。拒否したブロックについては何も解析せず、何も表示しません。
DER パーサは DER が禁じているものを拒否します。長さ不定の符号化、バッファ末尾を
越える長さ、32 段を超える入れ子です。途中で切れた貼り付けは、部分的に埋まった
結果ではなく ASN.1 length exceeds buffer のような具体的なメッセージになります。
半分だけ解析された証明書は誤読を招くからです。解析が失敗したときに前の結果を
消すのも同じ理由です。
日付は証明書に符号化されているとおりに表示します。GeneralizedTime は 4 桁の年を
持ち、UTCTime は 2 桁で、RFC 5280 が解釈を 50〜99 は 19xx、00〜49 は 20xx と
定めています。残日数はご使用の端末の時計に対して計算するので、システム時刻が
誤っていれば数字も誤ります。
このツールは 1 枚の証明書を単独で読みます。連鎖の構築、失効、信頼は評価しません。 サーバーが実際に何を送り、どう応答するかを見るには HTTP ヘッダー取得と セキュリティヘッダー診断を使ってください。 ここでの処理はすべてブラウザ内で完結します。詳細は プライバシーポリシーに書いてあります。