Cisco WLCで802.1X認証（EAP-TLS）をLocalEAPでやってみる

## はじめに
このエントリはCisco WLCのEAP-TLSをWLC自身で認証する、ローカルEAP(TLSのみ)の手順について記載します。
ローカルEAPではPEAPやLEAPの設定もできますが、ひとまずTLSのみです。


## 対象機器および環境

* Cisco Virtual Wireless LAN Controller (Ver.8.2.x)
* Windows10

## このエントリを読むとできること

* WLCをRADIUSサーバ替わりにして
* EAP-TLS認証ができるようになる

はず。

## 関連するエントリ
[Cisco WLCにSSIDを作成する（802.1X/PSK） コマンド編＋よくつかうコマンド](https://qiita.com/haruca_tech/items/088dda5d2110cf0962a8)
[Cisco WLC と FreeRADIUS を利用した EAP-TLS認証](https://qiita.com/haruca_tech/items/a9cf4a9168f325e65513)
[OpenSSLでプライベート認証局の構築（ルートCA、中間CA）](https://qiita.com/haruca_tech/items/ac5ece9618a613f37ce5)

## 前提条件

ローカルEAPは中間認証局に対応していないため、前回までのやり方が使えません。
なぜだ。。。
[Cisco Wireless Controller Configuration Guide, Release 8.2](https://www.cisco.com/c/en/us/td/docs/wireless/controller/8-2/config-guide/b_cg82/b_cg82_chapter_0100111.html#ID1731)
そして、日本語コンフィギュレーションガイドに当該の記載がなく、英語版には記載されている。章立ても違うみたい。
なぜなんだ。。。

> Local authentication with certificates of second level hierarchy (CA + intermediate CA + device) is not supported.

いうわけで、今回はサーバ証明書もクライアント証明書もルートCAから発行しています。


## WLCの設定

**[別エントリで構築したPKI環境](https://qiita.com/haruca_tech/items/ac5ece9618a613f37ce5)** で証明書を発行していきます。

### サーバ証明書発行

```
(VMwlc01というサーバに対して発行するので、新規ディレクトリを作成する）
mkdir -p /opt/pki/Server/VMwlc01
cd /opt/pki/Server/VMwlc01

(パスワード無し秘密鍵とCSRを同時に発行しています)
openssl req -new -out VMwlc01_csr.pem -newkey rsa:2048 -nodes -keyout VMwlc01_key.pem -subj "/C=JP/ST=Tokyo/O=EXAMPLE/CN=VMwlc01.example.net"

(RootCAで署名する)
cd /opt/pki/RootCA
openssl ca -config ../configs/openssl_sign.cnf -out ../Server/VMwlc01/VMwlc01_crt.pem -in ../Server/VMwlc01/VMwlc01_csr.pem -cert RootCA_crt.pem -keyfile RootCA_key.pem -passin pass:rootcaprivkeypass -batch -extensions v3_server

(余計な文字列を取り除きます)
cd /opt/pki/Server/VMwlc01
openssl x509 -in VMwlc01_crt.pem -out VMwlc01_crt.pem

(WLCに証明書と秘密鍵のセットをエクスポートするためPKCS#12ファイルを作成)
openssl pkcs12 -export -out VMwlc01_crt.p12 -in VMwlc01_crt.pem -inkey VMwlc01_key.pem -passout pass:exportpass

(WLCがPKCS#12をそのまま読めないのでPEM変換？する)
(最後の -passout は秘密鍵を "privkeypass" の文字列で暗号化)
openssl pkcs12 -in VMwlc01_crt.p12 -out VMwlc01_crt_final.pem -passin pass:exportpass -passout pass:privkeypass
```

### WLCに証明書をインストール

#### ルートCA証明書

```
/opt/pki/
|-- RootCA
|   |-- RootCA_crt.pem
|   |-- RootCA_csr.pem
|   |-- RootCA_key.pem
(RootCA_crt.pemがルートCA証明書)
```

上部メニュー「COMMANDS」→左側メニュー「DownloadFile」を選択
FileTypeは「Vendor CA Certificate」を選択
その下は転送方法を環境に合わせて修正
（下図では、FTPで転送してます）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/334782/40cbf23d-86b8-39fa-6622-483022683399.png)

転送がうまくいったら、次のメッセージが出るので、「ClickHere」のリンクをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/334782/2025b0f2-11f0-d667-164b-1123f1a66873.png)

「Save and Reboot」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/334782/d3cf216b-e7ac-0861-dd6f-f4dbc9699e7a.png)


#### サーバ証明書

```
/opt/pki/
|-- Server
|   |-- VMwlc01
|   |   |-- VMwlc01_crt.p12
|   |   |-- VMwlc01_crt.pem
|   |   |-- VMwlc01_crt_final.pem
(VMwlc01_rt_final.pemがサーバ証明書＋秘密鍵)
```

　

上部メニュー「COMMANDS」→左側メニュー「DownloadFile」を選択
「FileType」は「Vendor Device Certificate」を選択
「Certificate Password」は作成時に設定した秘密鍵のパスワードを入力
（今回の例では `privkeypass` です）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/334782/d8de973e-f2c2-5a5e-8a48-44c215de34fd.png)

転送がうまくいったら、次のメッセージが出るので、「ClickHere」のリンクをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/334782/2025b0f2-11f0-d667-164b-1123f1a66873.png)

