OpenSSL で Azure ポイント対サイト (P2S) の証明書を作る

Azure に ポイント対サイト (P2S) 接続をする際に必要な、ルート証明書とクライアント証明書をWindows の makecert.exe コマンドを使って作成する方法を先の記事で書いた。
加えて、作成した証明書の内容を前の記事に書いた。
それを元にして、Linux の OpenSSL で同様な証明書を作成してみる。

南京錠を運ぶトラック

なお、以下のコマンドは特に断りが無い限り、すべて Ubuntu 14.04 LTS で実行している。

OpenSSL で Azure のポイント対サイト用のルート証明書を作る

OpenSSL でルート証明書を自己署名証明書として作成するには、以下のコマンドを実行する。
もちろん、Linux 上でこれを実行する。

Windows の makecert.exe で証明書を作成したときと同じになるように、キー長、ハッシュ方式、証明の対象の名前 (Subject 欄の値) を指定した。
また、証明書の有効期限は、前の記事で調べた 270 ヶ月に近い日数にした。
さらに -x509 オプションを付けて、自己署名証明書を作成するようにした。

証明書は -out オプションに指定した RootCertificate.cer ファイルとして作成される。
なお、先の記事で作成された証明書が DER 形式なので、それと同じ形式になるように -outform der オプションも付けた。
証明書の秘密鍵は -keyout オプションに指定した RootCertificate.key ファイルに保存される。

念のために、以下のコマンドを実行して作成した証明書の内容を確認してみる。

証明書のハッシュ方式とキー長は oepnssl コマンドのオプションで指定したとおり SHA256 と 2048bit になっている。
Subject 欄も CN=SelfCertificateRoot だ。
もちろん Issuer 欄も自己署名証明書らしく Subject 欄と同じになっている。
有効期限も 2039 年 12 月 13 日と、前の記事で調べた日付に近いことがわかる。

Azure には、ここで作成した RootCertificate.cer ファイルをルート証明書としてアップロードすればいい。

OpenSSL で Azure のポイント対サイト用のクライアント証明書を作る

OpenSSL で上で作った自己署名ルート証明書を使ってクライアント証明書を作るには、以下のコマンドを実行する。

作成された Client1.pem がクライアント証明書で、1 行目のコマンドを実行したときに作られた Client1.key に秘密鍵が保存される。

1 行目のコマンドで作成した証明書署名要求ファイル (Client1.csr.pem) は、2 行目で署名された証明書 (Client1.pem) を作ってしまえば、それ以降は不要だ。
不要なファイルを作らないようにするのであれば、上の 2 行のコマンドをパイプで繋いで以下のように実行することもできる。

これは、 openssl req コマンドが -out オプションを省略すると証明書署名要求ファイルを標準出力に出力し、 openssl x509 コマンドが -in オプションを省略すると証明書署名要求ファイルを標準入力から得る特徴を利用して、ふたつのコマンドをパイプで繋いだだけだ。

クライアント証明書に署名するルート証明書は openssl x509 コマンドの -CA オプションに指定し、ルート証明書の秘密鍵を -CAkey オプションで指定する。
上で作ったクルーと証明書は DER 形式で保存されているので -CAform der オプションも付けておく。

openssl x509 コマンドに付けた -set_serial オプションは、署名されたクライアント証明書につけるシリアル番号を指定している。
先の記事で使った Windows の makecert.exe コマンドではシリアル番号は適宜付与されるみたいだが、 openssl x509 コマンドでは明示的に指定する必要がある。
本来は、CA (ルート証明書) 毎に一意な値でなくてはならないらしいが、ここでは /dev/urandom による乱数を使用した。

また、 openssl x509 コマンドで署名した証明書はそのままだと、バージョン 1 の証明書になる。
現在使われている証明書はバージョン 3 なので、 -extfile /etc/ssl/openssl.cnf オプションと -extensions usr_cert オプションを付けて、バージョン 3 の証明書を作成するようにした。
なお、 -extfile オプションと -extensions オプションに指定する値は、デストリビューションで異なる。

ポイント対サイト (P2S) 接続する Windows PC に証明書をインポートする

ルート証明書は Azure にアップロードする他に、Azure にポイント対サイト (P2S) で接続する Windows PC にもインストールしなくてはいけない。
もちろん、クライアント証明書も Windows PC にインストールしておく必要がある。

