OpenWRTでIPSec VPN(6)『CAの構築と証明書の作成』


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

この文書では先にCAの設定を行い、X.509証明書を作成します。
以降の作業は基本的にSSHでのCLI作業となります。

参考情報

この記事を書くにあたって引き続き以下の情報を参考にしています
OpenWRTの公式サイトのDocument:『install/configure strongswan for IPhone/IPad』
StrongSwan公式サイトのDocument: 『iOS (Apple iPhone, iPad...) and Mac OS X』

ファイル名命名規則

この文書における各種秘密鍵・証明書ファイルの命名ルールは慣例に従い、以下のようにします。
秘密鍵 ....Key.* caKey.pem、serverKey.pemなど
証明書(公開鍵) ....Cert.* caCert.pem、clientCert.p12 など
作業用 *.tmp

CA(認証局)の設定

クライアント証明書の発行元となるCAの設定を行います。
といっても、daemonの設定を行うわけではなく、CAの秘密鍵と証明書を作成するだけです。

ファイルをramdisk 上に生成するために /tmp に作業ディレクトリを作成します。
うっかり残したままにしておいて流出のリスクを減らすためです。
このため作業途中で再起動させるとファイルは消え、最初からやり直しになります。

root@OpenWrt:/# mkdir /tmp/CA
root@OpenWrt:/# cd /tmp/CA
root@OpenWrt:/tmp/CA#

(2014/11/02追記ここから)

なお、ここからの作業で
no files found matching '/etc/strongswan.d/charon/*.conf', ignored
no files found matching '/etc/strongswan.d/*.conf', ignored
というエラーが出ても無視してよい模様です。
作成しようとしているファイル(***.pem等)がちゃんと出来ていれば次に進んでください。

(2014/11/02追記ここまで)

CAの秘密鍵を作成します。(10~30秒程度かかります)
root@OpenWrt:/tmp/CA# ipsec pki --gen --outform pem > caKey.pem

CAの秘密鍵を自己署名してプライベートなルートCA証明書を作成します。
root@OpenWrt:/tmp/CA# ipsec pki --self --in caKey.pem --dn "C=JP, O=MyVPN, CN=home.lan" --ca --outform pem > caCert.pem

これでルートCA証明書『caCert.pem』ができました。
※これは俗に言う「オレオレ証明書」になりますが、作成者本人がその出所を認識して使う分には問題ありません。

Server証明書(= OpenWRTルータの証明書)の作成

OpenWRTルータ用の秘密鍵を生成します(10~30秒程度かかります)
root@OpenWrt:/tmp/CA# ipsec pki --gen --outform pem > serverKey.pem

以下のコマンドで秘密鍵から公開鍵(証明書)を生成します。
root@OpenWrt:/tmp/CA# ipsec pki --pub --in serverKey.pem > serverCert_not_singed.tmp
※ここではステップをわかりやすくするために一度ファイル化していますが、
  後で削除するので参考サイトのようにリダイレクトさせて処理してもOKです。

このままでは電子署名されていないので使用できないので、
この公開鍵をプライベートなルートCA証明書を使って電子署名します。
root@OpenWrt:/tmp/CA# ipsec pki --issue --in serverCert_not_singed.tmp --cacert caCert.pem --cakey caKey.pem
 --dn "C=JP, O=My_OpenWRT_Router , CN=gtx.odwtztk.wig.jp" --flag serverAuth --flag ikeIntermediate --outform pem > serverCert.pem
※wikiの関係で2行に分割してます。1回のコマンドで全て入力して実行してください。
未署名の公開鍵は二度と使わないので削除しておきます。
root@OpenWrt:/tmp/CA# rm -i /tmp/CA/serverCert_not_singed.tmp

DN(識別名)の部分は各自の環境にあわせて修正してください。
ここではあらかじめ『OpenWRTでIPSec VPN(3)『DynamicDNS』』で取得しておいたドメイン名、ホスト名を使っています。
CN=にダイナミックDNSサービスに登録したホスト名+ドメイン名(FQDN)を記述します。
パラメータ名 意味 意味 設定例 備考
C Country 国名 JP StrongSwanのdefault値はCH、OpenWRTのDocument例ではDEになっています。
O Organization 組織名 My OpenWRT Router SSL用の証明書では会社名などを記載。実質上証明書の説明書きになるので、認識しやすい名称に。
CN Common Name コモンネーム gtx.odwtztk.wig.jp SSL用の証明書ではURLとなるホスト名。IPSec接続先のOpenWRTルータのFQDN名。最も重要で間違うと接続できない。

これで『caCert.pem』で署名済みのOpenWRTルータのServer証明書『serverCert.pem』が出来ました。

Client証明書(=端末用の証明書)の作成

ここでは端末用の証明書を作成します。

iOS用証明書の作成

