デフォルトでは、Jetty は HTTP 経由でデータを送信するため、盗聴やセッションハイジャックなどのリスクにサービスがさらされます。SSL 証明書をインストールすると HTTPS が有効になり、クライアントとサーバー間のトラフィックが暗号化され、サーバーの ID が検証されます。
このガイドでは、Linux と jetty-distribution-9.4.51.v20230217 をサンプル環境として使用します。手順は、ご利用のオペレーティングシステムや Jetty のバージョンによって異なる場合があります。
前提条件
開始する前に、以下が準備できていることを確認してください。
信頼できる認証局によって発行された SSL 証明書。証明書の有効期限が近づいている、または切れている場合は、まず更新してください。
保護したいすべてのドメイン名をカバーする証明書です。ドメイン名を追加または変更するには、公式証明書を購入するか、バインドされたドメインを更新します。
複数レベルのサブドメインをカバーするには、[バインドされたドメイン] フィールドに完全一致のドメイン (例:
a.b.example.com) または一致するワイルドカード (例:*.b.example.com) を含める必要があります。ドメインタイプ カバー範囲 完全一致 ( example.com)指定されたドメインのみ ワイルドカード ( *.example.com)第 1 レベルのサブドメインのみ ( www.example.com、a.example.com)。ルートドメインexample.comや、a.b.example.comのような複数レベルのサブドメインはカバーしません。サーバー上の
rootアカウントまたはsudo権限を持つアカウント。ドメイン名の名前解決:ドメインの DNS レコードが設定され、サーバーのパブリック IP アドレスに解決されること。
ドメインをサーバーのパブリック IP アドレスに解決する DNS レコード。
概要
インストールは 5 つのステップで構成されます。
| ステップ | タスク |
|---|---|
| 1 | Alibaba Cloud コンソールから JKS 証明書をダウンロードする |
| 2 | セキュリティグループとサーバーのファイアウォールでポート 443 を開く |
| 3 | 証明書を使用して Jetty SSL モジュールを設定する |
| 4 | Jetty を再起動する |
| 5 | HTTPS が機能していることを確認する |
ステップ 1:SSL 証明書のダウンロード
SSL 証明書管理ページに移動します。対象の証明書の [操作] 列で、[証明書のダウンロード] をクリックします。
[ダウンロード] タブで、[サーバーの種類] として [JKS] を選択し、証明書パッケージをダウンロードします。
Java KeyStore (JKS) は、Java 環境独自のキーストア形式です。
パッケージを解凍します。パッケージには 2 つのファイルが含まれています。
.jksファイル — 完全な証明書チェーンを含む証明書ファイル。jks-password.txtファイル — キーストアパスワード。
ステップ 2:ポート 443 の開放
HTTPS トラフィックはポート 443 を使用します。クラウドのセキュリティグループとサーバーのファイアウォールの両方でこのポートを開いてください。
セキュリティグループでポート 443 を開く
サーバーが Alibaba Cloud Elastic Compute Service (ECS) で実行されている場合は、セキュリティグループにインバウンドルールを追加します。
Elastic Compute Service (ECS) インスタンスページに移動し、対象のインスタンス名をクリックします。
[セキュリティグループの詳細] セクションで、以下の設定でルールを追加して保存します。詳細については、「セキュリティグループルールを追加する」をご参照ください。
フィールド 値 アクション 許可 プロトコル カスタム TCP 宛先 (現在のインスタンス) HTTPS (443) ソース 0.0.0.0/0 (任意)
他のクラウドプラットフォームについては、それぞれのドキュメントをご参照ください。
ポート 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 を開く
まず、アクティブなファイアウォールサービスを特定します。
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:Jetty への SSL 証明書のインストール
ディレクトリ構造のセットアップ
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
cd $JETTY_BASE証明書ファイルのアップロード
「.jks」ファイルと「jks-password.txt」ファイルを、PuTTY、Xshell、または WinSCP などのファイル転送ツールを使用して、$JETTY_BASE/cert/ ディレクトリにアップロードします。サーバーが Alibaba Cloud ECS 上にある場合は、「ファイルのアップロードまたはダウンロード」を参照してください。
SSL モジュールの有効化
$JETTY_BASE ディレクトリで、次のコマンドを実行して ssl モジュールを初期化します。これにより、ssl.ini と https.ini が $JETTY_BASE/start.d/ に生成されます。
java -jar $JETTY_HOME/start.jar --add-to-start=ssl証明書パスとパスワードの設定
$JETTY_BASE/start.d/ssl.ini を編集用に開きます。
vim $JETTY_BASE/start.d/ssl.ini以下のパラメーターを見つけて更新します。いずれも # でコメントアウトされていないことを確認してください。
jetty.ssl.keyStorePath=cert/your_domain.jks
jetty.ssl.keyStorePassword=<jks-password.txt のパスワード>
jetty.ssl.keyManagerPassword=<jks-password.txt のパスワード>| パラメーター | 説明 | 例 |
|---|---|---|
jetty.ssl.keyStorePath | $JETTY_BASE から .jks ファイルへの相対パス | cert/your_domain.jks |
jetty.ssl.keyStorePassword | jks-password.txt | — |
jetty.ssl.keyManagerPassword | Alibaba Cloud JKS 証明書の場合、keyStorePassword と同じ値 | — |
古いパラメーター名jetty.ssl.keystore.path、jetty.ssl.keystore.password、jetty.ssl.keymanager.passwordは非推奨です。上記に示されているキャメルケースの名前を使用してください。
ステップ 4:Jetty の再起動
$JETTY_BASE ディレクトリから、sudo を使用して Jetty サーバーを起動します。ポート 443 は特権ポートであり、root 権限が必要です。
# Jetty の作業ディレクトリに移動します。
cd $JETTY_BASE
# サービスを開始します。
sudo java -jar $JETTY_HOME/start.jarステップ 5:インストールの確認
ブラウザを開き、
https://yourdomainにアクセスします。yourdomainを実際のドメインに置き換えてください。アドレスバーの鍵アイコンは、証明書が正しくインストールされていることを示します。アクセスエラーが表示されるか、鍵アイコンが表示されない場合は、ブラウザのキャッシュをクリアするか、シークレットモードで再試行してください。

