ある日突然、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.