VPN用証明書の作成

やること

iPhoneからVPN接続できるよう、IKEv2なVPN構築する。VPN構築にあたって必要な証明書を作成する。 IKEv2はstrongSwanを使う予定。

CA作成

まずはディレクトリを作る。

$ touch index.txt
$ echo 00 > serial
$ mkdir private newcerts
$ chmod 700 private
$ cat << 'EOF' > openssl.conf
[ ca ]
default_ca      = CA_default

[ CA_default ]

dir            = ./
database       = $dir/index.txt
new_certs_dir  = $dir/newcerts

certificate    = $dir/ca.crt
serial         = $dir/serial
private_key    = $dir/private/ca.key
RANDFILE       = $dir/.rand

default_days   = 365
default_crl_days= 365
default_md     = sha256

policy         = policy_any
email_in_dn    = no

name_opt       = ca_default
copy_extensions = none

[ policy_any ]
countryName            = match
stateOrProvinceName    = optional
organizationName       = optional
organizationalUnitName = optional
commonName             = supplied
emailAddress           = optional
EOF

CA自体の自己署名の証明書を作る。

$ cat << 'EOF' > ca.conf
basicConstraints = CA:true, pathlen:0
keyUsage = digitalSignature,keyCertSign,cRLSign
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
EOF

$ openssl req -new -newkey rsa:2048 -keyout private/ca.key -nodes -out ca.csr -subj '/C=JP/CN=VPN Root CA/'
$ openssl x509 -req -in ca.csr -signkey private/ca.key -out ca.crt -extfile ca.conf -days 3650 -sha256

サーバー証明書

iPhoneからも接続できるように、EKUに1.3.6.1.5.5.8.2.2を追加しておく。subjectAltNameも忘れずに。

$ openssl req -new -newkey rsa:2048 -nodes -keyout server-strongswan.key -out server-strongswan.csr -subj '/C=JP/O=strongSwan/CN=vpn.example.com/'

$ cat << 'EOF' > server.conf
keyUsage = digitalSignature
extendedKeyUsage = serverAuth,1.3.6.1.5.5.8.2.2
subjectAltName = DNS:vpn.example.com
authorityKeyIdentifier=keyid
EOF

$ openssl ca -config openssl.conf -in server-strongswan.csr -out server-strongswan.crt -extfile server.conf

クライアント証明書

VPNの認証はeap-tlsを使いたいため、クライアント証明書も発行する。 CNと同じ値をsubjectAltNameに追加。この値は、VPNの設定するときにローカルIDに入れる。 PKCS12形式の証明書ができるため、CAの証明書と一緒にiPhoneにメールなどで送る。

$ openssl req -new -newkey rsa:2048 -nodes -keyout client-username.key -out client-username.csr -subj '/C=JP/CN=username@vpnusers/'
$ cat << 'EOF' > client.conf
keyUsage = digitalSignature
extendedKeyUsage = clientAuth
subjectAltName = email:username@vpnusers
authorityKeyIdentifier=keyid
EOF
$ openssl ca -config openssl.conf -in client-username.csr -out client-username.crt -extfile client.conf
$ openssl pkcs12 -export -in client-username.crt -inkey client-username.key -out client-username.p12