PowerVC 自己署名証明書 更新方法の確認

#### はじめに

PowerVC の自己証明書の置き換えを確認した参考ログです。
<br>

2024/6に初版を書きましたが、その後判明したことなどを含めて2024/9時点で再編集しています。


https://www.ibm.com/docs/ja/powervc-cloud/2.2.0?topic=security-replacing-certificate-powervc-access

---

#### 環境


PowerVC 2.2.0 (RHEL 8.6 ppc64le)

```
# cat /opt/ibm/powervc/version.properties
[2.2.0 Install]
name = IBM PowerVC
version = 2.2.0
build = 20231102-0930
oem = no
install-date = 2024-04-09
cloud_enabled = yes
cluster = pvc220
install_method = cluster
```

---

#### 確認


現在の証明書の内容を確認します。

```
# openssl x509 -text -noout -in /etc/pki/tls/certs/powervc.crt
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = 172.16.xxx.xxb
        Validity
            Not Before: Apr  9 07:58:18 2024 GMT
            Not After : Jan 28 07:58:18 2027 GMT
        Subject: CN = 172.16.xxx.xxb
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:c5:f6:xxx 省略 xxxxxx4a:59:7c:07:
                    xx:xx
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Alternative Name:
                DNS:pvc-test, DNS:pvc-test, DNS:pvc-test, IP Address:172.16.xxx.xxa, IP Address:172.16.xxx.xxb
    Signature Algorithm: sha256WithRSAEncryption
         4c:41:a2:b3:c3:f7:09:50:23xxxx 省略 xxxxxx
         xx:xx
```

・Issuerに Common Name "CN = 172.16.xxx.xxb"  (PowerVC Virtual IP のアドレス) が入っています。
・RSA Public-Key: (2048 bit) です。
・Serial Number は 1 です。
・X509v3 extensionsに Signature Algorithm: sha256WithRSAEncryption　が使用されています。


---

#### 証明書のバックアップを取得

```
# mkdir /work/pki_backup
# cp -p /etc/pki/tls/certs/powervc.crt /work/pki_backup/
# cp -p /etc/pki/tls/private/powervc.key /work/pki_backup/

# ls -l /work/pki_backup/	
total 8
-r--r--r-- 1 root pvcservices 1094 Apr  9 03:58 powervc.crt
-r--r----- 1 root pvcservices 1704 Apr  9 03:58 powervc.key
```

powervc.crt はパーミッションは 444 です。
powervc.crt は rootユーザー、pvcservices グループ権限です。

---

#### 証明書を作成


```

# mkdir /work/pki_new/
# cd /work/pki_new

# openssl genrsa -out powervc.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
..........................................................+++++
.....................................................+++++
e is 65537 (0x010001)

# echo $?
0


# ls -l
-rw------- 1 root root 1679 Jun 13 07:21 powervc.key
```


・"/etc/pki/tls/openssl.cnf" ファイルをコピーして編集し、構成ファイルに指定します。


```
cp -p /etc/pki/tls/openssl.cnf /work/pki_new/openssl.cnf
```

・openssl.conf 修正

```
# vi /work/pki_new/openssl.cnf
```

[ v3_ca ] セクションの
　252行目(subjectKeyIdentifier=hash)、
　254 行目(authorityKeyIdentifier=keyid:always,issuer)、
 　256行目 (basicConstraints = critical,CA:true) をコメントアウトします。


<br>

・変更点の確認

```
# diff /etc/pki/tls/openssl.cnf  /work/pki_new/openssl.cnf 

252c252
< #subjectKeyIdentifier=hash
---
> subjectKeyIdentifier=hash
254c254
< #authorityKeyIdentifier=keyid:always,issuer
---
> authorityKeyIdentifier=keyid:always,issuer
256c256
< #basicConstraints = critical,CA:true
---
> basicConstraints = critical,CA:true
```

<br>
<br>

・powervc.crt 作成
(コマンド・オプションを以前の記載から変更しています)

```
# openssl req -new -x509 -key ./powervc.key -sha256 -out powervc.crt -days 2190 -subj
"/CN=<PowerVC VIP>" -addext  "subjectAltName = DNS:<hostname>, DNS:<hostname>, 
DNS:<hostname>, IP:<PowerVCサーバーのIPアドレス>, IP:<PowerVC Virtual IPアドレス>" 
-set_serial 1 -config ./openssl.cnf -utf8
```

---

#### 確認

生成した powervc.crt を確認します。


```
#  openssl x509 -text -noout -in ./powervc.crt
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = xx.xx.xxx.xxx
        Validity
            Not Before: Sep  2 23:56:21 2024 GMT
            Not After : Sep  1 23:56:21 2030 GMT
        Subject: CN = xx.xx.xxx.xxx
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:ba:e9b### 省略 ####e0:4d
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Alternative Name:
                DNS:<hostname>, DNS:<hostname>, DNS:<hostname>, IP Address:<PowerVC サーバーIP>, IP Address:<PowerVC VIP>
    Signature Algorithm: sha256WithRSAEncryption
         91:64:b　### 省略 ####         be:f3:d3:25

```

(以前との違い)
X509v3 extensionsは openssl.cnf を指定したことにより、Subject Alternative Nameのみの出力となりました。

