デフォルトでは、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 レコード。
ステップ 1: SSL 証明書のダウンロード
SSL 証明書管理 ページに移動します。対象の証明書の [操作] 列で、もっと をクリックして証明書の詳細ページに移動します。[ダウンロード] タブで、[サーバータイプ] を [JKS] に設定して証明書をダウンロードします。
Java KeyStore (JKS) は、Java 環境独自のキーストアフォーマットです。
パッケージを解凍します。パッケージには、
.jksファイル (完全な証明書チェーンを含む証明書ファイル) とjks-password.txtファイル (キーストアパスワード) が含まれています。
ステップ 2: システムとネットワーク環境の設定
このステップでは、アプリケーションが指定されたポートでリッスンでき、セキュリティグループとファイアウォールが外部トラフィックを許可するようにします。
セキュリティグループでポート 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証明書ファイルのアップロード
PuTTY、Xshell、WinSCP などのファイル転送ツールを使用して、.jks ファイルと jks-password.txt を $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 でのインバウンドトラフィックを許可していません。「ステップ 2: システムとネットワーク環境の設定」をご参照ください。
ドメインの不一致: アクセスしているドメインが、証明書の[バインドされたドメイン]に含まれていません。ワイルドカードおよび完全一致のカバレッジルールについては、前提条件のセクションをご参照ください。
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または、ポート 443 でリッスンし、非特権ポートにトラフィックを転送する Nginx などのリバースプロキシの背後に Jetty を配置します。