経験知ロゴ

KUSANAGIでSSL証明書が更新されなくて無理矢理更新した件

※本ページはプロモーションが含まれています

プライバシーhogo

2016年8月8日。このブログが表示されなくなりました。

このブログはAWS + KUSANAGIでLet’s Encryptを使ってhttpsに対応し運用しています。
関連:「AWS + KUSANAGIのHTTPS環境にブログを移行した手順 | 経験知

Let’s Encryptの有効期限が切れたのが原因です。

Let’s Encryptからは、有効期限が切れるよというメールが届いていたのですが、KUSANAGIでSSLを更新するコマンド、

# kusanagi update cert

を実行するだけで更新されたと勘違いし、証明書の確認をせずに放置していたらこのザマです。

関連:「KUSANAGIコマンド – KUSANAGI

以前他のブログでもLet’s encryptの有効期限切れで表示されなくなったことがあったのですが、
関連:「KUSANAGIでLet’s EncryptのSSL証明が更新されなかった時の対処法 | 経験知

今回の件は、KUSANAGIのバージョンアップと証明書の再取得で解決しませんでした。

8時間以上の格闘の末、なんとか表示できるようになりましたが、薦められる方法での解決ではありませんので、僕個人の備忘録として解決方法を書きます。

KUSANAGI7.8.3での事例です。

なんとなくの原因

Let’s Encrypt SSL証明書の更新を行う

# kusanagi update cert

を使ったりプロファイル(僕はkeikenchiという名前でプロビジョニング時に登録しました)を追加して実行しました。

# kusanagi update cert keikenchi

結果は、

Done.

と表示されますが、更新されていません。

KUSANAGI7.8.2で追加された、プロビジョニング後でもhttpsに変更できる、

# kusanagi ssl

を使ってみました。実行するには、自分のメールアドレスを追加して実行。

# kusanagi ssl –email john@example.com

結果はエラーが出てSSLの取得ができませんでした。

   Domain: www.keikenchi.comkeikenchi.com
   Type:   connection
   Detail: DNS problem: NXDOMAIN looking up A for
   www.keikenchi.comkeikenchi.com

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A record(s) for that domain
   contain(s) the right IP address. Additionally, please check that
   your computer has a publicly routable IP address and that no
   firewalls are preventing the server from communicating with the
   client. If you're using the webroot plugin, you should also verify
   that you are serving files from the webroot path you provided.

どうやら、「www.keikenchi.comkeikenchi.com」というドメインが存在していない(サーバと紐付けられていない)のが原因のようです。

このブログは「keikenchi.com」なので、登録しようとしているドメインが違うので取得できないのです。

「www」ありとなしのURLで申請してくれようとしているようですが、どこかおかしいようです。

無理矢理の解決策

最終的に行き着いた解決策は、Let’s Encryptから証明書を取得するシェルスクリプトを書き換えることです。

KUSANAGIのバージョンアップで使えなくなるし、その他の不具合等あるためオススメできない方法です。

「kusanagi ssl」コマンドが書かれている

# vi /usr/lib/kusanagi/lib/ssl.sh

を開き、ドメインを取得している「local FQDN=$3」を下にコピーし、元の行を「#」でコメントアウトし、自分のドメイン「keikenchi.com」を入れました。

# KUSANAGI SSL setting
# 2016/03/14
#

if [[ -v __KUSANAGI_SSL ]] ; then
    __KUSANAGI_SSL=1
    return
fi