「Save and Reboot」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/334782/d3cf216b-e7ac-0861-dd6f-f4dbc9699e7a.png)


### WLCの証明書を確認

CA証明書
上部メニュ「SECURITY」→左側メニュ「Advanced」→「Vendor Certs」→「CA Certificate」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/334782/4807e926-afda-d4e9-9b3a-cf22645e1b8d.png)

サーバ証明書
上部メニュ「SECURITY」→左側メニュ「Advanced」→「Vendor Certs」→「CA Certificate」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/334782/e433f58c-d233-59b7-06ee-24916202a37f.png)

### Local EAPの設定

ローカルEAPのプロファイルを作成して、WLANに適用させる。という流れです。

上部メニュ「SECURITY」→左側メニュ「Local EAP」→「Profiles」を選択し、画面右上の「New...」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/334782/8fe579b2-f551-851b-dc80-1e894f805804.png)

　
プロファイル名は適当なものを入力し「Apply」をクリック（例では `eap-tls` というプロファイル名にしています）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/334782/5c5665c5-8b6f-7ff5-4af4-bfd6e6080b96.png)


　
すると、一覧に表示されるので、作成したプロファイル名のリンクをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/334782/a639222c-90c4-e303-7049-cf1d53263d61.png)


　
デフォルトからの変更点は以下のとおり

* 「EAP-TLS」にチェック
* 「Client Certificate Required」にチェック
* 「Certificate Issuer」をVendorに変更

として、右上の「Apply」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/334782/6d12d499-5c8b-f767-e4ad-872ffe70258d.png)

　
これをWLANに適用していきます。
上部メニュ「WLANs」で表示されるWLAN IDの数字をクリック
（今回はID１の `IntraGeneral` に適用します）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/334782/2b06ad8d-be2b-8e84-5db7-28f4b7e1df40.png)

　
「Security」タブの「AAA Servers」子タブを開きます。
「RADIUS Servers」の「Authentication Servers」にチェックが入っているはずなので、チェックをオフにします
![image.png](https://qiita-image-store.s3.amazonaws.com/0/334782/dc958e67-0eb2-c061-de53-fd21ea3dac74.png)

　
もうすこし下に進んで、「Local EAP Authentication」にチェックを入れ、「EAP Profile Name」を先ほどLocalEAPで作成したプロファイル名にします。
最後に、画面右上の「Apply」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/334782/d3ed0962-af83-dc72-3e8a-90c19cdb1a6d.png)


## クライアント

### クライアント証明書発行

```
(Client02というクライアントに対して発行するので、新規ディレクトリを作成する）
mkdir -p /opt/pki/Client/Client02
cd /opt/pki/Client/Client02

(パスワード無し秘密鍵とCSRを同時に発行しています)
openssl req -new -out Client02_csr.pem -newkey rsa:2048 -nodes -keyout Client02_key.pem -subj "/C=JP/ST=Tokyo/O=EXAMPLE/CN=Client02.example.net"

(RootCAで署名する)
cd /opt/pki/RootCA
openssl ca -config ../configs/openssl_sign.cnf -out ../Client/Client02/Client02_crt.pem -in ../Client/Client02/Client02_csr.pem -cert RootCA_crt.pem -keyfile RootCA_key.pem -passin pass:rootcaprivkeypass -batch -extensions v3_client

(余計な文字列を取り除きます)
cd /opt/pki/Client/Client02
openssl x509 -in Client02_crt.pem -out Client02_crt.pem

(クライアントに証明書と秘密鍵のセットをエクスポートするためPKCS#12ファイルを作成)
openssl pkcs12 -export -inkey Client02_key.pem -in Client02_crt.pem -certfile ../../chainCA_crt.pem -out Client02_crt.p12 -passout pass:exportpass
※この時の -passoutオプションで設定するパスワードはクライアントにインポートするときに必要
```

