デフォルトでは、Jetty サーバーは HTTP 経由でデータを送信するため、Web サービスがデータ漏洩やハイジャックなどのリスクにさらされます。HTTPS を有効にし、クライアントとサーバー間の通信を暗号化するには、SSL 証明書を構成します。これにより、データ送信が保護され、サーバーの ID が検証され、ユーザーの信頼が向上します。
このトピックでは、Linux と jetty-distribution-9.4.51.v20230217 を例として使用します。デプロイメントプロセスは、お使いのオペレーティングシステムや Jetty サーバーのバージョンによって異なる場合があります。問題が発生した場合は、アカウントマネージャーにお問い合わせください。
使用上の注意
開始する前に、次の要件を満たしていることを確認してください:
証明書のステータス: 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 アドレスに解決されていること。
手順
ステップ 1: SSL 証明書をダウンロードする
SSL 証明書管理ページに移動します。対象の証明書の 操作 列で、証明書のダウンロード をクリックします。次に、ダウンロード タブで、サーバータイプ が JKS の証明書をダウンロードします。
説明JKS (Java Keystore) は、Java 環境向けの独自のキーストア形式です。
展開されたファイルには、証明書ファイル (完全な証明書チェーンを含む
.jks拡張子) とパスワードファイル (jks-password.txt) が含まれています。
ステップ 2: システムとネットワーク環境を構成する
このステップでは、アプリケーションが指定されたポートでリッスンする権限を持ち、セキュリティグループとファイアウォールが外部トラフィックの到達を許可することを確認します。
サーバーターミナルで次のコマンドを実行して、ポート 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: Connected to <現在のサーバーのパブリック 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出力が
Connection to <現在のサーバーのパブリック IP アドレス> port [tcp/https] succeeded!または[<現在のサーバーのパブリック 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 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
ステップ 3: Jetty サーバーに SSL 証明書をインストールする
Jetty のベースディレクトリ (
$JETTY_BASE) を作成して移動し、その中に証明書ファイルを保存するためのcertディレクトリを作成します。重要Jetty のインストールディレクトリ (
$JETTY_HOME) とベースディレクトリ ($JETTY_BASE) を分離すると、将来のアップグレードとメンテナンスが簡素化されます。# 例: Jetty が /usr/local/jetty にインストールされ、アプリケーションと構成が /var/www/my-app にあると仮定します。 export JETTY_HOME=/usr/local/jetty export JETTY_BASE=/var/www/my-app # 証明書ファイル、Web サイトのコードリソースなどのために必要なディレクトリ構造を作成します。 mkdir -p $JETTY_BASE/cert mkdir -p $JETTY_BASE/webapps # $JETTY_BASE ディレクトリで次の操作を実行します。 cd $JETTY_BASE作成した
certディレクトリに証明書ファイルをアップロードします。説明PuTTY、Xshell、WinSCP などのリモートアクセスツールのファイルアップロード機能を使用します。Alibaba Cloud ECS を使用している場合は、「ファイルのアップロードまたはダウンロード」をご参照ください。
Jetty の
sslモジュールを有効にし、証明書情報を指定します。$JETTY_BASEディレクトリで、次のコマンドを実行してsslモジュールを初期化します。# このコマンドは、$JETTY_BASE/start.d/ ディレクトリに ssl.ini と https.ini 構成ファイルを生成します。 java -jar $JETTY_HOME/start.jar --add-to-start=ssl$JETTY_BASE/start.d/ssl.iniファイルを編集して、証明書のパスとパスワードを指定します。# 次のコマンドを実行して編集モードに入り、証明書情報を構成する準備をします。 vim $JETTY_BASE/start.d/ssl.ini次のパラメーターを見つけて変更し、
#でコメントアウトされていないことを確認します。Alibaba Cloud からダウンロードした JKS 証明書の場合、keyStorePasswordとkeyManagerPasswordに同じパスワードを使用します。# --------------------------------------- # SSL コンテキストファクトリキーストア構成 # --------------------------------------- # jetty.ssl.keystore.path は非推奨です。代わりに jetty.ssl.keyStorePath を使用してください。 jetty.ssl.keyStorePath=cert/your_domain.jks # jetty.ssl.keystore.password は非推奨です。代わりに jetty.ssl.keyStorePassword を使用してください。 jetty.ssl.keyStorePassword=[jks-password.txt ファイルのパスワード] # jetty.ssl.keymanager.password は非推奨です。代わりに jetty.ssl.keyManagerPassword を使用してください。 jetty.ssl.keyManagerPassword=[jks-password.txt ファイルのパスワード]
ステップ 4: Jetty サービスを再起動する
$JETTY_BASE ディレクトリで、Jetty サーバーを起動します。
ポート 443 は特権ポートであるため、sudo を使用してサービスを開始します。
# Jetty の作業ディレクトリに変更します。
cd $JETTY_BASE
# サービスを再起動します。
sudo java -jar $JETTY_HOME/start.jarステップ 5: インストールを検証する
Web ブラウザで HTTPS 経由でドメインにアクセスします。例:
https://yourdomain.com。yourdomain.comを実際のドメインに置き換えます。ブラウザのアドレスバーに鍵のアイコンが表示された場合、証明書は正常にデプロイされています。アクセスエラーが発生した場合や鍵のアイコンが表示されない場合は、ブラウザのキャッシュをクリアするか、シークレット (プライバシー) モードで再試行してください。

バージョン 117 以降、Chrome のアドレスバーの
アイコンは新しい
アイコンに置き換えられました。このアイコンをクリックすると、ロック情報を表示できます。

エラー 404 が表示された場合、Jetty サーバーに Web アプリケーションがないことを示します。これはサーバーの起動に失敗したことを意味するものではありません。問題が解決しない場合は、「よくある質問」のトラブルシューティングをご参照ください。
本番環境への移行
本番環境にデプロイする際は、セキュリティ、安定性、および保守性を向上させるために、以下のベストプラクティスに従ってください:
非管理者ユーザーとして実行:
アプリケーション専用の低権限のシステムユーザーを作成します。管理者権限を持つアカウントでアプリケーションを実行しないでください。
説明推奨されるアプローチは、ゲートウェイレイヤーで 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 でのトラフィックを許可していません。「システムとネットワーク環境を構成する」をご参照ください。
アクセスしているドメインが証明書の ドメイン名のバインド に含まれていません。「ドメイン名の一致」をご参照ください。
構成ファイルを変更した後に Jetty サービスを再起動していません。「Jetty サービスを再起動する」をご参照ください。
証明書ファイルが正しく置き換えられていないか、Jetty の構成が正しい証明書パスを指していません。構成と証明書ファイルが最新で有効であることを確認してください。
ドメインのトラフィックが Content Delivery Network (CDN)、SLB、Web Application Firewall (WAF) などのクラウド製品を経由しているが、そのサービスに証明書がインストールされていません。「複数の Alibaba Cloud サービスを通過する際の証明書のデプロイ場所」をご参照いただき、設定を完了してください。
ドメインの DNS が複数のサーバーに解決されているが、証明書が一部のサーバーにしかインストールされていません。各サーバーに証明書をインストールしてください。
さらなるトラブルシューティングについては、「ブラウザのエラーメッセージに基づく証明書デプロイの問題解決」および「SSL 証明書デプロイのトラブルシューティングガイド」をご参照ください。
Jetty で SSL 証明書を更新または置換するにはどうすればよいですか?
まず、サーバー上の既存の証明書ファイル (.jks および .txt) をバックアップします。次に、Certificate Management Service コンソールにログインし、新しい証明書ファイルをダウンロードして対象のサーバーにアップロードし、古いファイルを上書きします。パスとファイル名が同じであることを確認してください。最後に、Jetty サービスを再起動して新しい証明書を適用します。
起動時に「Address already in use」または「Port is already occupied」というエラーが表示されるのはなぜですか?
このエラーは、ポート 443 がすでに別のプロセスによって使用されていることを示します。sudo ss -tlnp | grep :443 または sudo lsof -i:443 コマンドを使用して、ポートを占有しているプロセスを見つけて停止します。一般的な原因には、Nginx、Apache、または正しくシャットダウンされなかったテストコマンドなどがあります。
起動時に「Permission denied」エラーが表示されるのはなぜですか?
Linux システムでは、1024 未満のポートにバインドするには root 権限が必要です。sudo を使用して Jetty を起動します。本番環境では、root ユーザーとして直接サービスを実行することは避けてください。より安全な方法は、setcap (例: sudo setcap 'cap_net_bind_service=+ep' /path/to/your/java) を使用して Java 実行可能ファイルに低番号ポートへのバインド権限を付与するか、Jetty を Nginx などのリバースプロキシの背後に配置することです。