RHEL / CentOS7 / 6でNginxのSSL証明書を暗号化してHTTPSを設定する


SSL/TLSモジュールを備えたApacheまたはNginxWebサーバーに関する以前のLet'sEncryptシリーズに続いて、この記事では、使用するLet'sEncrypt認証局から無料で取得したSSL/TLS証明書を生成してインストールする方法について説明します。 CentOS/RHEL7/6およびFedoraディストリビューションでNginxWebサーバーのHTTPトランザクションを保護します。

Let’s Encrypt forApacheをRHEL/CentOS 7/6およびFedoraディストリビューションにインストールする場合は、以下のガイドに従ってください。

  1. A registered domain name with valid A DNS records to point back to server public IP Address.
  2. Nginx web server installed with SSL enabled and Virtual Hosts enabled (only for multiple domains or subdomains hosting).

ステップ1:NginxWebサーバーをインストールする

1.最初のステップで、Nginxデーモンがまだインストールされていない場合は、EpelリポジトリからNginxウェブサーバーをインストールするために、root権限で以下のコマンドを発行します。

# yum install epel-release
# yum install nginx

ステップ2:SSL証明書を無料でダウンロードまたはクローン化しましょう

2. githubリポジトリからパッケージのクローンを作成することにより、LinuxシステムにLet’sEncryptクライアントをインストールする最速の方法。

まず、以下のコマンドを使用して、システムにgitclientをインストールします。

# yum install git

3. gitクライアントがインストールされたら、ディレクトリを/opt パスに変更し、以下のコマンドを実行してLet’sEncryptソフトウェアをプルします。

# cd /opt
# git clone https://github.com/letsencrypt/letsencrypt

ステップ3:Nginx用の無料のLet's EncryptSSL証明書を生成する

4.Nginxの無料のSSL/TLS証明書を取得するプロセスは、Let’s EncryptStandaloneプラグインを使用して手動で実行されます。

この方法では、Let’s EncryptクライアントがサーバーのIDを検証し、証明書を生成する間、ポート80が空いている必要があります。

したがって、Nginxがすでに実行されている場合は、次のコマンドでデーモンを停止し、 ss ユーティリティを実行して、ポート80がネットワークスタックで使用されていないことを確認します。

# service nginx stop
# systemctl stop nginx
# ss -tln

5.次に、Let’sEncryptから無料のSSL証明書を取得します。 Let's Encryptのインストールディレクトリにまだ移動していない場合は移動し、certonly -standalone オプションと -d <を指定して letsencrypt-auto コマンドを実行します。以下の例で提案されているように、証明書を生成する各ドメインまたはサブドメインの/ code>フラグ。

# cd /opt
# ./letsencrypt-auto certonly --standalone -d your_domain.tld -d www.yourdomain.tld

6.一連のパッケージと依存関係がマシンにインストールされた後、Let’s Encryptは、紛失したキーの回復または緊急の通知に使用されるアカウントの入力を求めるプロンプトを表示します。

7.次に、Enterキーを押してライセンス条項に同意する必要があります。

8.最後に、すべてが正常に行われた場合、おめでとう情報メッセージがbashターミナルに表示されます。メッセージは、証明書の有効期限が切れるときにも表示されます。

ステップ4:Let's EncryptSSL証明書をNginxにインストールする

9.無料のSSL/TLS証明書を所有しているので、ドメインで使用できるように、NginxWebサーバーにインストールします。

すべての新しいSSL証明書は、ドメイン名にちなんで名付けられたディレクトリの下の/etc/testsencrypt/live/に配置されます。 lsコマンドを使用して、ドメインに対して発行された証明書ファイルを一覧表示し、それらを識別します。

# sudo ls /etc/letsencrypt/live/
# sudo ls -al /etc/letsencrypt/live/your_domain.tld

10. Nginxに証明書ファイルをインストールしてSSLを有効にするには、編集用に /etc/nginx/nginx.conf ファイルを開き、サーバーブロックからの最後のリッスン行の後に以下のステートメントを追加します。下の図をガイドとして使用してください。

# vi /etc/nginx/nginx.conf

Nginx SSLブロックの抜粋:

# SSL configuration
listen 443 ssl default_server;
ssl_certificate /etc/letsencrypt/live/your_domain.tld/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain.tld/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

SSL証明書のドメイン名文字列を、自分のドメインと一致するように置き換えます。

11.最後に、Nginxサービスを再起動し、 https:// yourdomain でHTTPSプロトコルを介してドメインにアクセスします。ページは、証明書エラーなしでスムーズに読み込まれるはずです。

# systemctl restart nginx
# service nginx restart

12. SSL/TLS証明書とその真正性を確認するには、次のリンクにアクセスしてください。

https://www.ssllabs.com/ssltest/analyze.html 

13.サーバーが弱いDHキー交換とBグレードの全体的な評価をサポートしているという通知を受け取った場合は、/ etc/nginx/ssl /ディレクトリに新しいDiffie-Hellman暗号を生成して、サーバーをLogjam攻撃から保護します。次のコマンドを実行します。