---

#### 新しい証明書に置き換え

置き換えてみます。


```
# cp ./powervc.crt /etc/pki/tls/certs/
cp: overwrite '/etc/pki/tls/certs/powervc.crt'? y

# cp ./powervc.key /etc/pki/tls/private/
cp: overwrite '/etc/pki/tls/private/powervc.key'? y
```

コピーコマンドでは -p オプションを使いがちですが、ここではあえて使用しないことで元のパーミッションを踏襲しています。

---

#### PowerVC 再起動

(コマンドのみ。ログは省略)

停止

```
# powervc-services stop
```

確認

```
# powervc-services status
```

起動

```
# powervc-services start 
```

確認

```
# powervc-services status
```
---

#### おわりに


この方法でPowerVCの正常起動は確認できました。
openstack コマンドを打つことや、VMデプロイを確認できています。

<br>



なお、CA証明書を使用する場合は、次に詳細な設定方法の記載があります。

[Securing PowerVC web interface with self-signed or CA signed certificates. ](https://community.ibm.com/community/user/power/blogs/archana-prabhakar1/2018/10/16/securing-powervc-web-interface-with-self-signed-or-ca-signed-certificates)


正しく方法はサポートに手順確認が望ましいと思います。


---

#### 補足1

Webブラウザ側で証明書変更に対応する処理が必要になる場合があります。
以下ご参考。

https://support.mozilla.org/ja/kb/Certificate-contains-the-same-serial-number-as-another-certificate?redirectslug=%E4%BB%96%E3%81%A8%E5%90%8C%E3%81%98%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E7%95%AA%E5%8F%B7%E3%82%92%E3%82%82%E3%81%A4%E3%82%B5%E3%83%BC%E3%83%90%E8%A8%BC%E6%98%8E%E6%9B%B8&redirectlocale=ja



#### 補足2

・powervc.crt の作成は以下のpythonスクリプトで実行されており、PowerVC 内のAnsibleのライブラリとして使用されているようでした。

```
/opt/ibm/powervc-opsmgr/ansible/core/library/pvc_certs_gen.py
```

上記スクリプトを呼んでいる Ansible playbook 

```
/opt/ibm/powervc-opsmgr/ansible/core/roles/pvc_utils/tasks/create_powervc_certs.yml
```

スクリプトの内容は記載を省略します。実機でご確認ください。

---


・また、PowerVC 内の rabbitmq や zookeeperサービス openssl は以下のような内容がひっかりました。
p825日指定のようです。

```
# grep -r openssl /opt/ibm/powervc-opsmgr/ansible/core/roles/* | grep new
/opt/ibm/powervc-opsmgr/ansible/core/roles/pvc_rabbitmq/tasks/client_certificates.yml:        /usr/bin/openssl req -new -key "{{ client_private_key_dir }}{{ client_private_key }}"
/opt/ibm/powervc-opsmgr/ansible/core/roles/pvc_rabbitmq/tasks/pvc_rabbitmq_generate_ca_certificate.yml:    /usr/bin/openssl req -new -x509 -days 825 -key "{{ pvc_rabbitmq_ca_private_key_dir }}{{ pvc_rabbitmq_ca_private_key }}"
/opt/ibm/powervc-opsmgr/ansible/core/roles/pvc_rabbitmq/tasks/pvc_rabbitmq_generate_server_certificate.yml:    /usr/bin/openssl req -new -key "{{ pvc_rabbitmq_server_private_key_dir }}{{ pvc_rabbitmq_server_private_key }}"
/opt/ibm/powervc-opsmgr/ansible/core/roles/pvc_zookeeper/tasks/ca_certs.yml:    /usr/bin/openssl req -new -x509 -days 825 -key "{{ pvc_zookeeper_ca_private_key_dir }}//cakey.pem"
/opt/ibm/powervc-opsmgr/ansible/core/roles/pvc_zookeeper/tasks/client_certs.yml:    /usr/bin/openssl req -new -key "{{ pvc_zookeeper_base_private_key_dir }}/key.pem"
/opt/ibm/powervc-opsmgr/ansible/core/roles/pvc_zookeeper/tasks/pvc_zookeeper_generate_ca_certificate.yml:    /usr/bin/openssl req -new -x509 -days 825 -key "{{ pvc_zookeeper_ca_private_key_dir }}{{ pvc_zookeeper_ca_private_key }}"
/opt/ibm/powervc-opsmgr/ansible/core/roles/pvc_zookeeper/tasks/pvc_zookeeper_generate_client_certificate.yml:    /usr/bin/openssl req -new -key "{{ pvc_zookeeper_base_private_key }}"
/opt/ibm/powervc-opsmgr/ansible/core/roles/pvc_zookeeper/tasks/pvc_zookeeper_generate_server_certificate.yml:    /usr/bin/openssl req -new -key "{{ pvc_zookeeper_server_private_key_dir }}{{ pvc_zookeeper_server_private_key }}"
/opt/ibm/powervc-opsmgr/ansible/core/roles/pvc_zookeeper/tasks/server_certs.yml:    /usr/bin/openssl req -new -key "{{ pvc_zookeeper_server_private_key_dir }}/key.pem"
```




以上です。