# enable_ssl TARGET john@example.com example.com [renew]
function enable_ssl() {
    local TARGET=$1
    local MAILADDR=$2
#   local FQDN=$3
    local FQDN="keikenchi.com"

これで保存した後、

# kusanagi ssl –email john@example.com

を実行すると、無事SSL証明を取得でき、ブログが表示されました。

「FQDN」に変な値が入っていたようです。

この「FQDN」がどこに保存されているのか、どのように処理されているか調べてみたのですが、僕の力ではよく分かりませんでした。

新しく設定したほうが良い

解決する前にサポートに問い合わせをしたのですが、意外とすぐに返信が来て、詳細な解説と新しく仮想マシンを立ち上げたほうが良いとのアドバイスを貰いました。

僕はKUSANAGI7.8.1から使っているのですが、バージョンアップする度にSSL周りの機能が増え、設定ファイルが変なことになったと思われます。

実際に新しいインスタンスを立ち上げ移行しようとしたのですが、以前はURLにLet’s EncryptのSSL証明を「www」なしで発行していたのが、「www」付きも両方申請しているようです。
www付きも

DNSの設定をしていても、nginxのconfigファイルで「www」付きURLの設定がされていないので、この申請は通りませんでしたが。

その他、インポートするSQLファイルが160MBもありデータベースへ入れることができないなど、個人的な事情が絡み新しく設定するのは断念しましたが、付け焼き刃の対応より、新しくした方が良いと思います。

「www」ありなしのSSL証明を取得する

今回の件で、「www」ありのURLでもアクセスできるように設定できたのでそれもメモ。

www付きのURLでサーバにアクセスできるようDNSを設定した状態で、「プロファイル_http.conf」を開く。

# vi /etc/nginx/conf.d/keikenchi_http.conf
server {

        listen 80;
        server_name www.keikenchi.com;
        return 301      https://keikenchi.com$request_uri;
        }

こんな感じで新しい「server」設定を追加し、「www」付きのURLでアクセスできるようにし、「www」なしのURLへ飛ぶようにする。

通常なら

# kusanagi ssl –email john@example.com

を実行すればこの設定で通るはずだが、僕の場合は、

# vi /usr/lib/kusanagi/lib/ssl.sh

を開き、FQDNに「www」付きURLを追加し「keikenchi.com -d www.keikenchi.com」を入れる。

# KUSANAGI SSL setting
# 2016/03/14
#

if [[ -v __KUSANAGI_SSL ]] ; then
    __KUSANAGI_SSL=1
    return
fi

# enable_ssl TARGET john@example.com example.com [renew]
function enable_ssl() {
    local TARGET=$1
    local MAILADDR=$2
#   local FQDN=$3
    local FQDN="keikenchi.com -d www.keikenchi.com"

この状態で

# kusanagi ssl –email john@example.com

を実行し、「www」ありなしのSSL証明を取得できる。

httpsの「www」ありでもアクセスできるように、「プロファイル_ssl.conf」を編集。

# vi /etc/nginx/conf.d/keikenchi_ssl.conf

下記のように「server」設定を追加。

server {

    listen       443 ssl http2;
    server_name  www.keikenchi.com;


    ssl_certificate      /etc/letsencrypt/live/keikenchi.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/keikenchi.com/privkey.pem;
    return 301      https://keikenchi.com$request_uri;
}

「server_name」に「www」付きのURL。
「ssl_certificate」と「ssl_certificate_key 」を「www」なしの「server」設定からコピペ。
301リダイレクトで「www」なしへ飛ばす。

これで以前からやりたかった「www」付きのURLでアクセスできるようになった。以前は「www」付きのURLでアクセスすると「この接続ではプライバシーが保護されません」と表示されてアクセスできなかったので、地味だが大事な進歩。

おわりに

現在AWSの無料枠で運用していますが、転送量で月に5ドル前後かかっているので無料期間が終わったら他のサーバへ引っ越す予定ですので、それまでは騙し騙しやっていくつもりです。

ブログが表示されなかった時間は14時間にもなり、その日のアクセス数はガタ落ちでしたorz

メッチャ苦労しましたが、「www」付きのアクセスができるようになったことは収穫だったのでとりあえずOKです。

役に立ったらこの記事のシェアをお願いします

ブログのフォロー・RSS購読は下記ボタンから