はじめに
PowerVC の自己証明書の置き換えを確認した参考ログです。
2024/6に初版を書きましたが、その後判明したことなどを含めて2024/9時点で再編集しています。
環境
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) をコメントアウトします。
・変更点の確認
# 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
・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デプロイを確認できています。
なお、CA証明書を使用する場合は、次に詳細な設定方法の記載があります。
Securing PowerVC web interface with self-signed or CA signed certificates.
正しく方法はサポートに手順確認が望ましいと思います。
補足1
Webブラウザ側で証明書変更に対応する処理が必要になる場合があります。
以下ご参考。
補足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"
以上です。