TLS インスペクション環境化で証明書検証エラーに対応するために必要な証明書を特定してエクスポートする (Windows)

TLS インスペクション環境化でプログラムやツールを使用してインターネットアクセスする際に発生する SSL/TLS 証明書検証エラーの対応に必要な自己署名証明書の特定とエクスポート方法について紹介します。

やりたいこと

企業内環境等でブラウザではアクセスできるのに Python や Node.js 等のスクリプト、コマンドベースでのインターネットアクセス時に SSL/TLS certificat error のようなエラーが発生し、アクセスできないことがあります。 多くの場合、この原因は SSL/TLS インスペクションという仕組みによるものです。

詳しくはここでは説明しませんが、SSL/TLS インスペクションとは企業等の組織で不正なインターネットアクセスを監査する目的で プロキシサーバー等で https の暗号化を一度復号し内容を検証あるいは記録した上で、正規の接続先と再度 https アクセスを行うものです。

プロキシサーバーは https でインターネットアクセスする端末に対して、自己署名証明書 (所謂オレオレ証明書) を返します。 SSL/TLS インスペクションの環境化にある端末は予めプロキシサーバーのオレオレ証明書が信頼されたルート証明機関として OS の証明書ストアに登録されているため、OS の証明書ストアを参照するブラウザでのインターネットアクセスは、証明書検証でエラーが発生することもなく通常通りインターネットアクセスができます。

ところがブラウザ以外でインターネットアクセスする場合、多くのプログラミング言語やツールは OS の証明書ストアを参照せず独自の証明書ストアを持っており、その証明書ストアの証明書に基づいて署名検証を行います。これによりプロキシサーバーが返すサーバー証明書のオレオレ署名は署名検証でエラーとなります。

多くのプログラミング言語やツールではこの署名検証エラーを無視するオプションや証明書を追加するオプションが用意されています。個別の設定方法は別記事で紹介しますが、本記事では、それらの設定をするために必要なプロキシサーバーのオレオレ証明書の特定と取得方法について説明します。

オレオレ証明書の特定

  1. ブラウザで Google (https://www.google.co.jp/) にアクセスします。
  2. 多くのブラウザでアドレスバーの左に鍵のようなアイコンがあるかと思いますのでこれをクリックします。 サイト情報を表示アイコン
  3. この接続は保護されています をクリックします。ちなみに Edge の場合は 接続がセキュリティで保護されています、FireFox の場合は 安全な接続 (安全な HTTPS で接続中) というメニューです。 この接続は保護されていますメニュー
  4. 証明書は有効です をクリックします。   証明書は有効ですメニュー
  5. 証明書ビューアーが表示されるので 発行元一般名 (CN) を確認します。以下は TLS インスペクションが入っていない環境で表示した例ですが、TLS インスペクションが入っている環境では 発行元一般名 (CN) が異なる表示になっているはずです。 証明書ビューアー
  6. キーボードショートカット Windows + Rファイル名を指定して実行 を開き、名前certmgr.msc と入力して実行します。 ファイル名を指定して実行に certmgr.msc と入力
  7. certmgr が開くので、信頼されたルート証明機関、または 中間証明書 の中から 発行先 が先ほどの 証明書ビューアー発行元一般名 (CN) と同一の証明書を探します。もし 中間証明書 の中に見つけた場合はその証明書の 発行元発行先 となっている証明書を 信頼されたルート証明機関 から探します。

証明書のエクスポート

前項で特定した証明書について以下操作でエクスポートします。中間証明書 の中に見つけた場合は、上記で特定した 中間証明書 内の証明書と 信頼されたルート証明機関 内の証明書の両方で同じ操作を行ってください。

  1. certmgr 上の特定した証明書上で右クリックし、すべてのタスク をクリックし、エクスポート をクリックします。
  2. 証明書のエクスポート ウィザード が開くので 次へ をクリックします。
  3. 秘密キーのエクスポート では いいえ、秘密キーをエクスポートしません を選択し、次へ をクリックします。 証明書エクスポート ウィザード 秘密キーのエクスポート画面
  4. エクスポート ファイルの形式 では多くのツールが PEM 形式の証明書を使用するので Base 64 encoded X.509 (.CER) を選択し、次へ をクリックします。 証明書エクスポート ウィザード エクスポート ファイルの形式
  5. エクスポートするファイル でエクスポート先とファイル名を指定して 次へ をクリックします。
  6. 証明書のエクスポート ウィザードの完了 画面が表示されるので 完了 をクリックします。

中間証明書信頼されたルート証明機関 からそれぞれ証明書をエクスポートした場合は、テキストエディタで開き、片方の証明書の内容を他方に貼り付けて 1 つの PEM ファイルとしておきましょう。

各プログラミング言語、ツール等での利用

エクスポートした証明書の使い方は各言語やツールによって異なるので公式ドキュメント等を参照しながら利用してください。 本ブログではいくつか設定の仕方を紹介した記事を書いていますので、よろしければ参考にしてください。

あとがき

TLS インスペクション環境化では様々な言語やツールで証明書検証エラーに引っかかるので証明書の特定、エクスポート方法を纏めておこうと思い、記事にしました。今後各言語・ツールでの証明書の利用方法の紹介記事を増やしていこうと思います。