このガイドでは、Spring Boot アプリケーションの組み込みサーバーに SSL 証明書を直接設定して HTTPS を有効にする方法を説明します。
前提条件
開始する前に、以下をご確認ください:
信頼できる認証局によって発行された有効な SSL 証明書。証明書の有効期限が近い、またはすでに切れている場合は、まず更新してください。
ドメイン名をカバーする証明書。ドメイン名を追加または変更するには、公式証明書を購入するか、ドメイン名を追加および置き換えることができます。
マルチレベルサブドメインを保護するには、[バインドされたドメイン] フィールドに、完全一致ドメイン (例:
a.b.example.com) または対応するワイルドカード (例:*.b.example.com) を含める必要があります。ドメイン名の種類 カバー範囲 完全一致 ( example.com)example.com完全一致 ( www.example.com)www.example.comワイルドカード ( *.example.com)第一レベルのサブドメイン: www.example.com、a.example.com— ルートドメインexample.comやa.b.example.com対象外サーバーへのアクセス:
rootアカウント、またはsudo特権を持つアカウント。DNS 設定:ドメインの DNS レコードがサーバーのパブリック IP アドレスに解決されること。
ドメイン名の名前解決:ドメインの DNS レコードが設定され、サーバーのパブリック IP アドレスに解決されること。
サーバーに Java 8 以降がインストールされていること。
必要なファイル:
| ファイル | 説明 |
|---|---|
| 証明書ファイル | domain.p12 (PKCS12 フォーマット) または domain.jks (JKS フォーマット)、Certificate Management Service からダウンロード |
| パスワードファイル | p12-password.txt — キーストアのパスワードが含まれています |
ステップ 1: 証明書ファイルの準備
Certificate Management Service コンソールに移動します。対象の証明書の [操作] 列で、[証明書のダウンロード] をクリックします。[ダウンロード] タブで、サーバータイプとして [JKS] を選択し、証明書ファイルをダウンロードします。
Spring Boot は JKS と PKCS12 (.pfx) フォーマットをサポートしています。このガイドでは、PKCS12 を例として使用します。ダウンロードしたファイルを展開すると、証明書ファイル (例:
domain.p12) とパスワードファイル (p12-password.txt) が取得できます。証明書ファイル (.pfx または .jks) およびパスワードファイル (.txt) をサーバーにアップロードします。これらのファイルは、アプリケーションの外部にあるセキュアなディレクトリ(例:
/etc/ssl/myapp)に保存してください。ファイルをアップロードするには、使用しているリモートログインツール(PuTTY、Xshell、WinSCP)のファイル転送機能を使用します。サーバーが Alibaba Cloud Elastic Compute Service (ECS) 上で実行されている場合は、ファイルのアップロードまたはダウンロードをご参照ください。重要証明書ファイルや秘密鍵ファイルを
src/main/resourcesディレクトリに配置しないでください。これを行うと、機密性の高いキーがアプリケーションアーティファクト (JAR または WAR ファイル) にパッケージ化され、キー漏洩のリスクが生じます。
ステップ 2: Spring Boot アプリケーションの設定
証明書のパスワードなどの機密情報を設定ファイルにハードコーディングしないでください。代わりに、環境変数や外部のシークレットマネージャーを使用してください。
証明書のパスワード用の環境変数を設定します:
# 先ほどダウンロードしたパスワードファイルからパスワードを取得します。 export SSL_KEYSTORE_PASSWORD='your_secure_password' # 秘密鍵のパスワードがキーストアのパスワードと異なる場合は、それも設定します。 export SSL_KEY_PASSWORD='your_key_password'application.propertiesまたはapplication.ymlファイルで SSL を設定します。このガイドでは、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 を開く
システムのファイアウォールとクラウドのセキュリティグループの両方で、TCP ポート 443 でのインバウンドトラフィックが許可されていることを確認してください。
ポート 443 がすでに開いているかどうかの確認
お使いの Linux ディストリビューションに応じて、次のコマンドを実行します:
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 を開く
ご利用のサーバーがクラウドプラットフォーム上で実行されている場合、セキュリティグループでポート 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 ACCEPTiptables のルールを再起動後も維持するには:
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 ファイルとしてパッケージ化して実行します。再起動する前に、実行中のプロセスを停止してください:
# 1. 実行中のプロセスを見つけて停止します。
# ps -ef | grep your-app-name.jar
# kill <PID>
#
# 2. アプリケーションを再起動します。'&' の前に JVM 引数を追加します。
nohup java -jar /path/to/your-app-name.jar &再起動後、アプリケーションログを確認し、サービスが SSL 証明書をロードして HTTPS ポートで起動したことを確認してください。
ステップ 5: デプロイメントの検証
ブラウザを開き、
https://yourdomainにアクセスします。yourdomainは実際のドメインに置き換えてください。証明書が正しくデプロイされている場合、アドレスバーにセキュリティインジケーターが表示されます。アクセスエラーが表示される場合やインジケーターが表示されない場合は、ブラウザのキャッシュをクリアするか、シークレットモードで試してください。

