温馨提示×

Java在Ubuntu上如何配置SSL

小樊
33
2025-12-20 12:07:24
栏目: 云计算

在 Ubuntu 上为 Java 配置 SSL 的实用步骤

一 准备与定位 Java 环境

  • 确认 Java 安装路径与版本:
    • 查看版本:java -version
    • 查找 JDK 路径:readlink -f $(which java)(通常位于 /usr/lib/jvm/ 下)
  • 记住 Java 信任库位置(JRE 内置):$JAVA_HOME/jre/lib/security/cacerts,默认密码为 changeit。后续导入或更新证书会用到该路径与密码。

二 场景一 让 Java 程序信任某个 HTTPS 站点证书

  • 导出目标站点的证书(PEM 格式):
    • 命令:echo | openssl s_client -servername 域名 -connect 域名:443 2>/dev/null | openssl x509 -outform PEM > 域名.pem
  • 将证书导入 Java 信任库:
    • 命令:keytool -importcert -alias 域名 -file 域名.pem -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit
    • 出现提示时输入 yes 确认信任
  • 验证导入结果:
    • 命令:keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts -alias 域名
  • 说明:
    • 若系统存在多个 JDK/JRE,需对每个 $JAVA_HOME 重复导入
    • 也可将证书加入系统 CA 信任库(见文末“补充”),但这不会自动更新 Java 的 cacerts

三 场景二 为 Tomcat 启用 HTTPS(服务端证书)

  • 准备证书与密钥(以服务商提供的 certificate.crt / ca_bundle.crt / private.key 为例)
    • 生成 PKCS12 文件(包含完整链):
      • 命令:openssl pkcs12 -export -in certificate.crt -inkey private.key -out keystore.p12 -name tomcat -cafile ca_bundle.crt -caname root -chain
  • 配置 Tomcat 的 server.xml(推荐直接使用 PKCS12,无需再转 JKS):
    • 示例:
      <Connector port="8443"
                 protocol="org.apache.coyote.http11.Http11NioProtocol"
                 SSLEnabled="true"
                 maxThreads="150"
                 scheme="https"
                 secure="true"
                 clientAuth="false"
                 sslProtocol="TLS"
                 keystoreFile="/opt/tomcat/conf/keystore.p12"
                 keystorePass="你的导出密码"
                 keystoreType="PKCS12"
                 keyAlias="tomcat" />
      
    • 说明:
      • 现代 Java 已原生支持 PKCS12,无需再转换为 JKS
      • 如需双向认证,设置 clientAuth=“true” 并配置信任库
  • 可选:将证书同时导入系统 CA(便于本机工具如 curl 等信任)
    • Debian/Ubuntu:sudo cp 域名.crt /usr/local/share/ca-certificates/ && sudo update-ca-certificates
    • RHEL/CentOS:sudo cp 域名.crt /etc/pki/ca-trust/source/anchors/ && sudo update-ca-trust

四 常见问题与排查

  • 报错 PKIX path building failed / unable to find valid certification path to requested target
    • 原因:服务器证书链不完整或 Java 信任库缺少对应根/中间证书
    • 解决:
      • 使用包含链的文件生成 PKCS12(带上 -cafile ca_bundle.crt -chain
      • 将站点证书导入 $JAVA_HOME/jre/lib/security/cacerts
      • 必要时同时更新系统 CA 信任库并重启 Java 进程
  • 证书已导入仍不生效
    • 确认证书已导入到实际运行的 JDK/JREcacerts
    • 检查证书 alias 是否一致、证书是否过期
    • 重启应用或 Tomcat 使配置生效

五 补充 开发与测试用的自签名证书

  • 生成自签名证书(含 SAN,适用于 localhost 等)
    • 生成 CA:openssl genrsa -des3 -out myCA.key 2048openssl req -x509 -new -nodes -key myCA.key -sha256 -days 7300 -out myCA.crt
    • 生成服务器私钥与 CSR:openssl genrsa -out localhost.key 2048openssl req -new -key localhost.key -out localhost.csr
    • 配置 SAN(cert.ext):
      authorityKeyIdentifier=keyid,issuer
      basicConstraints=CA:FALSE
      keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
      subjectAltName = @alt_names
      [alt_names]
      DNS.1 = localhost
      IP.1 = 127.0.0.1
      
    • 签发证书:openssl x509 -req -in localhost.csr -out localhost.crt -days 3650 -CA myCA.crt -CAkey myCA.key -CAcreateserial -extfile cert.ext
    • 验证:openssl verify -CAfile myCA.crt localhost.crt
    • 转换为 PKCS12:openssl pkcs12 -export -in localhost.crt -inkey localhost.key -out server.p12
    • 在 Tomcat 中使用该 server.p12(与场景二相同方式配置)。

0