SSL 証明書をインストールして、Nginx または Tengine サーバーで HTTPS を有効化します。このガイドでは、証明書のダウンロード、ポート 443 の開放、Nginx の server ブロックの設定、結果の確認までを順を追って説明します。
達成する内容:
SSL Certificates コンソールから証明書パッケージをダウンロードし、サーバーにアップロードする
セキュリティグループとシステムファイアウォールでポート 443 を開放する
Nginx の設定に HTTPS の server ブロックを追加する
Nginx をリロードし、証明書が機能していることを確認する
これらの手順は、Nginx の設定と互換性のある Tengine にも適用されます。
前提条件
開始する前に、以下の準備が整っていることを確認してください。
信頼できる認証局 (CA) によって発行された SSL 証明書。証明書の有効期限が切れているか、まもなく切れる場合は、まず更新してください
サーバー上の
rootアカウントまたはsudo権限を持つアカウントサーバーのパブリック IP アドレスに解決されるように設定されたドメイン DNS レコード
保護したいすべてのドメインをカバーする証明書
ドメインカバレッジのルール:
カバレッジタイプ | 保護対象 | 保護対象外 |
完全一致 ( |
|
|
完全一致 ( |
| ルートドメインまたは他のサブドメイン |
ワイルドカード ( | 第一レベルのサブドメイン: | ルートドメイン |
a.b.example.comのような複数レベルのサブドメインを保護するには、[バインド済みドメイン] フィールドに完全一致ドメインまたは*.b.example.comのような対応するワイルドカードが含まれている必要があります。
ドメイン名を追加または変更するには、有料証明書を購入するか、ドメイン名を追加および置換する必要があります。
ステップ 1: SSL 証明書の準備
SSL Certificates ページに移動します。対象の証明書の [操作] 列で、[証明書のダウンロード] をクリックします。[ダウンロード] タブで、[サーバーの種類] として [Nginx] を選択し、パッケージをダウンロードします。
ダウンロードしたパッケージを解凍します。
パッケージに証明書ファイル (
.pem) と秘密鍵ファイル (.key) が含まれている場合は、両方を保存します。これらは次のステップで必要です。パッケージに
.pemファイルのみが含まれ、.keyファイルが含まれていない場合は、証明書署名要求 (CSR) を生成したときにローカルに保存した秘密鍵ファイルを使用します。
OpenSSL または keytool を使用して CSR を生成した場合、秘密鍵はローカルマシンにのみ保存され、ダウンロードしたパッケージには含まれません。秘密鍵を紛失した場合、証明書は使用できなくなります。新しい有料証明書を購入し、新しい CSR と秘密鍵を生成してください。
.pemファイルと.keyファイルをサーバーにアップロードします。これらを/etc/ssl/certのような安全なディレクトリに保存します。PuTTY、Xshell、WinSCP などのリモートログインツールのファイルアップロード機能を使用してください。サーバーが Alibaba Cloud Elastic Compute Service (ECS) インスタンスの場合は、「ファイルのアップロードまたはダウンロード」をご参照ください。
ステップ 2: ポート 443 の開放
HTTPS トラフィックは TCP ポート 443 を使用します。クラウドのセキュリティグループとシステムのファイアウォールの両方でこのポートが開放されていることを確認してください。
ポート 443 が開放されているかの確認
次のコマンドを実行して、ポート 443 の接続性をテストします。<your_server_public_ip> をサーバーのパブリック IP アドレスに置き換えてください。
RHEL/CentOS
command -v nc > /dev/null 2>&1 || sudo yum install -y nc
# <your_server_public_ip> をサーバーのパブリック IP アドレスに置き換えます。
sudo ss -tlnp | grep -q ':443 ' || sudo nc -l 443 & sleep 1; nc -w 3 -vz <your_server_public_ip> 443出力が Ncat: Connected to <your_server_public_ip>:443 の場合、ポート 443 は開放されています。そうでない場合は、以下の手順を実行してください。
Debian/Ubuntu
command -v nc > /dev/null 2>&1 || sudo apt-get install -y netcat
# <your_server_public_ip> をサーバーのパブリック IP アドレスに置き換えます。
sudo ss -tlnp | grep -q ':443 ' || sudo nc -l -p 443 & sleep 1; nc -w 3 -vz <your_server_public_ip> 443出力が Connection to <your_server_public_ip> port [tcp/https] succeeded! または [<your_server_public_ip>] 443 (https) open の場合、ポート 443 は開放されています。そうでない場合は、以下の手順を実行してください。
セキュリティグループでのポート 443 の開放
サーバーがクラウドプラットフォームで実行されている場合、そのセキュリティグループはポート 443 でのインバウンド TCP トラフィックを許可する必要があります。以下の手順では、ECS を例として使用します。他のクラウドプラットフォームについては、それぞれのドキュメントをご参照ください。
Elastic Compute Service (ECS) インスタンス ページに移動し、対象のインスタンス名をクリックします。 [セキュリティグループの詳細] セクションで、次の設定でルールを追加し、セキュリティグループのルールを追加 をクリックします:
フィールド | 値 |
[アクション] | 許可 |
[プロトコル] | カスタム TCP |
[宛先 (現在のインスタンス)] | HTTPS (443) |
[ソース] | 0.0.0.0/0 (どこでも) |
システムファイアウォールでのポート 443 の開放
次のコマンドを実行して、アクティブなファイアウォールを特定します。
if command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet firewalld; then
echo "firewalld"
elif command -v ufw >/dev/null 2>&1 && sudo ufw status | grep -qw active; then
echo "ufw"
elif command -v nft >/dev/null 2>&1 && sudo nft list ruleset 2>/dev/null | grep -q 'table'; then
echo "nftables"
elif command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet iptables; then
echo "iptables"
elif command -v iptables >/dev/null 2>&1 && sudo iptables -L 2>/dev/null | grep -qE 'REJECT|DROP|ACCEPT'; then
echo "iptables"
else
echo "none"
fi出力が none の場合、ファイアウォールのアクションは不要です。そうでない場合は、ファイアウォールの種類に応じたコマンドを実行してください。
firewalld
sudo firewall-cmd --permanent --add-port=443/tcp && sudo firewall-cmd --reloadufw
sudo ufw allow 443/tcpnftables
sudo nft add table inet filter 2>/dev/null
sudo nft add chain inet filter input '{ type filter hook input priority 0; }' 2>/dev/null
sudo nft add rule inet filter input tcp dport 443 counter accept 2>/dev/nulliptables
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT再起動後も iptables のルールを永続化するには:
RHEL/CentOS:
sudo yum install -y iptables-services sudo service iptables saveDebian/Ubuntu:
sudo apt-get install -y iptables-persistent sudo iptables-save | sudo tee /etc/iptables/rules.v4 >/dev/null
ステップ 3: Nginx への SSL 証明書のインストール
SSL モジュールのインストール
次のコマンドを実行します。出力が --with-http_ssl_module の場合、SSL モジュールはすでにインストールされているため、「SSL 証明書の設定」に進むことができます。
nginx -V 2>&1 | grep -o -- '--with-http_ssl_module'システムがnginx: command not foundを返す場合は、/usr/local/nginx/sbin/nginx -V 2>&1 | grep -o -- '--with-http_ssl_module'のように完全なインストールパスを使用してください。
SSL モジュールがない場合は、Nginx のインストール方法に応じて、以下のいずれかの方法でインストールします。
SSL モジュールを追加すると、Nginx サービスが一時的に中断される可能性があります。事前に Nginx の設定とデータをバックアップし、この変更はオフピーク時に実行してください。
パッケージマネージャーの使用
サーバーのターミナルで次のコマンドを実行します。
RHEL/CentOS
# Nginx の公式リポジトリを追加します。
sudo tee /etc/yum.repos.d/nginx.repo <<EOF
[nginx-stable]
name=nginx stable repo
baseurl=https://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
# Nginx をアップグレードします。
sudo yum upgrade nginxDebian/Ubuntu
# Nginx をアップグレードします。
sudo apt-get update
sudo apt-get install --only-upgrade nginxソースからのコンパイル
ビルド依存関係をインストールします。
RHEL/CentOS
sudo yum install -y gcc pcre-devel zlib-devel openssl-develDebian/Ubuntu
sudo apt-get update sudo apt-get install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev現在のコンパイルパラメーターを記録します。
nginx -Vconfigure arguments:の後に表示されるすべてのパラメーターをコピーします。これらはステップ 4 で必要になります。現在の Nginx バージョンのソースコードをダウンロードします。
nginx -vを実行してバージョンを確認し (例として 1.14.2 を使用)、ソースパッケージをダウンロードして展開します。wget http://nginx.org/download/nginx-1.14.2.tar.gz tar -zxvf nginx-1.14.2.tar.gz cd nginx-1.14.2SSL モジュールを使用して Nginx を再コンパイルします。記録したパラメーターに
--with-http_ssl_moduleを追加して再コンパイルします。error: 'ENGINE_by_id' is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations]が表示された場合は、代わりにmake CFLAGS='-Wno-error=deprecated-declarations'を実行してください。# 既存のモジュールを失わないように、元のパラメーターをすべて保持します。 ./configure <元のパラメーター> --with-http_ssl_module makeNginx バイナリを置き換えます。元のバイナリをバックアップします (例として
/usr/local/nginx/sbin/nginxを使用)。# /usr/local/nginx/sbin/nginx を nginx バイナリの実際のパスに置き換えます。 sudo cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak新しくコンパイルしたバイナリで上書きします。
# /usr/local/nginx/sbin/nginx を nginx バイナリの実際のパスに置き換えます。 sudo cp objs/nginx /usr/local/nginx/sbin/nginxSSL モジュールがインストールされていることを確認します。
nginx -V 2>&1 | grep -o -- '--with-http_ssl_module'出力
--with-http_ssl_moduleは、モジュールがインストールされていることを確認します。
SSL 証明書の設定
以下の手順では、Nginx 1.14.2 と設定ファイル /etc/nginx/nginx.conf を例として使用します。サーバーでアクティブな設定ファイルを見つけるには、「アクティブな Nginx 設定ファイルを見つけるにはどうすればよいですか?」をご参照ください。
設定ファイルを開きます。証明書ファイル (
.pemまたは.crt) と秘密鍵ファイル (.key) のファイル名と保存パスはカスタマイズできます。Nginx の設定で指定するパスが正しく、Nginx プロセスがそれらのファイルに対する読み取り権限を持っていることを確認してください。sudo vim /etc/nginx/nginx.confHTTPS 用の server ブロックを追加します。ポート 80 をリッスンしている既存の
serverブロックをコピーし、listen 80をlisten 443 sslに変更し、以下に示す SSL ディレクティブを追加します。他の設定はすべて変更しないでください。# ポート 80 をリッスンする元の server ブロック server { listen 80; server_name yourdomain www.yourdomain; # その他の設定 location / { proxy_pass http://127.0.0.1:8000; } } # HTTPS 用の新しい server ブロック server { # 元の 'listen 80' を 'listen 443 ssl' に変更します。 listen 443 ssl; # 元の server_name。現在の証明書でサポートされているドメイン名を追加できます。 server_name yourdomain www.yourdomain; # ======================= 証明書設定の開始 ======================= # 証明書ファイルを指定します (中間証明書はこの .pem ファイルに追加できます)。/etc/ssl/cert/ssl.pem を証明書ファイルの絶対パスに置き換えます。 ssl_certificate /etc/ssl/cert/ssl.pem; # 秘密鍵ファイルを指定します。/etc/ssl/cert/ssl.key を秘密鍵ファイルの絶対パスに置き換えます。 ssl_certificate_key /etc/ssl/cert/ssl.key; # パフォーマンスを向上させるために SSL セッションキャッシュを設定します。 ssl_session_cache shared:SSL:1m; # SSL セッションのタイムアウト期間を設定します。 ssl_session_timeout 5m; # 使用する TLS プロトコルの種類と暗号スイートをカスタマイズします (以下は設定例です。設定が必要かどうかを評価してください)。 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # 許可される TLS プロトコルバージョンを指定します。TLS バージョンが高いほど HTTPS 通信のセキュリティが向上しますが、低い TLS バージョンよりもブラウザの互換性が劣ります。 ssl_protocols TLSv1.2 TLSv1.3; # サーバーが指定した暗号スイートを優先します。 ssl_prefer_server_ciphers on; # ======================= 証明書設定の終了 ======================= # その他の設定 }(任意) HTTP を HTTPS にリダイレクトするには、ポート 80 の server ブロックに
returnディレクティブを追加します。# ポート 80 をリッスンする元の server ブロック server { listen 80; server_name yourdomain www.yourdomain; # すべての HTTP トラフィックを HTTPS にリダイレクトします。 return 301 https://$host$request_uri; # 他の元の設定は実行されなくなるため、削除できます。 }(オプション) Nginx または Tengine の Web サービスが Docker コンテナで実行されている場合の証明書パスを設定します。
コンテナには独自のファイルシステムがあり、ホストサーバーから隔離されているため、Nginx はホストパスから直接証明書ファイルを読み取ることができません。SSL Certificates コンソールからダウンロードしたデジタル証明書 (
.pemファイル、中間証明書チェーンを含む) と秘密鍵ファイルをコンテナにマウントし、コンテナ内のパスを参照します。コンテナを起動する際に、証明書ファイル、秘密鍵ファイル、設定ファイルをマッピングします。
:roオプションは、それらを読み取り専用としてマウントします。# /host/path/to/ をホストサーバー上の証明書ファイル、秘密鍵ファイル、設定ファイルの実際の絶対パスに置き換えます。 docker run -d --name nginx-ssl \ -v /host/path/to/cert.pem:/etc/nginx/ssl/cert.pem:ro \ -v /host/path/to/cert.key:/etc/nginx/ssl/cert.key:ro \ -v /host/path/to/nginx.conf:/etc/nginx/nginx.conf:ro \ -p 443:443 \ nginxnginx.confで、ssl_certificateとssl_certificate_keyの設定項目をホストパスではなくコンテナ内のパスに設定します。ssl_certificate /etc/nginx/ssl/cert.pem; ssl_certificate_key /etc/nginx/ssl/cert.key;コンテナを再起動して変更を適用します。
docker restart nginx-ssl
ファイルがマウントされていない場合、または
nginx.confがコンテナ内のパスではなくホストパスを指している場合、Nginx は起動に失敗し、cannot load certificate: No such file or directoryというエラーを返します。詳細なトラブルシューティングについては、よくある質問をご参照ください。コンテナが再起動した後、ブラウザでサイトを開き、証明書が正しく読み込まれることを確認します。設定の構文エラーをテストします。
sudo nginx -t -c /etc/nginx/nginx.conf出力に
syntax is okとtest is successfulの両方が含まれている場合、設定は有効です。そうでない場合は、報告されたエラーを修正し、再度テストを実行してください。
Nginx のリロード
これらのコマンドは、Nginx がデフォルトの設定パスで起動されたことを前提としています。カスタムのインストールパスまたは設定ファイルがある場合は、適宜調整してください。
Nginx が実行中の場合
サービスを再起動せずに設定をリロードします。
sudo nginx -s reloadリロードが失敗した場合は、よくある質問を参照してトラブルシューティングを行ってください。
Nginx が実行されていない場合
起動します。
nginxステップ 4: デプロイの検証
ブラウザを開き、
https://yourdomainに移動します。yourdomainを実際のドメインに置き換えてください。アドレスバーの鍵アイコンは、証明書が正常にデプロイされたことを示します。Chrome バージョン 117 以降、
アイコンは新しい
アイコンに置き換えられました。これをクリックして証明書の詳細を表示します。アクセスエラーが表示されたり、鍵アイコンが表示されない場合は、ブラウザのキャッシュをクリアするか、シークレットモードで再試行してください。
問題が解決しない場合は、よくある質問を参照してトラブルシューティングを行ってください。
本番環境に適用
本番環境にデプロイする際は、以下のベストプラクティスを適用してください。
プラクティス | 重要性 | 適用方法 |
非 root ユーザーとして実行 | セキュリティインシデントの際の影響範囲を限定する | アプリケーション専用の低権限システムユーザーを作成する |
ゲートウェイで SSL を終端 | 証明書管理を簡素化し、バックエンドの複雑さを軽減する | Server Load Balancer (SLB) に証明書をデプロイする。SLB は HTTPS を終端し、プレーンな HTTP をバックエンドに転送する |
シークレットの外部化 | ソースコードや設定ファイルからの認証情報の漏洩を防ぐ | パスワードをハードコーディングする代わりに、環境変数、HashiCorp Vault、または Alibaba Cloud Key Management Service を使用する |
HTTP から HTTPS へのリダイレクトを強制 | 暗号化されていないトラフィックに対する中間者攻撃を防ぐ | ポート 80 の server ブロックに |
安全でない TLS バージョンを無効化 | SSLv3、TLSv1.0、TLSv1.1 は既知の攻撃に対して脆弱である | Nginx の設定で |
証明書を監視し、期限内に更新 | 期限切れの証明書は、すべてのユーザーの HTTPS を中断させる | ドメイン監視を有効にする。Alibaba Cloud は証明書の有効性をチェックし、有効期限前に更新リマインダーを送信する。「パブリックドメイン名の監視の購入と有効化」をご参照ください |
よくある質問
インストール後に HTTPS にアクセスできないのはなぜですか?
以下の項目を順番に確認してください。
ポート 443 がブロックされている — セキュリティグループまたはファイアウォールがポート 443 でのインバウンドトラフィックを許可していません。「ポート 443 の開放」をご参照ください。
ドメインの不一致 — アクセスしているドメインが証明書の [バインド済みドメイン] にリストされていません。「前提条件」のドメインカバレッジ表をご参照ください。
Nginx がリロードされていない — 変更後に設定がリロードされていません。
sudo nginx -s reloadを実行してください。ファイルパスが間違っている —
ssl_certificateまたはssl_certificate_keyディレクティブが不正なパスを指しています。.pemファイルと.keyファイルへの絶対パスを確認してください。アップストリームサービスに証明書がない — ドメインが Content Delivery Network (CDN)、Server Load Balancer (SLB)、または Web アプリケーションファイアウォール (WAF) を経由している場合、証明書はそれらのサービスにもインストールする必要があります。「トラフィックが複数の Alibaba Cloud サービスを通過する場合の証明書デプロイ場所」をご参照ください。
証明書がすべてのサーバーにデプロイされていない — ドメイン DNS が複数のサーバーに解決される場合、それぞれのサーバーに証明書をインストールしてください。
さらにヘルプが必要な場合は、「ブラウザのエラーメッセージに基づく証明書デプロイ問題の解決」および「SSL 証明書デプロイのトラブルシューティングガイド」をご参照ください。
ダウンタイムなしで SSL 証明書を更新または置換するにはどうすればよいですか?
サーバー上の現在の
.pemファイルと.keyファイルをバックアップします。Certificate Management Service コンソールから新しい証明書と秘密鍵をダウンロードします。
新しいファイルをサーバーにアップロードし、既存のファイルを上書きします。 Nginx 設定で参照されているものと全く同じファイルパスと名前を使用してください。
Nginx をリロードします:
sudo nginx -s reload。
Linux サーバーでアクティブな Nginx 設定ファイル (nginx.conf) を見つけるにはどうすればよいですか?
ps -ef | grep '[n]ginx: master' | grep -- ' -c 'を実行します。出力に-c /etc/nginx/custom.confのような出力がある場合、Nginx はそのカスタム設定ファイルを使用しています。ステップ 1 で出力がない場合、Nginx はデフォルトのパスを使用しています。
nginx -V 2>&1 | grep -oP -- '--conf-path=[^ ]*'を実行して、--conf-path=/etc/nginx/nginx.confのようなデフォルトパスを表示します。
「証明書が標準を満たしていません」という警告を修正するために TLSv1.0 と TLSv1.1 を無効にするにはどうすればよいですか?
Nginx の設定で ssl_protocols ディレクティブを次のように設定します。
ssl_protocols TLSv1.2 TLSv1.3;これにより、安全でない TLSv1.0 および TLSv1.1 プロトコルが無効になります。ファイルを保存した後、nginx -s reload を実行して変更を適用します。
nginx -t が bind() to 0.0.0.0:443 failed (98: Address already in use) で失敗するのはなぜですか?
別のプロセスがすでにポート 443 をリッスンしています。sudo ss -tlnp | grep :443 を実行して特定します。その後、競合するプロセス (別の Web サーバーやハングした Nginx インスタンスなど) を停止するか、別のポートを使用するように再設定してください。
nginx -t が cannot load certificate "/etc/nginx/ssl/domain.pem": BIO_new_file() failed で失敗するのはなぜですか?
Nginx は設定で指定されたパスに証明書ファイルを見つけられません。nginx.conf の ssl_certificate ディレクティブを、.pem ファイルの実際の絶対パスを指すように修正してください。
Nginx のリロードが the "ssl" parameter requires ngx_http_ssl_module で失敗するのはなぜですか?
Nginx のビルドに SSL モジュールがありません。ngx_http_ssl_module を有効にして Nginx をインストールまたは再コンパイルしてください。「SSL モジュールのインストール」をご参照ください。
Nginx をリロードすると No such file or directory: fopen('/cert/3970497_demo.aliyundoc.com.pem','r') が表示されるのはなぜですか?
ssl_certificate または ssl_certificate_key に指定されたパスが正しくありません。設定内のパスが正しい絶対パスであり、ファイルがその場所に存在することを確認してください。
Nginx が permission denied エラーで SSL 証明書ファイルの読み取りに失敗するのはなぜですか?
Nginx のワーカープロセスユーザーが証明書ファイルへの読み取りアクセス権を持っていません。
Nginx のワーカーユーザーを見つけます:
nginx.confのuserディレクティブを探します (例:user nginx;)。そのユーザーに証明書と秘密鍵ファイルに対する読み取り (
r) 権限と、パス内のすべての親ディレクトリに対する実行 (x) 権限を付与します。
Nginx 1.2 は SSL Certificate Management V2.0 からダウンロードした証明書をサポートしていますか?
はい。SSL Certificate Management V2.0 を通じて発行された証明書は、V1.0 を通じて発行されたものと同じです。唯一の違いは購入方法です。