Chrome バージョン 117 以降、アドレスバーの
アイコンは新しい
アイコンに置き換えられました。このアイコンをクリックすると、証明書の詳細が表示されます。
問題が解決しない場合は、トラブルシューティングのガイダンスについて、よくある質問のセクションをご参照ください。
本番環境での適用
アプリケーションを本番環境で公開する前に、以下のベストプラクティスを適用してください:
非管理者ユーザーとして実行する。アプリケーション専用の低権限のシステムユーザーを作成してください。管理者レベルのアカウントで実行しないでください。
大規模な本番デプロイメントでは、代わりにゲートウェイレイヤーで SSL を設定します。つまり、Server Load Balancer (SLB) や Nginx などのリバースプロキシに証明書をデプロイします。ゲートウェイは HTTPS トラフィックを終端し、復号化された HTTP トラフィックをバックエンドアプリケーションに転送します。
認証情報管理を外部化する。パスワードやその他の機密情報をコードや設定ファイルにハードコーディングしないでください。認証情報は、環境変数、Vault、またはクラウドのキー管理サービスを介して注入してください。
HTTP を HTTPS にリダイレクトする。中間者攻撃を防ぐために、すべての HTTP トラフィックを HTTPS にリダイレクトしてください。
最新の TLS プロトコルのみを使用する。SSLv3、TLSv1.0、TLSv1.1 を無効にし、TLSv1.2 と TLSv1.3 のみ有効にしてください。
証明書をモニタリングし、更新を自動化します。デプロイ後、ドメインモニタリングを有効にしてください。Certificate Management Service は、証明書の有効性を自動的にチェックし、有効期限前に更新リマインダーを送信します。設定方法については、「パブリックドメイン名モニタリングの購入と有効化」をご参照ください。
よくある質問
インストール後に HTTPS にアクセスできない、または証明書が機能しないのはなぜですか?
以下の項目を順に確認してください:
ポート 443 がブロックされている。セキュリティグループまたはファイアウォールがポート 443 でのインバウンドトラフィックを許可していません。「ステップ 3: ポート 443 を開く」をご参照ください。
ドメインの不一致。アクセスしているドメインが証明書の [バインドされたドメイン] にリストされていません。「前提条件」のドメイン一致ルールをご参照ください。
アプリケーションが再起動されていない。設定ファイルを変更した後に Spring Boot サービスが再起動されていません。「ステップ 4: アプリケーションの起動または再起動」をご参照ください。
証明書の設定が正しくない。証明書ファイルが正しく置き換えられていないか、Spring Boot 設定のパスが間違っています。設定ファイルと証明書ファイルの両方が最新で有効であることを確認してください。
上流サービスに証明書がありません。 ドメインでコンテンツデリバリーネットワーク (CDN)、Server Load Balancer (SLB)、または Web Application Firewall (WAF) を使用している場合、これらのサービスにも証明書をインストールする必要があります。詳細については、「トラフィックが複数のAlibaba Cloudサービスを通過する場合の証明書デプロイメント場所」をご参照ください。
複数サーバーへのデプロイが不完全。ご利用のドメインが複数のサーバーに解決される場合、証明書はすべてのサーバーにインストールする必要があります。
トラブルシューティングの詳細については、ブラウザのエラーメッセージに基づいて証明書のデプロイメントに関する問題を解決するおよびSSL 証明書デプロイメントのトラブルシューティングガイドをご参照ください。
Spring Boot アプリケーションで SSL 証明書を更新または置換するにはどうすればよいですか?
古いファイルのバックアップ。サーバー上の既存の証明書ファイルとパスワードファイルをバックアップします。
新しいファイルのダウンロード。Certificate Management Service コンソールから新しい証明書ファイルと秘密鍵ファイルを取得します。
ファイルの置換。新しいファイルをサーバーにアップロードし、古いファイルを上書きします。新しいファイルは、Spring Boot の設定で指定されているものとまったく同じパスとファイル名を使用する必要があります。
アプリケーションの再起動。Spring Boot を再起動して、新しい証明書を適用します。