質問の概要
3日前の3/22に、EC2上にNode.jsのExpressで作ったサーバが、突然SSL証明書の有効期限切れ(ERR_CERT_DATE_INVALID)で表示出来なくなりました。
SSL証明書自体は更新を自動化していたので、正しく更新されているようでした。
そこでforever stopでサーバを一度停止し、forever startで再度起動したところ、正常に動きました。
そのため、server.jsのスクリプトの中で読み込んでいるpemファイルが、更新された後も反映されずに、古いもののままサーバが動き続けていたのが原因ではないかと思っているのですが、これは正しいでしょうか?
またその場合、30日毎にSSL証明書が更新されるたびサーバをforeverコマンドで再起動しなければいけない気がするのですが、その手間を省略する方法はあるのでしょうか?
(補足)詳細な状況
SSL証明書は、Cerbotを用いたLet's Encryptを使っており、AWSの公式ドキュメントにある方法で更新を自動化していました。
Certificate Automation: Amazon Linux 2 での Let's Encrypt と Certbot の使用
そのため、opensslのコマンドでSSL証明書の有効期限を確認すると、有効期限は2021年の6/19になっており、たしかに更新されているようでした。
sudo openssl x509 -in /(パス省略)/fullchain.pem -noout -dates notBefore=Mar 21 20:53:47 2021 GMT notAfter=Jun 19 20:53:47 2021 GMT
しかし、ブラウザでサーバにアクセスしても上述のエラーで表示出来ず、Chrome dev toolのSecurityタブなどからSSL証明書の有効期限を見ると、3/22が期限のままになっていました。
以下のforeverコマンドでサーバを再起動したところ、最新のSSL証明書が使用されるようになり、表示出来るようになりました。
forever stop 0 forever start server.js
server.jsのファイルの中では、Let's Encryptのpemファイルを読み込んでおり、foreverコマンドでデーモン化し永続実行していたため、pemファイルが更新されても反映されなかったのではないかと思っています。
Node
1var options = { 2 key: fs.readFileSync("/etc/letsencrypt/live/xxxx.net/privkey.pem"), 3 cert: fs.readFileSync("/etc/letsencrypt/live/xxxx.net/fullchain.pem"), 4}; 5var server = https.createServer(options, app); 6 7app.use(timeout(120000)); 8server.listen(process.env.PORT || 3000, function () { 9 console.log("Listening on port 3000"); 10});
この現象の原因は上述の推測で正しそうか、またその場合、毎回pemファイルが更新されるたびにサーバを再起動する手間を省く方法があるのか、教えて頂ければ幸いです。
回答1件
あなたの回答
tips
プレビュー