TLS インスペクション環境化で証明書検証エラーに対応するために必要な証明書を特定してエクスポートする (Windows)
TLS インスペクション環境化でプログラムやツールを使用してインターネットアクセスする際に発生する SSL/TLS 証明書検証エラーの対応に必要な自己署名証明書の特定とエクスポート方法について紹介します。
やりたいこと
企業内環境等でブラウザではアクセスできるのに Python や Node.js 等のスクリプト、コマンドベースでのインターネットアクセス時に SSL/TLS certificat error のようなエラーが発生し、アクセスできないことがあります。 多くの場合、この原因は SSL/TLS インスペクションという仕組みによるものです。
詳しくはここでは説明しませんが、SSL/TLS インスペクションとは企業等の組織で不正なインターネットアクセスを監査する目的で プロキシサーバー等で https の暗号化を一度復号し内容を検証あるいは記録した上で、正規の接続先と再度 https アクセスを行うものです。
プロキシサーバーは https でインターネットアクセスする端末に対して、自己署名証明書 (所謂オレオレ証明書) を返します。 SSL/TLS インスペクションの環境化にある端末は予めプロキシサーバーのオレオレ証明書が信頼されたルート証明機関として OS の証明書ストアに登録されているため、OS の証明書ストアを参照するブラウザでのインターネットアクセスは、証明書検証でエラーが発生することもなく通常通りインターネットアクセスができます。
ところがブラウザ以外でインターネットアクセスする場合、多くのプログラミング言語やツールは OS の証明書ストアを参照せず独自の証明書ストアを持っており、その証明書ストアの証明書に基づいて署名検証を行います。これによりプロキシサーバーが返すサーバー証明書のオレオレ署名は署名検証でエラーとなります。
多くのプログラミング言語やツールではこの署名検証エラーを無視するオプションや証明書を追加するオプションが用意されています。個別の設定方法は別記事で紹介しますが、本記事では、それらの設定をするために必要なプロキシサーバーのオレオレ証明書の特定と取得方法について説明します。
オレオレ証明書の特定
- ブラウザで Google (https://www.google.co.jp/) にアクセスします。
- 多くのブラウザでアドレスバーの左に鍵のようなアイコンがあるかと思いますのでこれをクリックします。
この接続は保護されています
をクリックします。ちなみに Edge の場合は接続がセキュリティで保護されています
、FireFox の場合は安全な接続 (安全な HTTPS で接続中)
というメニューです。証明書は有効です
をクリックします。- 証明書ビューアーが表示されるので
発行元
の一般名 (CN)
を確認します。以下は TLS インスペクションが入っていない環境で表示した例ですが、TLS インスペクションが入っている環境では発行元
の一般名 (CN)
が異なる表示になっているはずです。 - キーボードショートカット Windows + R で
ファイル名を指定して実行
を開き、名前
にcertmgr.msc
と入力して実行します。 certmgr
が開くので、信頼されたルート証明機関
、または中間証明書
の中から発行先
が先ほどの証明書ビューアー
の発行元
の一般名 (CN)
と同一の証明書を探します。もし中間証明書
の中に見つけた場合はその証明書の発行元
が発行先
となっている証明書を信頼されたルート証明機関
から探します。
証明書のエクスポート
前項で特定した証明書について以下操作でエクスポートします。中間証明書
の中に見つけた場合は、上記で特定した 中間証明書
内の証明書と 信頼されたルート証明機関
内の証明書の両方で同じ操作を行ってください。
certmgr
上の特定した証明書上で右クリックし、すべてのタスク
をクリックし、エクスポート
をクリックします。証明書のエクスポート ウィザード
が開くので次へ
をクリックします。秘密キーのエクスポート
ではいいえ、秘密キーをエクスポートしません
を選択し、次へ
をクリックします。エクスポート ファイルの形式
では多くのツールが PEM 形式の証明書を使用するのでBase 64 encoded X.509 (.CER)
を選択し、次へ
をクリックします。エクスポートするファイル
でエクスポート先とファイル名を指定して次へ
をクリックします。証明書のエクスポート ウィザードの完了
画面が表示されるので完了
をクリックします。
中間証明書
と 信頼されたルート証明機関
からそれぞれ証明書をエクスポートした場合は、テキストエディタで開き、片方の証明書の内容を他方に貼り付けて 1 つの PEM ファイルとしておきましょう。
各プログラミング言語、ツール等での利用
エクスポートした証明書の使い方は各言語やツールによって異なるので公式ドキュメント等を参照しながら利用してください。 本ブログではいくつか設定の仕方を紹介した記事を書いていますので、よろしければ参考にしてください。
あとがき
TLS インスペクション環境化では様々な言語やツールで証明書検証エラーに引っかかるので証明書の特定、エクスポート方法を纏めておこうと思い、記事にしました。今後各言語・ツールでの証明書の利用方法の紹介記事を増やしていこうと思います。