このトピックでは、Spring Boot アプリケーションで SSL 証明書を直接設定して HTTPS を有効にする方法について説明します。
使用上の注意
開始する前に、次の要件を満たしていることを確認してください:
証明書のステータス: SSL 証明書が信頼できる認証局 (CA) によって発行されていること。証明書が まもなく期限切れ または 期限切れ の場合は、まず SSL 証明書を更新してください。
ドメイン名の一致: 証明書が保護するすべてのドメイン名と一致していることを確認してください。そうでない場合、訪問者が HTTPS 経由で一致しないドメインにアクセスすると、セキュリティ警告が表示されます。ドメインを追加または変更するには、「ドメイン名の追加と置換」をご参照ください。
完全一致ドメイン名: 指定されたドメインにのみ適用されます。
example.comはexample.comのみを保護します。www.example.comはwww.example.comのみを保護します。
ワイルドカードドメイン名: その第 1 レベルのサブドメインにのみ適用されます。
*.example.comは、www.example.comやa.example.comなどの第 1 レベルのサブドメインに適用されます。*.example.comは、ルートドメインexample.comやa.b.example.comなどの複数レベルのサブドメインを保護しません。
説明複数レベルのサブドメインを保護するには、ドメイン名のバインド フィールドに、
a.b.example.comなどの完全なドメイン、または*.b.example.comなどの対応するワイルドカードドメインが含まれている必要があります。サーバー権限:
rootアカウントまたはsudo権限を持つアカウントが必要です。DNS 解決: ドメインの DNS レコードが設定され、サーバーのパブリック IP アドレスに解決されること。
環境依存関係: Java 8 以降がサーバーにインストールされていること。
手順
ステップ 1: 証明書ファイルを準備する
[SSL 証明書管理] ページに移動します。対象の証明書の 操作 列で、証明書のダウンロード をクリックします。ダウンロード タブで、[JKS] サーバータイプ の証明書ファイルをダウンロードします。
説明Spring Boot は JKS と PKCS12 (.pfx) の両方のフォーマットをサポートしています。このトピックでは、PKCS12 を例として使用します。ダウンロードしたファイルを展開すると、証明書ファイル (例:
domain.p12) とパスワードファイル (p12-password.txt) が得られます。展開した証明書ファイル (.pfx または .jks) とパスワードファイル (.txt) をサーバーにアップロードします。それらを
/etc/ssl/myappのような安全な外部ディレクトリに保存します。重要証明書や秘密鍵ファイルを
src/main/resourcesディレクトリに置かないでください。これにより、機密性の高いキーが JAR や WAR ファイルなどのアプリケーション成果物にパッケージ化され、キーの漏洩につながりやすくなります。PuTTY、Xshell、WinSCP などのリモートログインツールのローカルファイルアップロード機能を使用できます。Alibaba Cloud Elastic Compute Service (ECS) を使用している場合は、「ファイルのアップロードまたはダウンロード」をご参照ください。
ステップ 2: Spring Boot アプリケーションを設定する
証明書のパスワードなどの機密情報を設定ファイルにハードコーディングしないでください。この方法はセキュリティリスクをもたらします。代わりに、環境変数または外部の安全なファイルを使用してください。
exportコマンドを実行して環境変数を設定します。# 以前にダウンロードしたパスワードファイルからパスワードを取得します。 export SSL_KEYSTORE_PASSWORD='your_secure_password' # 秘密鍵のパスワードが異なる場合は、それも設定します。 export SSL_KEY_PASSWORD='your_key_password'次の例に示すように、
application.propertiesまたはapplication.ymlファイルを設定します。説明このトピックでは、Spring Boot バージョン 3.4.10 を例として使用します。
application.properties
# ポート 443 でリッスン server.port=443 # --- SSL 設定 --- # 証明書ファイルへのパス。「file:」プレフィックスを使用して、外部の絶対パスを指定します。 server.ssl.key-store=file:/etc/myapp/ssl/keystore.p12 # 証明書キーストアのタイプ。 server.ssl.key-store-type=PKCS12 # 証明書エイリアス。通常、JKS/P12 ファイルの生成時に指定されます。 server.ssl.key-alias=mycert # --- セキュリティ設定: パスワード管理 --- # 設定ファイルにハードコーディングするのを避けるため、環境変数からパスワードを読み取ります。 server.ssl.key-store-password=${SSL_KEYSTORE_PASSWORD} # 秘密鍵のパスワードがキーストアのパスワードと異なる場合は、それも環境変数から読み取ります。 server.ssl.key-password=${SSL_KEY_PASSWORD} # --- セキュリティ設定: TLS プロトコルと暗号スイート --- # 安全な TLS プロトコルバージョンを有効にします。 server.ssl.enabled-protocols=TLSv1.2,TLSv1.3 # 推奨される強力な暗号スイートを設定します。 server.ssl.ciphers=TLS_AES_256_GCM_SHA384,TLS_CHACHA20_POLY1305_SHA256,TLS_AES_128_GCM_SHA256,ECDHE-RSA-AES256-GCM-SHA384,ECDHE-RSA-AES128-GCM-SHA256 # パフォーマンスを向上させるために HTTP/2 を有効にします。 server.http2.enabled=trueapplication.yml
server: port: 443 # ポート 443 でリッスン ssl: # --- SSL 設定 --- # 証明書ファイルへのパス。「file:」プレフィックスを使用して、外部の絶対パスを指定します。 key-store: file:/etc/myapp/ssl/keystore.p12 # 証明書キーストアのタイプ。 key-store-type: PKCS12 # 証明書エイリアス。通常、JKS/P12 ファイルの生成時に指定されます。 key-alias: mycert # --- セキュリティ設定: パスワード管理 --- # 設定ファイルにハードコーディングするのを避けるため、環境変数からパスワードを読み取ります。 key-store-password: ${SSL_KEYSTORE_PASSWORD} # 秘密鍵のパスワードがキーストアのパスワードと異なる場合は、それも環境変数から読み取ります。 key-password: ${SSL_KEY_PASSWORD} # --- セキュリティ設定: TLS プロトコルと暗号スイート --- # 安全な TLS プロトコルバージョンを有効にします。 enabled-protocols: TLSv1.2,TLSv1.3 # 推奨される強力な暗号スイートを設定します。 ciphers: - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 - TLS_AES_128_GCM_SHA256 - ECDHE-RSA-AES256-GCM-SHA384 - ECDHE-RSA-AES128-GCM-SHA256 # パフォーマンスを向上させるために HTTP/2 を有効にします。 http2: enabled: true
ステップ 3: システムとネットワーク環境を設定する
このステップでは、アプリケーションが指定されたポートでリッスンする権限を持ち、セキュリティグループとファイアウォールが外部トラフィックの到達を許可することを確認します。
サーバーのターミナルで次のコマンドを実行して、ポート 443 が開いているかどうかを確認します:
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: <現在のサーバーのパブリック IP アドレス>:443 に接続しましたの場合、ポート 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出力が
<現在のサーバーのパブリック IP アドレス> のポート [tcp/https] への接続に成功しました!または[<現在のサーバーのパブリック IP アドレス>] 443 (https) openの場合、ポート 443 は開いています。そうでない場合は、セキュリティグループとファイアウォールでポート 443 を開きます。セキュリティグループの設定でポート 443 を開きます。
重要サーバーがクラウドプラットフォームにデプロイされている場合は、そのセキュリティグループが TCP ポート 443 でのインバウンドトラフィックを許可していることを確認してください。そうでない場合、サービスにアクセスできなくなります。以下の手順では、Alibaba Cloud Elastic Compute Service (ECS) を例として使用します。他のクラウドプラットフォームについては、公式ドキュメントをご参照ください。
[Elastic Compute Service インスタンス] ページに移動し、対象のインスタンス名をクリックしてインスタンス詳細ページに移動します。「セキュリティグループルールの追加」をご参照のうえ、[セキュリティグループ] に新しいルールを追加し、[アクション] を [許可]、[プロトコルタイプ] を [カスタム TCP]、[宛先ポート範囲] を [HTTPS(443)]、[認証オブジェクト] を [すべての IPv4 アドレス] に設定します。
ファイアウォールでポート 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、ufw、nftables、またはiptables) に基づいて、以下の対応するコマンドを実行してポート 443 を開きます: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
ステップ 4: アプリケーションを再起動する
Spring Boot プロジェクトのルートディレクトリに移動します。ビルドツールに基づいて、対応するコマンドを実行してアプリケーションを再起動します。
開発/テスト環境 (ビルドプラグインを使用)
Maven
mvn spring-boot:runGradle
gradle bootRun
本番環境 (スタンドアロン JAR として実行)
本番環境では、通常、アプリケーションを .jar ファイルとしてパッケージ化して実行します。java -jar コマンドでアプリケーションを再起動する前に、古いプロセスを停止する必要があります。
# 1. 実行中のアプリケーションプロセス (PID) を見つけて停止します。
# ps -ef | grep your-app-name.jar
# kill <PID>
#
# 2. アプリケーションを再起動します。JVM 引数を追加する必要がある場合は、'&' の前に含めます。
nohup java -jar /path/to/your-app-name.jar &再起動後、アプリケーションのログを確認して、サービスが SSL 証明書をロードし、HTTPS ポートで開始されたことを確認してください。
ステップ 5: デプロイメントを検証する
Web ブラウザで HTTPS 経由でドメインにアクセスします。例:
https://yourdomain.com。yourdomain.comを実際のドメインに置き換えてください。ブラウザのアドレスバーにロックアイコンが表示された場合、証明書は正常にデプロイされています。アクセスエラーが発生した場合やロックアイコンが表示されない場合は、ブラウザのキャッシュをクリアするか、シークレット (プライバシー) モードで再試行してください。

