VPN: YAMAHA RTX1300 ルータ <-> androidスマートフォン IKEv2 デジタル証明書接続(IPsec/IKEv2 RSA)に対応できた！


## YAMAHAサポートからの回答
>IKEv2でデジタル証明書が利用可能な接続は拠点間接続のみとなり、
>リモートアクセスVPNとしてのIKEv2では証明書に非対応でございます。
>
>参考：リモートアクセスVPN(IKEv2)の設定手順（2. 注意事項）
>http://www.rtpro.yamaha.co.jp/RT/docs/ipsec/ikev2_ras/index.html#attention
>
>ご要望に添えず誠に申し訳ございませんが、
>リモートアクセスVPNにつきましては、
>IKEv2 PSKでの接続をお願いできますでしょうか。

え？対応できたんですけど・・・
下記は自己責任でお願いします。

## ドキュメント
YAMAHA公式ドキュメント
**IPsec/IKE デジタル署名、EAP-MD5認証対応**
https://www.rtpro.yamaha.co.jp/RT/docs/ipsec/ike2_pki.html

## 手順

### 1. 証明書作成
VPN IPsec/IKEv2 RSA接続のために、まずVPNサーバー、クライアント接続認証用の電子証明書をつくります。証明書とは？には下記サイトか専門参考書をご参照下さい。
- [SSL/TLS サーバー証明書BLOG: IT 初心者用入門 「証明書とは？」](https://www.cybertrust.co.jp/blog/ssl/knowledge/about-certification.html)
- [Qiita: 暗号化と電子署名と証明書](https://qiita.com/nkmk1215/items/f45ecf7c27520cbff673)
- [Wikipedia: 公開鍵基盤](https://ja.wikipedia.org/wiki/%E5%85%AC%E9%96%8B%E9%8D%B5%E5%9F%BA%E7%9B%A4)
<br>

下記証明書作成、確認コマンドは自分はLinuxのUbuntuがあったのでそれを用いました。windowsでもできるとおもいますが、インストールするソフト、実行コマンド等は別途該当するものを調べて下さい。
使ったものはstrongswanのパッケージで、接続クライアントに用いたAndroidスマホにもStrongSwanアプリを入れて、それでYAMAHA RTXルータにIKEv2証明書接続しました。（Androidスマホにデフォルトで入っているVPNソフトでは接続できなかった（SSL/TLSサーバ証明書ハッシュ形式がデフォルトではSHA1非対応だからでは？という情報あり）) 
<br>

:::note info
参考サイト
**ArchLinux strongSwan** https://wiki.archlinux.jp/index.php/StrongSwan
:::

コマンドターミナルを起動し、下記で必要コマンドが入ったパッケージをインストール
```
$ sudo apt update
$ sudo apt install strongswan

# パッケージが足りなくてコマンド実行に問題がある場合は下記も入れて下さい
# linux上でVPNサーバ立ち上げはしないので必要ないと思いますが
## $ sudo apt install strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins libstrongswan-extra-plugins

# ipsecコマンドがstrongswanより古いパッケージのものになってる場合がありますのでその場合は事前にremoveして下さい。
# **注意** これまで動いていたアプリが動かなくなる可能性があります。(strongswanで代替できると思いますが)
## $ sudo apt remove libreswan
## $ sudo apt remove openswan

# ipsecコマンドがどのパッケージのものかは下記コマンド実行で表示されるipsecマニュアルの最後のほうに記載があります
## $ man ipsec
```
- sudoとは・・・一時的にroot権限でコマンド実行するもの
<br>

**証明書**
まずは X.509 証明書を生成します。認証局 (CA)、サーバー証明書、(最低でもひとつの) クライアント証明書が必要です。

**認証局**
自己署名ルート CA 証明書を作成:
```
# Home directoryにpki用新規directory作成から開始
$ cd ~
$ mkdir pki
$ cd pki
$ mkdir selfSigned_certificates
$ cd selfSigned_certificates
$ mkdir private cacerts certs

# CA 秘密鍵と自己署名証明書作成
$ ipsec pki --gen --type rsa --size 4096 --outform pem \
	   > private/yamahaRTXKey.pem
## 秘密鍵は所有者のみrw権限
$ chmod 600 private/yamahaRTXKey.pem
$ ipsec pki --self --ca --lifetime 3650 \
	   --in private/yamahaRTXKey.pem --type rsa --digest sha1\
	   --dn "C=JP, O=yamahaRTX, CN=yamahaRTX Root CA" \
	   --outform pem \
    > cacerts/yamahaRTXCert.pem
```
4096ビットの RSA 秘密鍵 yamahaRTXKey.pem と10年間 (3650日間) 有効な自己署名 CA 証明書 yamahaRTXCert.pem が作成されます。ハッシュ形式はSHA1という古い規格です（サポート情報からRTXは新規格のSHA2には非対応。RSA形式ではないECDSA形式にも非対応。（※自分では未確認））。ファイルは PEM 形式で保存されます。
識別名 (DN) の 国 (C), 組織 (O), 一般名 (CN) は適当な値に変更できますが必須ではありません。

新しく生成された証明書のプロパティを確認するには、次のコマンドを実行:
```
$ ipsec pki --print --in cacerts/yamahaRTXCert.pem
```
出力:
```
  subject:  "C=JP, O=yamahaRTX, CN=yamahaRTX Root CA"
  issuer:   "C=JP, O=yamahaRTX, CN=yamahaRTX Root CA"
  validity:  not before Sep 10 03:51:46 2024, ok
             not after  Sep 08 03:51:46 2034, ok (expires in 3649 days)
  serial:    1c:c6:40:11:10:8c:ef:ee
  flags:     CA CRLSign self-signed 
  subjkeyId: f6:37:3e:db:c1:26:b0:15:32:7f:3f:0b:41:c4:87:67:6a:4a:2b:e2
  pubkey:    RSA 4096 bits
  keyid:     aa:96:a5:2b:ec:20:42:c0:5e:13:f8:8a:01:48:5d:0a:2a:ed:aa:9b
  subjkey:   f6:37:3e:db:c1:26:b0:15:32:7f:3f:0b:41:c4:87:67:6a:4a:2b:e2
```
:::note alert
秘密鍵ファイル ~/pki/selfSigned_certificates/private/*.pem はどこかインターネットからアクセスされない安全な場所に移動すると良いでしょう。マスター署名鍵が盗まれた場合、公開鍵基盤は完全に瓦解します。
:::
<br>

**ホスト証明書**
VPN サーバーの認証に使用する証明書です。以下のコマンドを実行してください:
```
$ ipsec pki --gen --type rsa --size 2048 --outform pem > private/vpnHostKey.pem
## 秘密鍵は所有者のみrw権限
$ chmod 600 private/vpnHostKey.pem
$ ipsec pki --pub --in private/vpnHostKey.pem --type rsa | \
      ipsec pki --issue --lifetime 824 --outform pem \
                --cacert cacerts/yamahaRTXCert.pem \
                --cakey private/yamahaRTXKey.pem \
                --digest sha1 \
                --dn "C=JP, ST=Tokyo, L=Machida-shi, O=yamahaRTX, CN=vpn.yamahaRTX.com" \
                --san vpn.yamahaRTX.com　--san vpn2.yamahaRTX.com --san 111.111.111.111 \
                --flag serverAuth --flag ikeIntermediate \
          > certs/vpnHostCert.pem
```
2048ビットの RSA 秘密鍵 vpnHostKey.pem が作成されます。次に公開鍵を抽出してパイプで渡し vpnHostCert.pem を発行してホスト証明書を CA で署名しています。ハッシュ形式はSHA1です。証明書の有効年数は約2年 (824日) です。VPN ホストは完全修飾ドメイン名 (FQDN) で識別します (例: vpn.yamahaRTX.com)

- 後でクライアントの接続プロパティに入力する VPN サーバーのドメイン名または IP アドレスは、サブジェクトの識別名 (CN=) およびサブジェクトの代替名(--san)のいずれかに含まれている必要があります。ただし、両方であることが望ましいです。両方とも vpn.yamahaRTX.com を VPN のホスト名に置き換えてください。そうしないと、クライアントとサーバー間の接続が失敗します。
今回のStrongSwanソフトによる接続では、ホスト名は実際には存在しない架空のものでも問題なかったです。（接続のためのIP/FQDN設定項目とは別に、server identityを記載する項目もあったため）
- Windows 7 に同梱されている VPN クライアントを使用する場合は、上のコマンドにあるようにホスト証明書に serverAuth 拡張鍵使用フラグを追加してください。追加しないとクライアントが接続を拒否します。さらに、OS X 10.7.3 以下では ikeIntermediate フラグが必須です。フラグを追加することで何か問題が発生したりはしないので、毎回追加するべきです。
- iOSではSSL/TLSサーバ証明書の期限が最大825日（2020年9月から最大398日）でそれ以上の期限の証明書の場合、警告や無効と判定されるようです。iOSを使う予定の場合は念のため証明書のlifetimeを短く設定して下さい。

新しく生成された証明書のプロパティを確認するには、次のコマンドを実行:
```
$ ipsec pki --print --in certs/vpnHostCert.pem
```
出力:
```
  subject:  "C=JP, ST=Tokyo, L=Machida-shi, O=yamahaRTX, CN=vpn.yamahaRTX.com"
  issuer:   "C=JP, O=yamahaRTX, CN=yamahaRTX Root CA"
  validity:  not before Sep 10 03:59:32 2024, ok
             not after  Dec 13 03:59:32 2026, ok (expires in 823 days)
  serial:    79:c6:f2:fa:5a:25:c3:96
  altNames:  vpn.yamahaRTX.com, vpn2.yamahaRTX.com, 111.111.111.111
  flags:     serverAuth ikeIntermediate 
  authkeyId: f6:37:3e:db:c1:26:b0:15:32:7f:3f:0b:41:c4:87:67:6a:4a:2b:e2
  subjkeyId: 6c:f6:77:be:23:70:21:fa:16:1a:a2:82:25:92:11:c9:f3:e6:0b:3c
  pubkey:    RSA 2048 bits
  keyid:     85:cb:ac:23:68:e2:c4:c7:39:16:a2:c5:76:1f:18:15:c1:65:8c:1e
  subjkey:   6c:f6:77:be:23:70:21:fa:16:1a:a2:82:25:92:11:c9:f3:e6:0b:3c
```
<br>

**クライアント証明書**
クライアントが VPN を使用するには個人証明書が必要になります。ホスト証明書の生成とほとんど同じです。本来はメールアドレスを使ってクライアント証明書を作成するのですが、今回はそれだとRTXルータに接続できなかったので架空のホストネームを使って証明書を作成しています。
```
$ ipsec pki --gen --type rsa --size 2048 --outform pem > private/ClientKey.pem
## 秘密鍵は所有者のみrw権限
$ chmod 600 private/ClientKey.pem
$ ipsec pki --pub --in private/ClientKey.pem --type rsa | \
      ipsec pki --issue --lifetime 824 --outform pem \
                --cacert cacerts/yamahaRTXCert.pem \
                --cakey private/yamahaRTXKey.pem \
                --digest sha1 \
                --dn "C=JP, ST=Tokyo, L=Machida-shi, O=yamahaRTX, CN=client.yamahaRTX.com" \
                --san client.yamahaRTX.com \
                --flag clientAuth \
          > certs/ClientCert.pem
```
2048ビットの RSA 秘密鍵 ClientKey.pem が作成されます。次に公開鍵を抽出してパイプで渡し、クライアント証明書 ClientCert.pem を発行して CA で署名しています。ハッシュ形式はSHA1です。証明書の有効期限は約2年 (824日) で、架空のホストネームによってクライアントは識別されます (例: client.yamahaRTX.com)。
- clientAuthフラグを付けると対応デバイス、ソフトが増えるようです。（※効果は未確認）

新しく生成された証明書のプロパティを確認するには、次のコマンドを実行:
```
$ ipsec pki --print --in certs/ClientCert.pem
```
出力:
```
  subject:  "C=JP, ST=Tokyo, L=Machida-shi, O=yamahaRTX, CN=client.yamahaRTX.com"
  issuer:   "C=JP, O=yamahaRTX, CN=yamahaRTX Root CA"
  validity:  not before Sep 13 03:15:15 2024, ok
             not after  Dec 16 03:15:15 2026, ok (expires in 823 days)
  serial:    20:bd:db:a5:96:a7:30:51
  altNames:  client.yamahaRTX.com
  flags:     clientAuth 
  authkeyId: f6:37:3e:db:c1:26:b0:15:32:7f:3f:0b:41:c4:87:67:6a:4a:2b:e2
  subjkeyId: c9:d6:6b:78:29:9f:02:73:47:76:45:96:5d:bd:22:94:45:c9:7c:57
  pubkey:    RSA 2048 bits
  keyid:     6d:90:9e:e0:87:b6:cd:64:00:75:34:61:c3:fd:f9:86:99:7e:11:6d
  subjkey:   c9:d6:6b:78:29:9f:02:73:47:76:45:96:5d:bd:22:94:45:c9:7c:57
```
<br>

最後のコマンドは必要な証明書と鍵を全て PKCS#12 ファイルに詰め込んでいます。サーバ、クライアントが使用するときに便利なフォーマットです。
```
$ openssl pkcs12 -export -name "My own VPN client certificate" \
                 -inkey private/ClientKey.pem \
                 -in certs/ClientCert.pem  \
                 -certfile cacerts/yamahaRTXCert.pem \
                 -caname "yamahaRTX Root CA" \
                 -out Client.p12
$ openssl pkcs12 -export -name "My own VPN server certificate" \
                 -inkey private/vpnHostKey.pem \
                 -in certs/vpnHostCert.pem  \
                 -certfile cacerts/yamahaRTXCert.pem \
                 -caname "yamahaRTX Root CA" \
                 -out Server.p12
# 念のためeveryoneにrwx権限付与。インストール後は権限制限か削除要。
$ chmod 777 Client.p12 Server.p12 cacerts/yamahaRTXCert.pem                 
```
新しく生成されたPKCS#12ファイルの中身を確認するには、次のコマンドを実行:
```
$ openssl pkcs12 -in Client.p12 -nodes -passin pass:hogehoge | openssl x509 -noout -fingerprint -text
$ openssl pkcs12 -in Server.p12 -nodes -passin pass:hogehoge | openssl x509 -noout -fingerprint -text
```
:::note warn
Android12以下のバージョンでは上記コマンドで作成したpkcs#12ファイルを読み込む時、パスワードError等が出てインストールできないバグがあります（参考：[Stack overflow: Installing pcks12 certificate in android "wrong password" bug](https://stackoverflow.com/questions/71872900/installing-pcks12-certificate-in-android-wrong-password-bug) ）。その場合は代わりに、legacyオプション付きでコマンドを実行して作成して下さい。
```
$ openssl pkcs12 -export -name "My own VPN client certificate" \
                 -legacy \
                 -inkey private/ClientKey.pem \
                 -in certs/ClientCert.pem  \
                 -certfile cacerts/yamahaRTXCert.pem \
                 -caname "yamahaRTX Root CA" \
                 -out legacy_Client.p12
$ openssl pkcs12 -export -name "My own VPN server certificate" \
                 -legacy \
                 -inkey private/vpnHostKey.pem \
                 -in certs/vpnHostCert.pem  \
                 -certfile cacerts/yamahaRTXCert.pem \
                 -caname "yamahaRTX Root CA" \
                 -out legacy_Server.p12
# 念のためeveryoneにrwx権限付与。インストール後は権限制限か削除要。
$ chmod 777 legacy_Client.p12 legacy_Server.p12 cacerts/yamahaRTXCert.pem                     
```
新しく生成されたPKCS#12ファイルの中身を確認するには、次のコマンドを実行:
```
$ openssl pkcs12 -legacy -in legacy_Client.p12 -nodes -passin pass:hogehoge | openssl x509 -noout -fingerprint -text
$ openssl pkcs12 -legacy -in legacy_Server.p12 -nodes -passin pass:hogehoge | openssl x509 -noout -fingerprint -text
```
:::
:::note alert
pkcs#12ファイルのパスワードは強固なものにして下さい。破られると、サーバ、クライアント証明書の秘密鍵が流出してしまいます。
:::

### 2. サーバ証明書設置とルータセッティング
**ファイル設置**
まず作成したサーバ証明書をルータに送ります。場所はルータ内部のRTFS領域か、あればUSB/SDストレージどれでもいいです。自分は可用性のためUSBを使いましたが、必要に応じて適宜読み替えて下さい。
- [RTFS](https://www.rtpro.yamaha.co.jp/RT/docs/rtfs/index.html)
- [外部メモリの利用](https://www.rtpro.yamaha.co.jp/RT/docs/external-memory/index.html)

自分はsftpを使い送りました。tftpでも直接外部メモリに事前に置いておく等どれでも構いません。下記sftp使用例です。
- [SFTP](https://www.rtpro.yamaha.co.jp/RT/docs/sftpd/)

（※自分はlan1を内部LAN、lan2を外部接続（IP:111.111.111.111）とし、ルータ内部IPは192.168.0.1/24としています。IP/LAN設定に関しては適宜読み替えて下さい。）

事前ルータセッティング
```
# administrator
* (for usb使用)
# usbhost use on
* (for ssh/sftp使用）
# login user username password
** (新規ユーザーでデフォルト管理権限変更必要があれば。他RTXではadministrator=onの場合も。設定値はデフォルト値)
# user attribute username administrator=1
# sshd host lan1
# sshd host key generate
# sshd service on
** (RTX1300では下記アルゴリズム設定可能だった。他では無理かも)
# sshd encrypt algorithm aes128-ctr aes192-ctr aes256-ctr aes128-cbc aes192-cbc aes256-cbc 3des-cbc
# sftpd host lan1
# save
# quit
```
Windows PowerShell起動、データ転送
```
$ cd (サーバ証明書があるディレクトリ)
$ sftp username@192.168.0.1
* (RTFS領域等に置く場合はusb1:削除や指定ディレクトリ名を変えて下さい。usbのFAT32では大小文字区別なし。）
# put Server.p12 usb1:/pki/server.p12
# exit
```
[IKEv2 証明書設定のためのルータセッティング](https://www.rtpro.yamaha.co.jp/RT/manual/rt-common/ipsec/pki_certificate_file.html)
```
* (所定ファイルがあるか確認)
# show file list usb1:/pki
# administrator
# pki certificate file 1 usb1:/pki/server.p12 pkcs12 password
* (証明書が設定されているか確認）
# show pki certificate summary 1
```
**IKEv2 証明書利用のためのルータセッティング**

::: note info
既に外部インターネットに接続できていることが前提。
:::
IP filter incomingとNAPTをIKEv2のためにpassにする。適宜自分の設定用に読み替えて下さい。
```
ip filter 400100 pass * 192.168.0.1 udp * 500
ip filter 400101 pass * 192.168.0.1 esp
ip filter 400102 pass * 192.168.0.1 udp * 4500
ip filter 400103 pass * 192.168.0.1 udp * 1701

nat descriptor type 20000 masquerade
nat descriptor masquerade static 20000 1 192.168.0.1 udp 500
nat descriptor masquerade static 20000 2 192.168.0.1 esp
nat descriptor masquerade static 20000 3 192.168.0.1 udp 4500
nat descriptor masquerade static 20000 4 192.168.0.1 udp 1701
```
自分はIPIPv6_plusを使っているので、適宜自分の設定用に読み替えて下さい。下記はフィルタとNAPT設定を外部接続に適用してます。
```
tunnel select 1
 tunnel encapsulation ipip
 tunnel endpoint remote address ffff:ffff:ffff:ffff::65
 ip tunnel mtu 1460
 ip tunnel secure filter in 400100 400101 400102 400103
 ip tunnel secure filter out 500000
 ip tunnel nat descriptor 20000
 tunnel enable 1
``` 
新規トンネル10設定です。他と設定値がかぶらないよう番号付けして下さい。
```
tunnel select 10
 description tunnel RTX1300_Remote_IKEv2
 tunnel encapsulation ipsec
 ipsec tunnel 10
  ipsec sa policy 10 10 esp aes-cbc sha-hmac
  ipsec ike version 10 2
  ipsec ike auth method 10 certificate
  ipsec ike pki file 10 certificate=1
  ipsec ike keepalive log 10 off
  ipsec ike keepalive use 10 on rfc4306 10 3
  ipsec ike local name 10 vpn.yamahaRTX.com fqdn
  ipsec ike remote name 10 client.yamahaRTX.com fqdn
  ipsec ike mode-cfg address 10 1
  ipsec auto refresh 10 off
 tunnel enable 10

ipsec auto refresh on
ipsec ike mode-cfg address pool 1 192.168.0.100-192.168.0.200/24 

ip lan1 address 192.168.0.1/24
ip lan1 proxyarp on 
```
- 暗号化アルゴリズムは接続確認ができたら適宜変更して下さい。（設定値はデフォルト:aes-cbc sha-hmac）
- 拠点間利用で始動側として動く場合、多くのRTXルータでデフォルトで modp1024 が使われます（応答側なら任意のものを使用）。接続、セキュリティの都合で変更要の場合は下記設定で変更して下さい。[15.24 IKE が用いるグループの設定](https://www.rtpro.yamaha.co.jp/RT/manual/rt-common/ipsec/ipsec_ike_group.html)
（例：ipsec ike group 10 modp2048)
- keepalive, mode-cfg, auto refresh設定は[リモートアクセスVPN(IKEv2)の設定手順](https://www.rtpro.yamaha.co.jp/RT/docs/ipsec/ikev2_ras/index.html)から流用しました。
- auth method を certificate にすることで証明書認証になります。（設定値デフォルトではautoで所定条件を満たさない限りPSK認証となる）[15.3 IKE の認証方式の設定](https://www.rtpro.yamaha.co.jp/RT/manual/rt-common/ipsec/ipsec_ike_auth_method.html)
- certificate=数字 はpkiコマンドで証明書を設定した時の数字を指定して下さい。
- mode-cfg address はVPNクライアントに割り振られるIP範囲です。LAN内部のDHCP範囲と被らないように設定して下さい。
- local, remote name は証明書のCN値、又はSAN値の値を入れて下さい。
:::note warn
  ※自分はルータ設定をFQDN設定でしか検証していません。他のname形式でも問題ないかは検証していません。
:::
- 自分はlan1を内部LAN、lan2を外部接続（IP:111.111.111.111）とし、ルータ内部IPは192.168.0.1/24としています。IP/LAN設定に関しては適宜読み替えて下さい。

**全設定例**
```
ip filter 400100 pass * 192.168.0.1 udp * 500
ip filter 400101 pass * 192.168.0.1 esp
ip filter 400102 pass * 192.168.0.1 udp * 4500
ip filter 400103 pass * 192.168.0.1 udp * 1701

nat descriptor type 20000 masquerade
nat descriptor masquerade static 20000 1 192.168.0.1 udp 500
nat descriptor masquerade static 20000 2 192.168.0.1 esp
nat descriptor masquerade static 20000 3 192.168.0.1 udp 4500
nat descriptor masquerade static 20000 4 192.168.0.1 udp 1701

tunnel select 1
 tunnel encapsulation ipip
 tunnel endpoint remote address ffff:ffff:ffff:ffff::65
 ip tunnel mtu 1460
 ip tunnel secure filter in 400100 400101 400102 400103
 ip tunnel secure filter out 500000
 ip tunnel nat descriptor 20000
 tunnel enable 1

tunnel select 10
 description tunnel RTX1300_Remote_IKEv2
 tunnel encapsulation ipsec
 ipsec tunnel 10
  ipsec sa policy 10 10 esp aes-cbc sha-hmac
  ipsec ike version 10 2
  ipsec ike auth method 10 certificate
  ipsec ike pki file 10 certificate=1
  ipsec ike keepalive log 10 off
  ipsec ike keepalive use 10 on rfc4306 10 3
  ipsec ike local name 10 vpn.yamahaRTX.com fqdn
  ipsec ike remote name 10 client.yamahaRTX.com fqdn
  ipsec ike mode-cfg address 10 1
  ipsec auto refresh 10 off
 tunnel enable 10
 
ipsec auto refresh on
ipsec ike mode-cfg address pool 1 192.168.0.100-192.168.0.200/24 
pki certificate file 1 usb1:/pki/server.p12 pkcs12 password

ip lan1 address 192.168.0.1/24
ip lan1 proxyarp on
```
### 3. クライアント証明書設置とアプリセッティング
**アプリ設定**
StrongSwanアプリを公式からダウンロード、インストールします。
- StrongSwan 公式site (https://strongswan.org/)
- Google Play Store: StrongSwan App (https://play.google.com/store/apps/details?id=org.strongswan.android)

[アプリ設定画面]
![Screenshot_20240917-120952.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882184/929e8afc-c2be-0ae0-a800-5e1de35e6cc8.png)

| 設定項目 | 推奨設定値 | コメント |
|:-----------|:------------|:------------|
| Server       | IP/FQDN        | RTXルータのIP、又はFQDN。IPv6にだけ紐づいたネットボランチドメインでは接続できなかった。（IPv4の紐づけも必要そう）       |
| VPN Type     | IKEv2 Certificate      |        |
| User certificate       | Client.p12        | Install USER CERTIFICATEタブを選択し、作成したClient.p12ファイルを選択。VPN証明書としてインストール  |
| CA certificate         | yamahaRTXCert.pem          | Select automaticallyをuncheckedし、Select CA certificateからyamahaRTXCert.pemをインポート           |
| Profile name       | 好きなプロファイル名       |        |
| Server identity    | vpn.yamahaRTX.com     | サーバ証明書のCN値,又はSAN値      |
| Client identity | client.yamahaRTX.com | クライアント証明書のCN値,又はSAN値      |
|他設定項目|default|個人必要に応じて適宜設定して下さい。他全てoff、又は空欄でも自分は接続できました。詳しい設定内容についてはstrongswanのドキュメントを参照して下さい。|
- 各種証明書のインストールはStrongSwanアプリからでも、Androidのセキュリティ設定項目からでもどちらでも構いません。StrongSwanアプリからCA証明書をインストールした場合は、StrongSwanアプリからしかCA証明書は見えないようでした。

### 4. 結果
![strongswanconnect.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882184/372efe53-0888-b536-28c8-333af78b71cc.jpeg)
やったー！

## 制限事項と課題・改善点
- Android/iphone両方のデフォルトVPNソフトでIPsec/IKEv2-PSK(事前共有鍵)方式でRTXルータ（自分の場合はRTX1300）に接続できています。
※注意点としてルータ設定項目の、
*ipsec ike remote name 1 hogehoge.com fqdn*
スマホのIPsecID、ローカルID用のnameを hogehoge.com fqdn のようなFQDN形式にする必要がありました。（普通に *ipsec ike remote name 1 hogehoge key-id* 設定だと接続失敗となった）
公式サイト（手順）：[リモートアクセスVPN(IKEv2)の設定手順](https://www.rtpro.yamaha.co.jp/RT/docs/ipsec/ikev2_ras/index.html)
- 現時点では、IKEv2 証明書 + EAP-MD5 user/password 拡張認証対応ができていません。(StrongSwanでError: no EAP key found on host "client.yamahaRTX.com" - "%any"）
架空のホストネームをクライアントが使っているからかもしれません。（※原因調査中）
- Windows10のデフォルトVPNソフトでRTXルータに接続できるか試したところ無理でした（※原因調査中）。IKEv2の接続のためにはWindows10でもStrongSwanソフトを導入するならばできそうです。(Windows10にはデフォルトでIKEv2-PSK接続設定もないようです)。
- Windows10ではL2TP/IPsec PSKでRTXルータに現状接続しています。設定はこちらを参照下さい。
[RTX1200 で L2TP/IPsec の VPN を構築する](https://qiita.com/mizutoki79/items/daad6aa30e6f1cce7ac9)、
[Windows10とヤマハのルータ間でL2TP接続をする](https://qiita.com/kazuhiro1982/items/772dd854da83d4b5ff28)
- 現時点でiOS/iphoneで、デフォルトVPNソフトのIKEv2証明書接続は検証していません。こちらもAndroidと同様にSHA1証明書形式に対応していないという話があります（※未検証）。
別に検証された方がいるようで、RSA2048でなく1024bitの鍵でiphoneでIKEv2証明書接続に成功されてるようです。
[マイネ王： IKEv2 でのVPN接続が応答しない](https://king.mineo.jp/question-answer/%E3%83%87%E3%83%BC%E3%82%BF%E9%80%9A%E4%BF%A1%EF%BC%8F%E9%9F%B3%E5%A3%B0%E9%80%9A%E8%A9%B1+%E3%83%87%E3%83%BC%E3%82%BF%E9%80%9A%E4%BF%A1/38302)
- 参考(RTXサーバではないです)：[IKEv2で接続できた各OSの認証方式とクライアント証明書](https://kusoneko.blogspot.com/2018/03/ikev2-usable-client-certificate.html)
- free/paid の正規CAから取得したサーバ、クライアント証明書で代替はできませんでした。ルートCA以外に中間認証局からの中間証明書があるとRTXルータは非対応のようです（ルート証明書がない！（？あるだろ）というErrorが発生）。ルートCAから直接サーバ、クライアント証明書が署名されている場合は利用可能だと思いますが、あまり事例はないと思います。

# お疲れ様でした
設定を色々検証したわけでなく、なんとかIKEv2証明書での接続が通る設定を作りました。他設定でも疎通できる可能性があります。何か情報ありましたら色々教えて下さると幸いです。

#