### Windowsクライアント設定
[前回と同様です](https://qiita.com/haruca_tech/items/a9cf4a9168f325e65513#windows%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E8%A8%AD%E5%AE%9A)


## 動作確認

```:(Cisco_Controller)_debug_aaa_local-auth_eap_method_events_enable
*EAP_Framework_0: Jan 05 13:31:33.439: 00:21:6a:ca:4a:a2 eap_tls.c-PEER-EVENT: New context (EAP handle = 13000008)
*EAP_Framework_0: Jan 05 13:31:33.439: 00:21:6a:ca:4a:a2 eap_tls.c-AUTH-EVENT: Allocated new EAP-TLS context (handle = 69000008)
*EAP_Framework_0: Jan 05 13:31:33.439: eap_tls.c-AUTH-EVENT: Process Response, type: Identity
*EAP_Framework_0: Jan 05 13:31:33.439: eap_tls.c-AUTH-EVENT: Process Response: auth_complete:0, auth_success:0, eap-tls_FragsInQ: NO
*EAP_Framework_0: Jan 05 13:31:33.439: eap_tls.c-AUTH-EVENT: Sending Start Packet for TLS context 69000008
*EAP_Framework_0: Jan 05 13:31:33.439: 00:21:6a:ca:4a:a2 eap_tls.c-AUTH-EVENT: EAP TLS start message received
*EAP_Framework_0: Jan 05 13:31:33.439: 00:21:6a:ca:4a:a2 eap_tls.c-AUTH-EVENT: Setting up TLS SSL context
*EAP_Framework_0: Jan 05 13:31:33.439: 00:21:6a:ca:4a:a2 eap_tls.c-AUTH-EVENT: Setting default PKI trustpoint to vendor
*EAP_Framework_0: Jan 05 13:31:33.439: 00:21:6a:ca:4a:a2 eap_tls.c-AUTH-ERROR: Unable to get peer identity - disabled
*EAP_Framework_0: Jan 05 13:31:33.489: eap_tls.c-AUTH-EVENT: Process Response, type: TLS
*EAP_Framework_0: Jan 05 13:31:33.489: eap_tls.c-AUTH-EVENT: Process Response: auth_complete:0, auth_success:0, eap-tls_FragsInQ: NO
*EAP_Framework_0: Jan 05 13:31:33.489: 00:21:6a:ca:4a:a2 eap_tls.c-AUTH-EVENT: Queueing up fragment for TLS context 69000008
*EAP_Framework_0: Jan 05 13:31:33.489: 00:21:6a:ca:4a:a2 eap_tls.c-AUTH-EVENT: EAP TLS handshake message received
*EAP_Framework_0: Jan 05 13:31:33.490: 00:21:6a:ca:4a:a2 eap_tls.c-AUTH-EVENT: tls_send: 1096 byte eap packet sent
*EAP_Framework_0: Jan 05 13:31:33.490: 00:21:6a:ca:4a:a2 eap_tls.c-AUTH-EVENT: SSL Handshake has signalled a read block
*EAP_Framework_0: Jan 05 13:31:33.609: eap_tls.c-AUTH-EVENT: Process Response, type: TLS
*EAP_Framework_0: Jan 05 13:31:33.609: eap_tls.c-AUTH-EVENT: Process Response: auth_complete:0, auth_success:0, eap-tls_FragsInQ: NO
*EAP_Framework_0: Jan 05 13:31:33.609: 00:21:6a:ca:4a:a2 eap_tls.c-AUTH-EVENT: Queueing up fragment for TLS context 69000008
*EAP_Framework_0: Jan 05 13:31:33.609: 00:21:6a:ca:4a:a2 eap_tls.c-AUTH-EVENT: Sending ACK for TLS context 69000008
*EAP_Framework_0: Jan 05 13:31:33.609: 00:21:6a:ca:4a:a2 eap_tls.c-AUTH-EVENT: EAP TLS handshake message received
*EAP_Framework_0: Jan 05 13:31:33.609: 00:21:6a:ca:4a:a2 eap_tls.c-AUTH-EVENT: SSL Handshake has signalled a read block
*EAP_Framework_0: Jan 05 13:31:33.668: eap_tls.c-AUTH-EVENT: Process Response, type: TLS
*EAP_Framework_0: Jan 05 13:31:33.668: eap_tls.c-AUTH-EVENT: Process Response: auth_complete:0, auth_success:0, eap-tls_FragsInQ: NO
*EAP_Framework_0: Jan 05 13:31:33.668: 00:21:6a:ca:4a:a2 eap_tls.c-AUTH-EVENT: Queueing up fragment for TLS context 69000008
*EAP_Framework_0: Jan 05 13:31:33.668: 00:21:6a:ca:4a:a2 eap_tls.c-AUTH-EVENT: EAP TLS handshake message received
*EAP_Framework_0: Jan 05 13:31:33.672: 00:21:6a:ca:4a:a2 eap_tls.c-AUTH-EVENT: tls_send: 69 byte eap packet sent
*EAP_Framework_0: Jan 05 13:31:33.672: 00:21:6a:ca:4a:a2 eap_tls.c-AUTH-EVENT: SSL Handshake complete. Outcome is Success
*EAP_Framework_0: Jan 05 13:31:33.742: eap_tls.c-AUTH-EVENT: Process Response, type: TLS
*EAP_Framework_0: Jan 05 13:31:33.742: eap_tls.c-AUTH-EVENT: Process Response: auth_complete:1, auth_success:1, eap-tls_FragsInQ: NO
*EAP_Framework_0: Jan 05 13:31:33.742: eap_tls.c-AUTH-EVENT: ACK received, sending Success
*EAP_Framework_0: Jan 05 13:31:33.742: 00:21:6a:ca:4a:a2 eap_tls.c-AUTH-EVENT: Sending free context (EAP handle = 13000008)
*EAP_Framework_0: Jan 05 13:31:33.742: 00:21:6a:ca:4a:a2 eap_tls.c-AUTH-EVENT: EAP TLS cleanup SSL message received
```


## さいごに

### 感想
WLCとRADIUSサーバはデータセンタに同居していることが多いのかな。
これ単体ではあんまり意味なさそうなので、これとFlexConnectのLocalAuthenticationを組み合わせれば、WAN切断時でもAPでTLS認証が継続できそう。
けど、いまのところうまくいってません。うまくいったらまた記載したいしたいと思います。

それはさておき。
はて、CRLはどこで設定するんだろ。。。
証明書のCDPを見に行ってくれてる？
もう少し追加検証が必要なようです。




### 出典
だいたいのことはコンフィギュレーションガイドにのってます。
[Cisco Wireless Controller コンフィギュレーション ガイド、リリース 8.2](https://www.cisco.com/c/ja_jp/td/docs/wireless/controller/8-2/config-guide/b_cg82.html)
[ローカルEAPの章（コンフィギュレーションガイドの中）]
(https://www.cisco.com/c/ja_jp/td/docs/wireless/controller/8-2/config-guide/b_cg82/b_cg82_chapter_0110011.html)




### おまけ

以下コピペでWLC用の証明書と、RootCAから発行するクライアント証明書の発行が可能。

```
mkdir -p /opt/pki/Server/VMwlc01
cd /opt/pki/Server/VMwlc01
openssl req -new -out VMwlc01_csr.pem -newkey rsa:2048 -nodes -keyout VMwlc01_key.pem -subj "/C=JP/ST=Tokyo/O=EXAMPLE/CN=VMwlc01.example.net"
cd /opt/pki/RootCA
openssl ca -config ../configs/openssl_sign.cnf -out ../Server/VMwlc01/VMwlc01_crt.pem -in ../Server/VMwlc01/VMwlc01_csr.pem -cert RootCA_crt.pem -keyfile RootCA_key.pem -passin pass:rootcaprivkeypass -batch -extensions v3_server
cd /opt/pki/Server/VMwlc01
openssl x509 -in VMwlc01_crt.pem -out VMwlc01_crt.pem
openssl pkcs12 -export -out VMwlc01_crt.p12 -in VMwlc01_crt.pem -inkey VMwlc01_key.pem -passout pass:exportpass
openssl pkcs12 -in VMwlc01_crt.p12 -out VMwlc01_crt_final.pem -passin pass:exportpass -passout pass:privkeypass

mkdir -p /opt/pki/Client/Client02
cd /opt/pki/Client/Client02
openssl req -new -out Client02_csr.pem -newkey rsa:2048 -nodes -keyout Client02_key.pem -subj "/C=JP/ST=Tokyo/O=EXAMPLE/CN=Client02.example.net"
cd /opt/pki/RootCA
openssl ca -config ../configs/openssl_sign.cnf -out ../Client/Client02/Client02_crt.pem -in ../Client/Client02/Client02_csr.pem -cert RootCA_crt.pem -keyfile RootCA_key.pem -passin pass:rootcaprivkeypass -batch -extensions v3_client
cd /opt/pki/Client/Client02
openssl x509 -in Client02_crt.pem -out Client02_crt.pem
openssl pkcs12 -export -inkey Client02_key.pem -in Client02_crt.pem -certfile ../../chainCA_crt.pem -out Client02_crt.p12 -passout pass:exportpass

```