Let's Encrypt + nginx | 瀬戸内の雲のように

Let's Encrypt + nginx のWEBアプリをFacebookDeveloperに登録しようとした件

Posted: 2018-05-28


スポンサーリンク

目次

背景

最近ブログにSNSシェアボタンを設置したのですが、その時にFacebookDeveloperにアプリとして登録を行いました。

アプリ登録自体はすぐにできたのですが、公開する時に少しうまくいかなかったことがあり、結果としてSSLの設定に問題があることがわかったので原因と対処法をメモしておきたいと思います。

 

うまくいかなかったこと

FacebookDeveloperのアプリを「公開」ステータスに変更する時に、プライバシーポリシーのURLを設定する必要があるのですが、設定しようとすると

Facebookプラットフォームに準拠するものにするには、有効なプライバシーポリシーURLを入力してください。リクエストエラー: SSL Error: Can't validate SSL Certificate. Either it is self-signed (which will cause browser warnings) or it is invalid.

というエラーが出てしまいました。(画像参照)
/uploads/picture/image/72/size_300x400_ssl_0.png

私はLet's Encryptの証明書を使ってはいますが、オレオレ証明書(self-signed)ではない正当な証明書なはずなので、何が悪いのか?と思いググってみました。

結果として、SSLの証明書自体ではなく、httpsの設定が良くないことがわかりました。

 

問題点

SSLの設定が正しいかを調査してくれるWebページがあり、ここでのスコアがA以上でないとFacebookには登録できないという情報を見つけました。

実際に自分のWebアプリを調査してみると、Bという判定が出ており、いろいろな問題点があることがわかりました。
/uploads/picture/image/73/size_300x400_ssl_1.png

  
この結果を読むと、まずい点は3点あり、それぞれ修正しました。
(まずい点↓)
/uploads/picture/image/74/size_300x400_ssl_2.png

 

修正点1. This server supports weak Diffie-Hellman(DH) key exchange parameters.

これは、Logjamという脆弱性に対しての対策がされていないこと を表すエラーメッセージでした。
以下の手順で修正しました。nginx.confの修正です。

# ↓ご自身の環境によってファイルは変わります
vim /etc/nginx/nginx.conf

以下のように修正します。

http {
    ~~~ 中略 ~~
    server {
            listen  443 ssl;
            server_name  www.setouchino.cloud;

            ssl_certificate             /etc/letsencrypt/live/www.setouchino.cloud/cert.pem;
            ssl_certificate_key         /etc/letsencrypt/live/www.setouchino.cloud/privkey.pem;

            ### 追記ここから↓ ###
            ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
            ssl_dhparam /etc/nginx/dhparams.pem;
            ### 追記ここまで↑ ###

}

そして、以下コマンドを実行します

openssl dhparam -out /etc/nginx/dhparams.pem 2048

ここまでできたら、nginxを再起動します。

systemctl restart nginx.service

これで一つ目の対処は完了です。

 

修正点2. This server does not support Forward Secrecy with the reference browsers.

よくわからないですが、このへんのページを見ることで解決できました。

# ↓ご自身の環境によってファイルは変わります
vim /etc/nginx/nginx.conf

以下のように修正します。

http {
    ~~~ 中略 ~~
    server {
            listen  443 ssl;
            server_name  www.setouchino.cloud;

            ssl_certificate             /etc/letsencrypt/live/www.setouchino.cloud/cert.pem;
            ssl_certificate_key         /etc/letsencrypt/live/www.setouchino.cloud/privkey.pem;


            ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
            ssl_dhparam /etc/nginx/dhparams.pem;

            ### 追記ここから↓ ###
            ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
            ssl_prefer_server_ciphers on;
            ### 追記ここまで↑ ###
}

そしてnginxを再起動します。

systemctl restart nginx.service

これで2つ目の対処は完了です。

 

修正点3. This server's certificate chain is incomplete.

これはどちらかというと設定ミスの類なのですが、SSLの証明書を間違って指定していました。

# ↓しつこいですが、ご自身の環境によってファイルは変わります
vim /etc/nginx/nginx.conf

以下の部分が間違ってました。

http {
    ~~~ 中略 ~~
    server {
            listen  443 ssl;
            server_name  www.setouchino.cloud;

            # ↓★★間違い
            ssl_certificate             /etc/letsencrypt/live/www.setouchino.cloud/cert.pem; 
            ssl_certificate_key         /etc/letsencrypt/live/www.setouchino.cloud/privkey.pem;
}

 
正しくは、以下の通りです。

http {
    ~~~ 中略 ~~
    server {
            listen  443 ssl;
            server_name  www.setouchino.cloud;

            # ↓★★正しい
            ssl_certificate             /etc/letsencrypt/live/www.setouchino.cloud/fullchain.pem; 
            ssl_certificate_key         /etc/letsencrypt/live/www.setouchino.cloud/privkey.pem;
}

fullchain.pemと言うのは証明書と中間証明書を連結したファイルで、これを設定するのが正しいようでした。

 

修正した結果

無事A判定となり、Facebookのアプリも無事公開にすることができました。
/uploads/picture/image/75/size_300x400_ssl_3.png

 
SSLのことは正直あまりわかっていなかったので、良い勉強になりました。IT技術は奥が深いですね。。

参考ページ

https://easyengine.io/tutorials/nginx/diffie-hellman-logjam-attack-fix/
【解決】Facebookのシェアでエラーが出てたと思ったらSSLの不具合だった話
nginx の SSL設定をしくって Facebook アプリ登録でエラーとなった件
ApacheとNginxでのForward Secrecy設定方法


スポンサーリンク




コメント一覧


コメントを投稿する


お名前


コメント内容





TOP back