OpsManagerからBOSHを作る際のNSX-TのAPI証明書を直す方法

タイトルがやたらと長いですが、Tanzu Application Service(旧PCF）の前提となるBOSHをインストールする際に、NSX-Tの証明書を直す方法

# 実際のエラー

どこでおきたエラーかというと

https://docs.pivotal.io/platform/ops-manager/2-9/vsphere/config.html

の以下の箇所

> NSX CA Cert: A CA certificate in PEM format that establishes a secure connection to the NSX server before the BOSH Director authenticates to the NSX Manager. If the NSX Manager generated a self-signed certificate, use the following command to retrieve the CA certificate using OpenSSL:

といわれた通りOpenSSLコマンドで証明書をゲットしても

```
openssl s_client -showcerts -connect NSX-MANAGER-ADDRESS:443 < /dev/null 2> /dev/null | openssl x509
```

以下のエラーが表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/09a260ab-618b-c80a-e812-8a6440e288e8.png)

でなぜ、エラーになっているかというと、みると証明書に登録されているIP AddressやSAN(Subject Alternative Name)が`nsx01`となっていて私のNSXのIPアドレスではなかったこと。

どうして`nsx01`になったかはすっかり忘れましたが、多分インストールの際に間違って登録したのだと思います。

さて、こまった、直したい。色々サイトをみたがはっきりした直し方がなかったので、動いた方法を記載します。



# 注意

この手順はLab向けの手順でかつ正式な手順ではございません。APIの証明書を変えるので、APIを利用しているもの影響を及ぼす可能性がございます。
自己責任でお願いします。

# 環境

OpsManager 2.9
NSX-T 3.0

# 直し方

まず、Linuxマシンを用意して以下のファイルを作成します。

```
$ vi nsx-cert.cnf
```

```
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
prompt = no
[ req_distinguished_name ]
countryName = US
stateOrProvinceName = California
localityName = CA
organizationName = NSX
commonName = 10.197.35.14
[ req_ext ]
subjectAltName = @alt_names
[alt_names]
DNS.1 = IP-ADDRESS
```

`commonName`のところを正しいIPアドレスに書き換えてください。あとはそのままにしてください。Californiaじゃないし、USでもないのですが、今回は自己証明書なのでこのままにします。

次に環境変数をExportします。IPアドレスは実際の環境に書き換えてください。

```
% export NSX_MANAGER_IP_ADDRESS=10.197.35.14
% export NSX_MANAGER_COMMONNAME=10.197.35.14
```

ここから証明書を生成します。

```
openssl req -newkey rsa:2048 -x509 -nodes -keyout nsx.key -new -out nsx.crt -subj /CN=$NSX_MANAGER_COMMONNAME  -reqexts SAN -extensions SAN -config <(cat ./nsx-cert.cnf  <(printf "[SAN]\nsubjectAltName=DNS:$NSX_MANAGER_COMMONNAME,IP:$NSX_MANAGER_IP_ADDRESS")) -sha256 -days 365
```

nsx.keyとnsx.crtが作成されるので後の手順のため保管します。

つぎにNSX-Tにログインします。

System > Certificate > Import > Import Certificate
<img width="643" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/3afd2c4f-f775-4bd2-932e-a889b574aaab.png">

* Name : 適当な重複しない名前
* Certificate Contents：　nsx.keyの内容をコピーペースト
* Private Key : nsx.crtの内容をコピーペースト
* Service Certificate : **NO**  にすること

作成後、新しい証明書にIDをハイライトさせ、それも保管します。

<img width="968" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/8bba3e34-7d19-d162-933e-3e26fb784ada.png">

再びLinuxにもどり

```
export NSX_MANAGER_IP_ADDRESS=10.197.35.14
export CERTIFICATE_ID=607e9b9a-1907-4248-8a0a-b85aa336d6ac
```
Manager IPとCertificate IDは実際の環境のに合わせてください。
そして、以下のコマンドで証明書の差し替えが発生します。念のため申し上げますが、この段階で古い証明書をつかっている通信はきれますので、Lab以外では推奨しないです。


```
curl --insecure -u admin:'PASS' -X POST https://$NSX_MANAGER_IP_ADDRESS/api/v1/cluster/api-certificate?action=set_cluster_certificate&certificate_id=$CERTIFICATE_ID

curl --insecure -u admin:'PASS' -X POST https://$NSX_MANAGER_IP_ADDRESS/api/v1/node/services/http?action=apply_certificate&certificate_id=$CERTIFICATE_ID
```

`PASS`は環境にあわせてかえてください。

さて、このタイミングでもしNSXのブラウザがあがっていたら、挙動がおかしくなると思います。
その場合、ブラウザを再起動して、NSXに再接続してください。
証明書を確認すると新しく登録したIPアドレスになっているはずです。

<img width="1291" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/8d5987d8-0d95-feda-cd60-30dbfda9323e.png">

NSX-T側は完了です。
OpsManagerには`nsx.crt`の内容でもう一度接続をこころみてください。これでなおるはずです。