バージョン 117 以降、Chrome のアドレスバーの
アイコンは新しい
アイコンに置き換えられました。このアイコンをクリックすると、ロック情報を表示できます。
問題が解決しない場合は、トラブルシューティングについて、「よくある質問」セクションをご参照ください。
本番稼働
本番環境にデプロイする際は、セキュリティ、安定性、保守性を向上させるために、以下のベストプラクティスに従ってください:
管理者以外のユーザーとして実行:
アプリケーション専用の低権限のシステムユーザーを作成します。管理者権限を持つアカウントでアプリケーションを実行しないでください。
説明推奨されるアプローチは、ゲートウェイレイヤーで SSL を設定することです。これには、Server Load Balancer (SLB) や Nginx などのリバースプロキシに証明書をデプロイすることが含まれます。ゲートウェイは HTTPS トラフィックを終端し、復号化された HTTP トラフィックをバックエンドアプリケーションに転送します。
認証情報管理の外部化:
コードや設定ファイルにパスワードやその他の機密情報をハードコーディングしないでください。環境変数、Vault、またはクラウドプロバイダーのキー管理サービスを使用して認証情報を注入します。
HTTP から HTTPS へのリダイレクトの強制:
すべての中間者攻撃を防ぐために、すべての HTTP トラフィックを HTTPS にリダイレクトします。
最新の TLS プロトコルの設定:
サーバー設定で古い安全でないプロトコル (SSLv3、TLSv1.0、TLSv1.1 など) を無効にします。TLSv1.2 と TLSv1.3 のみを有効にします。
証明書の監視と更新の自動化:
証明書をデプロイした後、ドメイン監視を有効にします。Alibaba Cloud は証明書の有効期間を自動的にチェックし、有効期限が切れる前に更新リマインダーを送信して、サービスの中断を回避するのに役立ちます。詳細については、「パブリックドメイン名監視の購入と有効化」をご参照ください。
よくある質問
インストールまたは更新後に証明書が機能しない、または HTTPS にアクセスできないのはなぜですか?
一般的な原因は次のとおりです:
サーバーのセキュリティグループまたはファイアウォールがポート 443 でのトラフィックを許可していません。「システムとネットワーク環境を設定する」をご参照ください。
アクセスしているドメインが証明書の ドメイン名のバインド に含まれていません。「ドメイン名の一致」をご参照ください。
設定ファイルを変更した後に Spring Boot サービスが再起動されていません。「ステップ 4: アプリケーションを再起動する」をご参照ください。
証明書ファイルが正しく置き換えられていないか、Spring Boot 設定で証明書パスが正しく指定されていません。Spring Boot 設定ファイルと証明書ファイルが最新で有効であることを確認してください。
ドメインのトラフィックが Content Delivery Network (CDN)、SLB、Web Application Firewall (WAF) などのクラウドプロダクトを経由しているが、そのサービスに証明書がインストールされていません。セットアップを完了するには、「トラフィックが複数の Alibaba Cloud サービスを通過する場合の証明書のデプロイメント場所」をご参照ください。
ドメインの DNS が複数のサーバーに解決されているが、証明書はその一部にしかインストールされていません。各サーバーに証明書をインストールしてください。
さらなるトラブルシューティングについては、「ブラウザのエラーメッセージに基づく証明書デプロイメントの問題の解決」および「SSL 証明書デプロイメントのトラブルシューティングガイド」をご参照ください。
Spring Boot アプリケーションで SSL 証明書を更新または置き換えるにはどうすればよいですか?
まず、サーバー上の既存の証明書とパスワードファイルをバックアップします。次に、Certificate Management Service コンソールにログインし、新しい証明書ファイルをダウンロードして対象のサーバーにアップロードし、古いファイルを上書きします。パスとファイル名が同じであることを確認してください。最後に、Spring Boot アプリケーションを再起動して新しい証明書を適用します。