最初にiPhone用の秘密鍵を作成します。
root@OpenWrt:/tmp/CA# ipsec pki --gen --outform pem > iPhoneKey.pem

秘密鍵から公開鍵(証明書)を生成します。
root@OpenWrt:/tmp/CA# ipsec pki --pub --in iPhoneKey.pem > iPhoneCert_not_singed.tmp

プライベートなルートCA証明書を使って電子署名します。
root@OpenWrt:/tmp/CA# ipsec pki --issue --in iPhoneCert_not_singed.tmp --cacert caCert.pem --cakey caKey.pem
 --dn "C=JP, O=My iPhone , CN=My iPhone Client Cert" --outform pem > iPhoneCert.pem
※wikiの関係で2行に分割してます。1回のコマンドで全て入力して実行してください。
未署名の公開鍵は二度と使わないので削除しておきます。
root@OpenWrt:/tmp/CA# rm -i /tmp/CA/serverCert_not_singed.tmp

OpenSSLを使ってca証明書「caCert.pem」、Client秘密鍵「iPhoneKey.pem」、Client証明書「iPhoneCert.pem」の3つをまとめてPKCS#12形式の証明書「iPhoneCert.p12」を作成します。
root@OpenWrt:/tmp/CA# openssl pkcs12 -export -inkey iPhoneKey.pem -in iPhoneCert.pem -name "My iPhone Client Cert"
 -certfile caCert.pem -caname "MyVPN" -out iPhoneCert.p12
※wikiの関係で2行に分割してます。1回のコマンドで全て入力して実行してください。
Export Passwordの問い合わせがあります。この証明書をiOS端末にインストール(インポート)する時に必要になります。このパスワードは忘れないでください。
Enter Export Password:*********
Verifying - Enter Export Password:*********

これでiPhone用のクライアント証明書『iPhoneCert.p12』ができました。

Android用証明書の作成

実はiOSの場合とやり方は一緒です。

最初に秘密鍵を作成します。
root@OpenWrt:/tmp/CA# ipsec pki --gen --outform pem > androidKey.pem

秘密鍵から公開鍵(証明書)を生成し、リダイレクトでプライベートなルートCA証明書を使って電子署名します。
root@OpenWrt:/tmp/CA# ipsec pki --pub --in androidKey.pem | ipsec pki --issue --cacert caCert.pem --cakey caKey.pem
 --dn "C=JP, O=My Android Phone , CN=My Android Client Cert" --outform pem > androidCert.pem
※wikiの関係で2行に分割してます。1回のコマンドで全て入力して実行してください。

OpenSSLを使ってandroidCert.pem androidKey.pem caCert.pem をPKCS#12形式の証明書にまとめます。
root@OpenWrt:/tmp/CA# openssl pkcs12 -export -inkey androidKey.pem -in androidCert.pem -name "My Android Client Cert"
 -certfile caCert.pem -caname "MyVPN" -out androidCert.p12
※wikiの関係で2行に分割してます。1回のコマンドで全て入力して実行してください。
Export Passwordの問い合わせがあります。端末にインストール(インポート)する時に必要になるので忘れないでください。

これでAndroid用のクライアント証明書『androidCert.p12』ができました。


Windows用証明書の作成

実はiOS/Androidの場合とやり方は一緒です。

最初に秘密鍵を作成します。
root@OpenWrt:/tmp/CA# ipsec pki --gen --outform pem > WindowsKey.pem

秘密鍵から公開鍵(証明書)を生成し、リダイレクトでプライベートなルートCA証明書を使って電子署名します。
root@OpenWrt:/tmp/CA# ipsec pki --pub --in WindowsKey.pem | ipsec pki --issue --cacert caCert.pem --cakey caKey.pem
 --dn "C=JP, O=My Windows PC, CN=My Windows Client Cert" --outform pem > WindowsCert.pem
※wikiの関係で2行に分割してます。1回のコマンドで全て入力して実行してください。

OpenSSLを使ってPKCS#12形式の証明書にまとめます。
root@OpenWrt:/tmp/CA# openssl pkcs12 -export -inkey WindowsKey.pem -in WindowsCert.pem -name "My Windows Client Cert"
 -certfile caCert.pem -caname "MyVPN" -out WindowsCert.p12
※wikiの関係で2行に分割してます。1回のコマンドで全て入力して実行してください。
Export Passwordの問い合わせがあります。端末にインストール(インポート)する時に必要になるので忘れないでください。

これでWindows用のクライアント証明書『WindowsCert.p12』ができました。

MacOS X用証明書の作成

作成中

証明書のバックアップ

証明書が生成できたら、ここで一旦バックアップをとっておきます。
/tmp/CA 以下のファイルをSCPやFTP等を使って作業用PCにコピーし、ファイルは安全なところに保管します。
WindowsではWinSCPが使いやすいと思います。