L2TP/IPSec VPN をPSKから証明書に対応させようとしたけどダメでした

# 始めに
**この記事は失敗談です**
書きながら進めていたので、節々できそうな書き方していますが、出来ていないです。
知識不足で出来なかったというより、おそらく非対応。

使用環境は YAMAHA RTX1200 ですが、同じくヤマハのVPNルーターである、RTX830, RTX810, RTX1210, RTX3500 等でも同様のはず。
L2TP/IPSec VPN 自体はこちら [[RTX1200 で L2TP/IPsec の VPN を構築する](https://qiita.com/mizutoki79/items/daad6aa30e6f1cce7ac9)] の様に設定済みであることを想定します。
コマンド中に `1` などの数字が出てきますが、GATEWAY_ID だったり CERT_ID だったりします。
CERT_IDについては本記事中で設定していますが、GATEWAY_IDについては本記事中で設定していません。
上記記事通りに設定してあると仮定しての値になります。
詳しくは参考として貼ってある公式のコマンドリファレンスを参照してください。
設定状態によって数字が変わってくるので注意してください。

# 証明書の準備

## オレオレ証明書について

この環境はあくまでプライペーとの環境で、使用頻度がそこまで高くないため、証明書の期限を気にするのが面倒に感じ、
PSKに戻す前提で、実験のため所謂オレオレ証明書を使おうと思いましたが、、、

[yamaha公式の説明ページ](http://www.rtpro.yamaha.co.jp/RT/docs/ipsec/ike2_pki.html)

>
PKI証明書を利用するための仕様は次の通りです。
・証明書の公開鍵暗号方式RSA、署名方式SHA1に対応します。
・ルーターの機器証明書を書き込む際のファイル形式として、PKCS#12に対応します。
・ルーターの機器証明書は、ルートCAによって署名された証明書である必要があります。
・ルーターの機器証明書として自己署名の証明書を使用することはできません。
・証明書失効リスト(CRL)を使用して相手から受信した証明書の失効確認を行うことができます。
・CA証明書、およびCRLを書き込む際のファイル形式として、X.509 PEMに対応します。

…
> ルーターの機器証明書として自己署名の証明書を使用することはできません。

オレオレ証明書ではダメでした。

## Let's Encrypt のSSLサーバー証明書をPKCS#12に変換して使用する

CLI で `certbot` を `--standalone` や `--manual` で実行してみていたのですが、どうもうまく行かなかったので、
Synology NAS経由で発行したものを使いました。
参考: https://qiita.com/mizutoki79/items/7702bd12da3373f425ea
(この辺はまた別の機会に検証)
Let's Encrypt で発行されるファイルは
- `cert.pem`
- `chain.pem`
- `privkey.pem`
なので、これを PCKS#12 に変換します。
参考: [web net FORCE - Let’s Encrypt（Certbot）のSSLサーバー証明書をP12形式（PKCS12）に変換してメールサーバー等で使用する](https://webnetforce.net/lets-encrypt-p12-pkcs12/)
※ Windowsで `openssl`が入っていない場合は `scoop install openssl` でインストール出来ますし、wslを使うことも出来ます。

```posh
openssl pkcs12 -export -in .\cert.pem -inkey .\privkey.pem -certfile .\chain.pem -out cert.p12
```

パスワードを求められるので、設定しましょう。
これでカレントディレクトリにPKCS#12形式のPKIファイルが生成されました。

# PKIファイルをルーターに保存する

PC からルーターへのファイル保存には `tftp` を利用出来ます。
## Windowsでtftpを使える様にする

```PowerShell
# 検索
Get-WindowsOptionalFeature -Online | ? FeatureName -Match 'tftp'
# 有効化
Enable-WindowsOptionalFeature -Online -FeatureName TFTP
# 確認
gcm tftp
```

## ルーター側でtftpを許可する

参考: [rtpro - コマンドの使い方 - 2.3.1 TFTP による設定手順](http://www.rtpro.yamaha.co.jp/RT/manual/nvr500/howtouse/tftp_howtouse.html)
参考: [rtpro - RTFS](http://www.rtpro.yamaha.co.jp/RT/docs/rtfs/index.html#command)
デフォルトでは全てのホストからのtftpは許可されていません
※ 作業が終了したら全てのホストからのtftpを拒否するように設定を戻しておきます。

```shell-session
> telnet 192.168.100.1  # ルーターのプライベートIPアドレス
> administrator
Password:
# tftp host 192.168.100.x  # 送信元となる PC のプライベートIPアドレス
# save
```

## PCからファイルを送信します

```PowerShell
tftp -i 192.168.100.1 put .\cert.p12 /cert.p12/'ルーターの管理者パスワード'
```

これでRTFSのルートディレクトリ直下にファイルが置かれます
再度ルーターにログインしてtelnet接続状態で下記コマンドを叩くとファイルが保存されていることを確認出来ます。

```shell-session
show file list /
```

# ルーターのVPNに証明書を設定する

参考: [rtpro - IPsec/IKE デジタル署名、EAP-MD5認証対応](http://www.rtpro.yamaha.co.jp/RT/docs/ipsec/ike2_pki.html#detail_expiration)

ルーターに管理者としてログインします

```shell-session
# pki certificate file 1 /cert.p12 pkcs12 'PKCS12ファイル作成時に設定したパスワード'
# show pki certificate summary 1
```
ここで CERT_ID が `1` に設定されています。
ちゃんと復号出来ていれば証明書の内容が表示されます
参考: [rtpro - 18.50.1 証明書ファイルの設定](http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/ipsec/pki_certificate_file.html)

```shell-session
# tunnel select 1
tunnel1# ipsec tunnel 1
tunnel1# ipsec ike auth method 1 certificate
tunnel1# ipsec ike pki file 1 certificate=1
tunnel1# save
```

```shell-session
# ipsec ike auth method 1 certificate
```
の部分、IKE認証方式をデジタル証明書方式に設定しています
これはデフォルトで `auto` になっていて、autoの優先順位としては

1. 事前共有鍵方式
2. デジタル署名方式
3. EAP-MD5方式

となっています。

事前共有鍵の場合、対象の設定しかしない場合は auto のままで問題無いですが、
今回は事前共有鍵の設定を残したままデジタル署名方式の設定を適応させたいので、設定しておきました。

# ここから何がダメだったのかの話

先ほど、証明書を使うように指定したコマンド `ipsec ike auth method 1 certificate` と `ipsec ike pki file 1 certificate=1` について
こちら [[rtpro - IPsec/IKE デジタル署名、EAP-MD5認証対応](http://www.rtpro.yamaha.co.jp/RT/docs/ipsec/ike2_pki.html#new_command)] に書いてあるノートを見ると
>本コマンドはIKEv2でのみ有効であり、IKEv1の動作に影響を与えない。

とあります。
では、こちら [[rtpro - IKEv2](http://www.rtpro.yamaha.co.jp/RT/docs/ipsec/ike2.html)] を参考に IKEv2移行作業を行っていきます。
IKEv1 からの移行について上記記事では以下のように書かれています。
> IKEv1からIKEv2への移行
これまでIPsec(IKEv1)を運用されてきた場合は、既存の設定を流用しながらIKEv2へ移行することができます。主な違いは、ipsec ike remote nameコマンドとipsec ike local nameコマンドの設定が共に必須になっている点と、ipsec ike versionコマンドで明示的にIKEv2の使用を宣言する必要があるという点です。

※ 上記記事を読んで頂けたら分かりますが、IKEv2でのみ有効でIKEv1の動作に影響を与えないコマンドがあるようにその逆にIKEv1でのみ有効でIKEv2の動作に影響を与えないコマンドもたくさんありますので、実際に移行する際にはその点にも注意してください。

`ipsec ike remote name` / `ipsec ike local name` への理解が不十分のままですが、

```shell-session
# tunnel select 1
tunnel1# ipsec tunnel 1
tunnel1# ipsec ike version 1 2
tunnel1# ipsec ike local name 2 192.168.100.1 ipv4-addr
tunnel1# ipsec ike remote name 2 xxx.xxx.xxx.xxx ipv4-addr  # 実際に接続するクライアントのIPアドレス
tunnel1# save
```

しかし、クライアントに証明書をインポートしてみましたが、どうにも動きません。
一旦クライアントの設定もPSKに戻し、
IKEv1 に戻し、`remote name` を消してみたら接続出来たので、`local name` は合っているように思います。
IKEv1 の状態で、 `local name` を消し、 `remote name` は上記設定にしたら接続出来なかったので、 `remote name` の設定は間違っているかもしれません。

さらに先ほどの IKEv2 の記事を見てみると以下の記述があります。
> 以下の機能には対応していません。
>
未対応／非対応機能一覧
IPComp
Vender ID ペイロード
Configuration ペイロード
トランスポートモード

はい、そうです。
L2TP/IPsecではトンネルはL2TPで構築するので、IPsecはトランスポートモードで使用します。
なので、私の理解が正しければ、
現状YAMAHAルーターでL2TP/IPsecで証明書認証は構築出来ず、拠点間通信のIPSecでのみ証明書認証のIKEv2を設定出来るという状況だと思います。

ちなみにトランスポートモード/トンネルモードの違いについてはこちらが分かりやすいと思います。
[ネットワークエンジニアとして - IPsec - Transport mode / Tunnel mode](https://www.infraexpert.com/study/ipsec6.html)

## 設定を戻す
基本的に消したいコマンドの先頭に `no` をつければ設定を消せるので、

```shell-session
# no tftp host
# no pki certificate file 1
# tunnel select 1
tunnel1# ipsec tunnel 1
tunnel1# no ipsec ike auth method 1
tunnel1# no ipsec ike version 1
```

というように消していけばよい。

ファイルの削除は

```shell-session
# delete /cert.p12
```

で行える。

参考: [rtpro - RTFS](http://www.rtpro.yamaha.co.jp/RT/docs/rtfs/index.html)