SSL 証明書をインストールして、ご利用の Nginx または Tengine サーバーで HTTPS を有効化します。このガイドでは、証明書のダウンロード、ポート 443 の開放、Nginx サーバーブロックの構成、および結果の確認手順を説明します。
このガイドで実現できること:
SSL Certificates コンソールから証明書パッケージをダウンロードし、サーバーにアップロードする
セキュリティグループおよびシステムファイアウォールでポート 443 を開放する
Nginx 構成に HTTPS サーバーブロックを追加する
Nginx を再読み込みし、証明書が正常に動作していることを確認する
これらの手順は、Nginx 構成と互換性のある Tengine にも適用されます。
前提条件
作業を開始する前に、以下の要件を満たしていることを確認してください。
信頼できる認証局 (CA) によって発行された SSL 証明書。証明書の有効期限が切れている、または間もなく切れる場合は、事前に更新してください。
サーバー上の
rootアカウント、またはsudo権限を持つアカウントドメインの DNS レコードがサーバーのパブリック IP アドレスに解決されるように構成されていること
保護したいすべてのドメインをカバーする証明書
ドメインカバレッジルール:
| カバレッジタイプ | 保護対象 | 保護対象外 |
|---|---|---|
完全一致 (example.com) | example.com のみ | www.example.com またはその他のサブドメイン |
完全一致 (www.example.com) | www.example.com のみ | ルートドメインまたはその他のサブドメイン |
ワイルドカード (*.example.com) | 第 1 階層のサブドメイン:www.example.com、a.example.com | ルートドメイン example.com、a.b.example.com |
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
# Replace <your_server_public_ip> with the public IP address of your server.
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
# Replace <your_server_public_ip> with the public IP address of your server.
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 トラフィックを許可する必要があります。以下の手順は、Alibaba Cloud 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 <Original parameters> --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 構成ファイルの特定方法」をご参照ください。
構成ファイルを開きます。
sudo vim /etc/nginx/nginx.confHTTPS 用のサーバーブロックを追加します。ポート 80 でリッスンしている既存の
serverブロックをコピーし、listen 80をlisten 443 sslに変更し、以下に示す SSL ディレクティブを追加します。その他の設定はすべてそのまま保持します。# ポート 80 でリッスンする元のサーバーブロック server { listen 80; server_name yourdomain www.yourdomain; # その他の構成 location / { proxy_pass http://127.0.0.1:8000; } } # HTTPS 用の新しいサーバーブロック。 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 のサーバーブロックに
returnディレクティブを追加します。# ポート 80 でリッスンする元のサーバーブロック server { listen 80; server_name yourdomain www.yourdomain; # すべての HTTP トラフィックを HTTPS にリダイレクトします。 return 301 https://$host$request_uri; # 到達しなくなるため、元のその他の構成は削除できます。 }構文エラーがないか構成をテストします。
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 のサーバーブロックに return 301 https://$host$request_uri; を追加 |
| 安全でない TLS バージョンを無効化 | SSLv3、TLSv1.0、TLSv1.1 は既知の攻撃に対して脆弱 | Nginx 構成で ssl_protocols TLSv1.2 TLSv1.3; を設定 |
| 証明書の監視と期限切れ前の更新 | 有効期限切れの証明書はすべてのユーザーの HTTPS 接続を中断 | ドメインモニタリングを有効化します。Alibaba Cloud は証明書の有効性を確認し、有効期限が切れる前に更新のリマインダーを送信します。詳細については、「パブリックドメイン名モニタリングの購入および有効化 |
よくある質問
インストール後に HTTPS にアクセスできないのはなぜですか?
以下の項目を順に確認してください。
ポート 443 がブロックされています — セキュリティグループまたはファイアウォールでポート 443 のインバウンドトラフィックが許可されていません。「ポート 443 の開放」をご参照ください。
ドメイン不一致 — アクセスしているドメインが証明書の バインドドメイン に記載されていません。「前提条件」のドメインカバレッジ表をご参照ください。
Nginx が再読み込みされていません — 変更後に構成が再読み込みされていません。
sudo nginx -s reloadを実行してください。ファイルパスが誤っています —
ssl_certificateまたはssl_certificate_keyディレクティブが誤ったパスを指しています。.pemおよび.keyファイルの絶対パスを確認してください。上流サービスでの証明書の不足 — お客様のドメインがコンテンツデリバリーネットワーク (CDN)、Server Load Balancer (SLB)、またはWeb Application Firewall (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 が SSL 証明書ファイルを読み取れず、permission denied エラーが発生するのはなぜですか?
Nginx ワーカープロセスのユーザーに証明書ファイルの読み取り権限がありません。
Nginx ワーカーユーザーを特定します:
nginx.conf内のuserディレクティブを確認します (例:user nginx;)。そのユーザーに証明書および秘密鍵ファイルの読み取り (
r) 権限、およびパス内のすべての親ディレクトリの実行 (x) 権限を付与します。