Linux

【puppet】ca証明書の有効期間が過ぎてしまったので対応しました

ある日突然、puppetの動作が止まってしまいました
puppetエージェントのログをmessagesで確認したところ、「Could not retrieve catalog from remote server: stack level too deep」というエラーが30分おきに表示されている状態

調べてみるとこれはcaの証明書有効期限が切れていることで発生していました

puppetサーバのバージョンは2.6.18
puppetのバージョンも2.6.18
OSのバージョンはRedhat Enterprise Linux 6

caの証明書有効期限が切れていることは分かったのですが、それからが長かった
日本語の情報はかなり少なく、最終的に解決するまでに6時間くらいかかってしまいました
わたしと同じように無駄な時間を使わないようにブログにまとまめます

よく分からないのでクライアント証明書を作り直してみた(現象変わらず)

puppetサーバでクライアント証明書ファイルの削除

# puppetca --clean puppetクライアント名

puppetクライアントの証明書ファイル削除

# rm -rf /var/lib/puppet/ssl
# service puppet restart

puppetサーバで再認証

# puppetca --list
# puppetca --sign puppetクライアント名

しかし全く現象は変わりませんでした

「Could not retrieve catalog from remote server: stack level too deep」エラー

このエラーメッセージでGoogle検索してトップにでてきた記事がこちら▼

http://chris.collins.is/2014/06/27/puppet-error-could-not-request-certificate-stack-level-too-deep/

読んでみるとどうもca証明書の有効期限が切れているっぽい
早速しらべてみる

openssl x509 -text -noout -in /var/lib/puppet/ssl/ca/ca_crt.pem
Certificate:
     Data:
         Version: 3 (0x2)
         Serial Number: 1 (0x1)
         Signature Algorithm: sha1WithRSAEncryption
         Issuer: CN=Puppet CA: fqdn
         Validity
             Not Before: May 20 07:15:56 2013 GMT
             Not After : May 20 07:15:56 2018 GMT
     Subject: CN=Puppet CA: fqdn
     Subject Public Key Info:
         Public Key Algorithm: rsaEncryption

今日は2018年5月22日、やっぱり有効期限が切れてる

ca証明書の更新

次に必要な作業がca証明書の更新ということがわかった

参考にしたサイトがこちら▼

https://blog.flyingcircus.io/2017/09/01/how-to-renew-puppet-ca-and-server-certificates-in-place/

作業を始める前にファイルのバックアップを取っておく

cd /var/lib/puppet
tar cvfz /var/tmp/sslbackup.tgz ssl

証明書を作成するためにはcsrが必要なのだが、csrがないので今あるファイルから作る必要がある

cd /var/lib/puppet/ssl/ca
openssl x509 -x509toreq -in ca_crt.pem -signkey ca_key.pem \
 -out ca_csr.pem
cat > extension.cnf <<_EOT_
[CA_extensions]
basicConstraints = critical,CA:TRUE
nsComment = "Puppet Ruby/OpenSSL Internal Certificate"
keyUsage = critical,keyCertSign,cRLSign
subjectKeyIdentifier = hash
_EOT_
openssl x509 -req -days 3650 -in ca_csr.pem -signkey ca_key.pem \
 -out ca_crt.pem -extfile extension.cnf -extensions CA_extensions

puppetmaster再起動

service puppetmaster restart

puppetクライアントに新しく作成したca.pemの中身をコピーしました
そしてpuppet再起動すると次のエラーが表示されました

「Could not retrieve catalog from remote server: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed」エラーが発生

原因はサーバー証明書をあたらしいcaで作成していないこと

ca証明書の更新と同じ様な手順でサーバ証明書を作成します

cd /var/lib/puppet/ssl
openssl x509 -x509toreq -in ca/ca_crt.pem -signkey private_keys/fqdn.pem \
 -out certificate_requests/fqdn_csr.pem
openssl x509 -req -days 3650 -in certificate_requests/fqdn_csr.pem -CA ca/ca_crt.pem \
 -CAkey ca/ca_key.pem -CAserial ca/serial -out certs/fqdn.pem

puppetmaster再起動

service puppetmaster restart

次のエラーが表示されました

「Could not retrieve catalog from remote server: hostname was not match with the server certificate」エラーが発生

このエラーにはまいりました
エラー内容を読んでも何を言ってるのかわからないし、Googleで検索してもたくさん表示されますがこれぞというものが見つかりません

この時点でも以下の作業をおこないました

よく分からないのでクライアント証明書を作り直してみた(現象変わらず)

puppetサーバでクライアント証明書ファイルの削除

# puppetca --clean puppetクライアント名

puppetクライアントの証明書ファイル削除

# rm -rf /var/lib/puppet/ssl
# service puppet restart

puppetサーバで再認証

# puppetca --list
# puppetca --sign puppetクライアント名

処理は正常に終わるものの、全く現象は変わりませんでした

参考にしたのは以下のサイト▼

https://serverfault.com/questions/320028/how-to-add-multiple-dns-names-to-my-puppetmaster

/etc/puppet/puppet.confの[master]セクションに以下を追加

certname = puppetサーバのfqdn名
certdnsnames = puppet:puppetサーバのfqdn名

puppetmaster再起動

service puppetmaster restart

エラーはなくなり正常動作するようになりましたが全サーバで再認証が必要になってしまいました

さいごに

puppetcaコマンドでwarningが表示されるようになりました

warning: The `certdnsnames` setting is no longer functional,
after CVE-2011-3872. We ignore the value completely.

For your own certificate request you can set `dns_alt_names` in the
configuration and it will apply locally. There is no configuration option to
set DNS alt names, or any other `subjectAltName` value, for another nodes
certificate.

Alternately you can use the `–dns_alt_names` command line option to set the
labels added while generating your own CSR.