Chrome 117 以降、
の鍵アイコンは
に置き換えられました。このアイコンをクリックすると、証明書の詳細が表示されます。

Error 404 の応答は、Jetty が正常に起動したものの、デプロイされた Web アプリケーションがないことを意味します。これは新規インストールでは想定内の動作です。
本番環境への適用
本番環境に移行する際は、セキュリティと安定性を向上させるために、以下のプラクティスを適用してください。
非 root ユーザーとして実行:アプリケーション専用の低権限のシステムアカウントを作成します。Jetty を root として実行しないでください。
推奨されるアプローチは、ゲートウェイ層で SSL を終端させることです。つまり、Server Load Balancer (SLB) や Nginx などのリバースプロキシに証明書をデプロイします。ゲートウェイが HTTPS を処理し、復号化された HTTP トラフィックを Jetty に転送します。
認証情報の外部化:設定ファイルにパスワードや機密情報をハードコーディングしないでください。環境変数、シークレットマネージャー、またはクラウドのキー管理サービスを使用して、実行時に認証情報を注入します。
HTTP から HTTPS へのリダイレクトの強制:すべての中間者攻撃を防ぐために、すべての HTTP トラフィックを HTTPS にリダイレクトします。
レガシー TLS プロトコルの無効化:サーバー設定で、SSLv3、TLS 1.0、および TLS 1.1 を無効にします。TLS 1.2 と TLS 1.3 のみを有効にしてください。
証明書のモニタリングと更新の自動化: デプロイメント後、ドメインモニタリングを有効化します。Alibaba Cloud は証明書の有効性を確認し、有効期限が切れる前に更新のリマインダーを送信するため、サービス中断が発生する前に対応できます。詳細については、「パブリックドメイン名モニタリングの購入および有効化」をご参照ください。
よくある質問
インストール後に HTTPS が機能しない
以下の項目を順に確認してください。
ポート 443 がブロックされている:セキュリティグループまたはファイアウォールがポート 443 でのインバウンドトラフィックを許可していません。「ポート 443 の開放」をご参照ください。
ドメインの不一致:アクセスしているドメインが証明書の [バインドされたドメイン] にリストされていません。ワイルドカードと完全一致のカバー範囲ルールについては、「前提条件」セクションをご参照ください。
Jetty が再起動されていない:設定の変更は再起動後にのみ有効になります。「Jetty の再起動」をご参照ください。
証明書パスまたはパスワードが間違っている:
jetty.ssl.keyStorePathが正しい.jksファイルを指していること、およびssl.iniのパスワードがjks-password.txtと一致していることを確認してください。アップストリームサービスに証明書がありません:ドメインでコンテンツデリバリーネットワーク (CDN)、Server Load Balancer (SLB)、または Web Application Firewall (WAF) を使用している場合は、これらのサービスにも証明書をインストールしてください。 詳細については、「トラフィックが複数の Alibaba Cloud サービスを通過する場合の証明書のデプロイ先」をご参照ください。
複数のサーバー:DNS が複数のサーバーに解決される場合は、すべてのサーバーに証明書をインストールしてください。
さらにトラブルシューティングを行う場合は、「ブラウザのエラーメッセージに基づく証明書のデプロイメントに関する問題の解決」および「SSL 証明書のデプロイメントに関するトラブルシューティングガイド」をご参照ください。
Jetty で SSL 証明書を置き換えるにはどうすればよいですか?
古いファイルのバックアップ:サーバーから既存の
.jksおよびjks-password.txtファイルを保存します。新しいファイルの取得:Certificate Management Service コンソールから新しい証明書をダウンロードします。
ファイルの置き換え:
ssl.iniで指定された同じパスに新しいファイルをアップロードし、古いファイルを上書きします。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 を使用して Java バイナリに特権ポートへのバインド能力を付与します。
sudo setcap 'cap_net_bind_service=+ep' /path/to/your/javaまたは、Jetty を Nginx などのリバースプロキシの背後に配置し、ポート 443 でリッスンしてトラフィックを非特権ポートに転送します。