# mkdir /etc/nginx/ssl
# cd /etc/nginx/ssl
# openssl dhparam -out dhparams.pem 4096

この例では、4096ビットのキーを使用しました。これは実際には生成に長い時間がかかり、サーバーとSSLハンドシェイクに余分なオーバーヘッドがかかります。

これほど長くキーを使用する必要がなく、偏執的にならない場合は、2048ビットのキーで安全を確保する必要があります。

14. DHキーが生成されたら、Nginx構成ファイルを開き、 ssl_ciphers 行の後に以下のステートメントを追加して、DHキーを追加し、ドメインのセキュリティレベルを A + <に上げます。/code>グレード。

# vi /etc/nginx/nginx.conf

次のブロックの抜粋をNginx.confに追加します。

ssl_dhparam /etc/nginx/ssl/dhparams.pem;
ssl_session_timeout 30m;
ssl_session_cache shared:SSL:10m;
ssl_buffer_size 8k;
add_header Strict-Transport-Security max-age=31536000;

15. Nginxサービスを再起動して変更を適用し、上記のリンクから以前の結果キャッシュをクリアしてSSL証明書を再テストします。

# systemctl restart nginx
# service nginx restart

ステップ5:NginxFreeの自動更新でSSL証明書を暗号化できる

16. Let's Encrypt CAは、90日間有効な無料のSSL/TLS証明書をリリースします。以下のコマンドを発行することにより、Webサーバーを停止することなく、webrootプラグインを使用して、有効期限が切れる前に証明書を手動で更新および適用できます。

# ./letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=/usr/share/nginx/html/ -d yourdomain.tld -d www.yourdomain.tld
# systemctl reload nginx

上記のコマンドを実行するときは、 webroot-path を、Nginxrootステートメントで指定されたWebサーバーのドキュメントルートと一致するように置き換えてください。

17.有効期限が切れる前に証明書を自動更新するには、/ usr/local/bin /ディレクトリのgithuberikaheidiからこのbashスクリプトを作成し、以下のコンテンツを追加します(スクリプトはNginx設定を反映するように少し変更されています)。

# vi /usr/local/bin/cert-renew

cert-renew ファイルに次の行を追加します。

#!/bin/bash

webpath='/usr/share/nginx/html/'
domain=$1
le_path='/opt/letsencrypt'
le_conf='/etc/letsencrypt'
exp_limit=30;

get_domain_list(){
        certdomain=$1
        config_file="$le_conf/renewal/$certdomain.conf"

        if [ ! -f $config_file ] ; then
                echo "[ERROR] The config file for the certificate $certdomain was not found."
                exit 1;
        fi

        domains=$(grep --only-matching --perl-regex "(?<=domains \= ).*" "${config_file}")
        last_char=$(echo "${domains}" | awk '{print substr($0,length,1)}')

        if [ "${last_char}" = "," ]; then
                domains=$(echo "${domains}" |awk '{print substr($0, 1, length-1)}')
        fi

        echo $domains;
}

if [ -z "$domain" ] ; then
        echo "[ERROR] you must provide the domain name for the certificate renewal."
        exit 1;
fi

cert_file="/etc/letsencrypt/live/$domain/fullchain.pem"

if [ ! -f $cert_file ]; then
        echo "[ERROR] certificate file not found for domain $domain."
        exit 1;
fi

exp=$(date -d "`openssl x509 -in $cert_file -text -noout|grep "Not After"|cut -c 25-`" +%s)
datenow=$(date -d "now" +%s)
days_exp=$(echo \( $exp - $datenow \) / 86400 |bc)

echo "Checking expiration date for $domain..."

if [ "$days_exp" -gt "$exp_limit" ] ; then
        echo "The certificate is up to date, no need for renewal ($days_exp days left)."
        exit 0;
else
        echo "The certificate for $domain is about to expire soon. Starting renewal request..."
        domain_list=$( get_domain_list $domain )
"$le_path"/letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=”$webpath” --domains "${domain_list}"
        echo "Reloading Nginx..."
sudo systemctl reload nginx
        echo "Renewal process finished for domain $domain"
        exit 0;
fi

18.スクリプトの最初から 変数を置き換えて、Nginxドキュメントルートに一致させます。次のコマンドを発行して、スクリプトが実行可能であり、 bc 計算機がシステムにインストールされていることを確認します。

# chmod +x /usr/local/bin/cert-renew
# yum install bc

次のコマンドを発行して、ドメインに対してスクリプトをテストできます。

# /usr/local/bin/cert-renew yourdomain.tld

19.最後に、証明書の更新プロセスを自動的に実行するには、新しいcronジョブを追加してスクリプトを毎週実行し、有効期限の30日以内に証明書を更新します。

# crontab -e

ファイルの最後に次の行を追加します。

@weekly  /usr/local/bin/cert-renew your_domain.tld >> /var/log/your_domain.tld-renew.log 2>&1

それで全部です!これで、Nginxサーバーは、無料のSSL/TLS Let’sEncrypt証明書を使用して安全なWebコンテンツをWebサイトに配信できます。

全著作権所有。 © Linux-Console.net • 2019-2022