默认情况下 Jetty 服务器通过 HTTP 传输数据,这会使 Web 服务面临信息泄露和被劫持的风险。通过为其配置 SSL 证书,可启用 HTTPS 协议,对客户端和服务器之间的通信进行加密,从而保障数据传输安全、验证服务器身份并提升用户信任。
本文以Linux操作系统、jetty-distribution-9.4.51.v20230217为例介绍,不同版本的操作系统或Jetty服务器,部署操作可能有所差异,如有问题,请联系产品技术专家进行咨询,详情请参见专家一对一服务。
适用范围
开始配置前,确保满足以下条件:
证书状态:已拥有由权威机构签发的 SSL 证书,且证书状态为已签发。若证书即将过期或已过期,需先完成续费SSL证书。
域名匹配:确保证书能够匹配所有需保护的域名,否则未匹配的域名访问 HTTPS 时将出现安全警告。如需添加或修改,请参见追加和更换域名。
精确域名:仅对指定域名生效。
example.com仅对example.com生效。www.example.com仅对www.example.com生效。
通配符域名:仅对其一级子域名生效。
*.example.com对www.example.com、a.example.com等一级子域名生效。*.example.com对根域名example.com和多级子域名a.b.example.com不生效。
说明如需匹配多级子域名,绑定域名中需包含该域名(如
a.b.example.com),或包含相应的通配符域名(如*.b.example.com)。服务器权限:需要使用
root账户或一个具有sudo权限的账户。域名备案与解析:
ICP 备案:域名已完成工信部 ICP 备案(仅适用于中国内地服务器)。
域名解析:域名已通过 A 记录解析至服务器的公网 IP。
说明可访问网络诊断分析工具,输入域名,检查 DNS 服务商解析结果和备案检查项,确保满足要求。
操作步骤
步骤一:下载SSL证书
进入SSL证书管理页面,在目标证书操作列单击更多进入证书详情页面,然后在下载页签中下载服务器类型为JKS的证书。
说明JKS是Java专用的密钥库格式,适合主要在Java环境下使用。
解压后的文件包含证书文件(
.jks后缀,且含完整证书链)和证书密码文件(jks-password.txt)。
步骤三:配置系统与网络环境
此步骤确保应用有权监听指定端口,并且安全组和防火墙允许外部流量访问。
在服务器终端执行以下命令,检测443端口的开放情况:
RHEL/CentOS
command -v nc > /dev/null 2>&1 || sudo yum install -y nc # 请将以下的 <当前服务器的公网 IP> 替换为当前服务器的公网 IP sudo ss -tlnp | grep -q ':443 ' || sudo nc -l 443 & sleep 1; nc -w 3 -vz <当前服务器的公网 IP> 443如果输出
Ncat: Connected to <当前服务器公网 IP>:443,则表明443端口已开放。否则需在安全组和防火墙中开放443端口。Debian/Ubuntu
command -v nc > /dev/null 2>&1 || sudo apt-get install -y netcat # 请将以下的 <当前服务器的公网 IP> 替换为当前服务器的公网 IP sudo ss -tlnp | grep -q ':443 ' || sudo nc -l -p 443 & sleep 1; nc -w 3 -vz <当前服务器的公网 IP> 443若输出
Connection to <当前服务器公网 IP> port [tcp/https] succeeded!或[<当前服务器公网 IP>] 443 (https) open,则表明443端口已开放。否则需在安全组和防火墙中开放443端口。在安全组配置开放443端口。
重要若您的服务器部署在云平台,请确保其安全组已开放 443 端口 (TCP),否则外部无法访问服务。以下操作以阿里云 ECS 为例,其他云平台请参考其官方文档。
进入云服务器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、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 规则在系统重启后失效,请执行以下命令持久化 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
步骤三:在Jetty服务器安装SSL证书
创建并进入 Jetty 的工作目录(
$JETTY_BASE),在Jetty的工作目录下创建一个用于存放证书的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 # 创建必要的目录结构,用于存放证书文件、网站代码资源等。 mkdir -p $JETTY_BASE/cert mkdir -p $JETTY_BASE/webapps # 后续操作建议在 $JETTY_BASE 目录中进行 cd $JETTY_BASE将证书文件上传至创建完成的cert目录。
说明您可以使用远程登录工具附带的本地文件上传功能,上传文件。例如PuTTY、Xshell或WinSCP等。如果您使用的是阿里云云服务器 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找到并修改以下参数,确保它们没有被
#注释。对于从阿里云下载的 JKS 证书,keyStorePassword和keyManagerPassword使用相同的密码。# --------------------------------------- # SSL Context Factory KeyStore Configuration # --------------------------------------- # 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文件中的密码]
步骤四:重新启动Jetty服务
在 $JETTY_BASE 目录下,启动 Jetty 服务器。
由于 443 是特权端口,需要使用 sudo 启动。
# 进入Jetty工作目录。
cd $JETTY_BASE
# 重启服务。
sudo java -jar $JETTY_HOME/start.jar步骤五:验证SSL是否安装成功
请通过 HTTPS 访问您已绑定证书的域名(如
https://yourdomain.com,yourdomain.com需替换为实际域名)。若浏览器地址栏显示安全锁图标,说明证书已成功部署。如访问异常或未显示安全锁,请先清除浏览器缓存或使用无痕(隐私)模式重试。

Chrome 浏览器自 117 版本起,地址栏中的
已被新的
替代,需单击该图标后查看安全锁信息。

如果出现Error 404,表示您的Jetty服务器没有Web应用,并非Jetty服务器未启动成功。如仍有问题,请参考常见问题进行排查。
应用于生产环境
在生产环境部署时,遵循以下最佳实践可提升安全性、稳定性和可维护性:
使用非管理员权限用户运行:
为应用创建专用的、低权限的系统用户,切勿使用拥有管理员权限的账户运行应用。
说明建议使用网关层配置 SSL的方案,即将证书部署在负载均衡SLB或Nginx等反向代理上,由其终结 HTTPS 流量,再将解密后的 HTTP 流量转发到后端应用。
凭证外部化管理:
切勿将密码等敏感信息硬编码在代码或配置文件中。使用环境变量、Vault 或云服务商提供的密钥管理服务来注入凭证。
启用 HTTP 到 HTTPS 强制跳转:
确保所有通过 HTTP 访问的流量都被自动重定向到 HTTPS,防止中间人攻击。
配置现代 TLS 协议:
在服务器配置中禁用老旧且不安全的协议(如 SSLv3, TLSv1.0, TLSv1.1),仅启用 TLSv1.2 和 TLSv1.3。
证书监控与自动续期:
建议在证书部署完成后,为域名开启域名监控功能。阿里云将自动检测证书有效期,并在证书到期前发送提醒,帮助您及时续期,避免服务中断。具体操作请参见购买并开启公网域名监控。
常见问题
安装或更新证书后,证书未生效或 HTTPS 无法访问
常见原因如下:
域名未完成备案。请参见ICP备案流程。
服务器安全组或防火墙未开放 443 端口。请参见配置系统与网络环境。
证书的绑定域名未包含当前访问的域名。请参见域名匹配。
修改 Jetty 配置文件后,未重启Jetty服务。具体操作可参见重新启动Jetty服务。
证书文件未正确替换,或 Jetty 配置未正确指定证书路径。请检查 Jetty 配置文件和所用证书文件是否为最新且有效。
域名已接入 CDN、SLB 或 WAF 等云产品,但未在相应产品中安装证书。请参阅流量经过多个云产品时证书的部署位置完成相关操作。
当前域名的 DNS 解析指向多台服务器,但证书仅在部分服务器上安装。需分别在每个服务器中安装证书。
如需进一步排查,请参考:根据浏览器错误提示解决证书部署问题 和 SSL证书部署故障自助排查指南。
如何更新(替换)Jetty 中已安装的 SSL 证书
请先备份服务器上原有的证书文件(.jks,以及.txt文件),然后登录数字证书管理服务控制台,下载新的证书文件,并上传到目标服务器覆盖原有文件(确保路径和文件名一致)。最后,重启Jetty服务,使新证书生效。
启动时报错:“Address already in use”或“端口已被占用”?
这表示 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)之后。