インストール自体は Windows PC の証明書マネージャー ツール (certmgr.exe) などを使って、証明書ストアにインポートするだけだが、ここで作成した RootCerticicate.cer ファイルや Client1.pem ファイルは、そのままではインポートできない。

Windows の証明書ストアにインポートできるのは PKCS #12 形式、PKCS #7 形式と Microsoft 独自規格のシリアル形式のファイルだけだが、ここで作成した RootCerticicate.cer ファイルは DER 形式、 Client1.pem ファイルは PEM 形式だ。
このため、これらのファイルを PKCS #12 形式に変換する。

openssl pkcs12 コマンドは -in オプションで指定する証明書ファイルの形式が PEM 形式に限定されているため、DER 形式の RootCertificate.cer ファイルは直接指定できない。
そこで、 openssl x502 コマンドの -out オプションと openssl pkcs12 コマンドの -in オプションの省略が、それぞれ標準出力と標準入力とみなされることを利用して、ふたつのコマンドをパイプで繋ぐことにした。

Azure に P2S 接続する Windows PC でルート証明書を使うときは、ルート証明書の秘密鍵は必要ない。
もし、このルート証明書をインストールした Windows PC で makecert.exe コマンドを使って、別のクライアント証明書を発行・署名するのであれば、ルート証明書の秘密鍵が必要になるので、以下のコマンドのように -inkey オプションでルート証明書の秘密鍵のファイルを指定して PKCS #12 形式に変換する。

クライアント証明書も同様に以下のコマンドを実行して、PKCS #12 形式に変換する。

Azure に P2S 接続する Windows PC でクライアント証明書を使うときは秘密鍵が必要なので、 -inkey オプションでクライアント証明書の秘密鍵のファイルを忘れずに指定する。
クライアント証明書は PEM 形式のファイルなので、ルート証明書のときのようにパイプで二つのコマンドを繋いだりしなくてもよい。

作成された RootCertificate.pfx ファイルと Client1.pfx ファイルが、それぞれルート証明書とクライアント証明書の PKCS #12 形式のファイルだ。
あとはこれらのファイルをを Windows PC にコピーして、証明書ストアにインポートすればいい。
Windows で証明書をインポートするときに、「証明書の種類に基づいて、自動的に証明書ストアを選択する」をチェックして実行すると、ルート証明書は「信頼された証明機関」証明書ストアに、クライアント証明書は「個人」証明書ストアにインポートされる。
先の記事のように、ルート証明書とクライアント証明書を両方とも「「個人」証明書ストアにインポートするには、ルート証明書をインポートするときに「証明書をすべて次のストアに配置する」をチェックして「個人」証明書ストアを選択する。

関連記事

  • Windows で作った自己署名証明書を調べる2015.7.10 (金) Windows で作った自己署名証明書を調べる Azure に ポイント対サイト (P2S) 接続をする際に必要な、ルート証明書とクライアント証明書をWindows の makecert.exe コマンドを使って作成する方法を前の記事で書いた。同じことを Linux の OpenSSL […]
  • Ubuntu 14.04 LTS を Azure に2015.6.4 (木) Ubuntu 14.04 LTS を Azure に ちょっと、備忘録。 Microsoft Azure に Ubuntu 14.04 LTS の仮想マシンを作ってみた。手順自体はググるなりビングるなりすればすぐに見つかるし、ポータルの UI の変更も多くあるので、あえてここには書かない。 […]
  • Azure ポイント対サイト (P2S) 接続で使う証明書を作る2015.7.9 (木) Azure ポイント対サイト (P2S) 接続で使う証明書を作る Azure の仮想ネットワークにポイント対サイト (P2S) 接続を試みた。P2S 接続をするにはあらかじめ、Azure の仮想ネットワークにルート証明書をアップロードし、接続する PC ではクライアント証明書をインポートしておく必要がある。 […]
  • Azure ポイント対サイト (P2S) 接続が自己署名証明書な理由の推測2015.8.28 (金) Azure ポイント対サイト (P2S) 接続が自己署名証明書な理由の推測 先の記事で、Azure の仮想ネットワークにポイント対サイト (P2S) 接続するときに必要になる、ルート証明書とクライアント証明書の作り方を書いた。そこで Azure の P2S […]

コメントを残す