返回

Java 中使用 OpenSSL 获取服务器证书:详尽指南

Linux

通过 OpenSSL 获取服务器证书

前言

在 Java 应用程序中,获取远程服务器的证书对于建立安全连接至关重要。本文将提供一个详尽的指南,教你使用 OpenSSL 命令行实用程序提取服务器证书,并解决沿途可能遇到的常见错误。

问题:获取服务器证书时遇到错误

你在尝试使用以下命令获取服务器证书时遇到了错误:

openssl s_client -connect host.host:9999

你收到了以下错误消息:

depth=1 /C=NZ/ST=Test State or Province/O=Organization Name/OU=Organizational Unit Name/CN=Test CA
verify error:num=19:self signed certificate in certificate chain
verify return:0
23177:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1086:SSL alert number 40
23177:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:

解决方法

步骤 1:验证服务器证书链

错误消息表明服务器提供了自签名证书。自签名证书通常用于内部测试和开发,但不适用于生产环境。你需要验证服务器证书链并确保其可信。

步骤 2:检查 CA 证书路径

-CApath 标志用于指定包含受信任的证书颁发机构 (CA) 证书的目录路径。检查你的路径是否正确,并确保它包含颁发服务器证书的 CA 证书。

步骤 3:验证服务器名称

确保你连接到的服务器主机名与证书中指定的通用名称 (CN) 匹配。如果主机名不匹配,你将收到 "SSL alert number 40" 错误。

步骤 4:使用 -noverify 选项

如果无法验证服务器证书链,你可以使用 -noverify 选项来绕过证书验证。这会产生安全风险,因此仅在必要时使用此选项。

步骤指南:获取服务器证书

  1. 打开命令行终端。
  2. 导航到要保存证书的文件目录。
  3. 运行以下命令(根据需要修改主机名和端口):
openssl s_client -connect host.host:9999 -showcerts -CApath /etc/ssl/certs/ -noverify > server.crt

此命令将获取服务器证书并将其保存到 "server.crt" 文件中。

将证书添加到 Java 密钥库

一旦你获取了服务器证书,你可以将其添加到 Java 密钥库中,以便在应用程序中使用:

import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

public class AddCertificateToKeyStore {

    public static void main(String[] args) throws Exception {
        // 加载密钥库
        KeyStore keyStore = KeyStore.getInstance("JKS");
        keyStore.load(new FileInputStream("my-keystore.jks"), "password".toCharArray());

        // 加载服务器证书
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        X509Certificate certificate = (X509Certificate) cf.generateCertificate(new FileInputStream("server.crt"));

        // 添加证书到密钥库
        keyStore.setCertificateEntry("server-cert", certificate);

        // 保存密钥库
        keyStore.store(new FileOutputStream("my-keystore.jks"), "password".toCharArray());
    }
}

常见问题解答

**1. 我收到了 "depth=1 /C=NZ/ST=Test State or Province/O=Organization Name/OU=Organizational Unit Name/CN=Test CA" 错误。这是什么意思?**

这意味着服务器提供了自签名证书,该证书不受任何可信的 CA 信任。

2. 我在使用 -noverify 选项时收到 "SSL alert number 40" 错误。这是怎么回事?

这是因为你指定的服务器主机名与证书中的通用名称不匹配。

3. 我在哪里可以找到我的 CA 证书?

CA 证书通常安装在服务器操作系统或应用程序服务器上。你可以检查文档或联系系统管理员以获取证书路径。

4. 我如何验证服务器证书是否可信?

可以使用证书验证工具或浏览器的开发者工具来检查证书是否由可信的 CA 颁发。

5. 我如何避免 SSL/TLS 连接中的证书错误?

验证证书链、确保主机名与证书匹配,并根据需要更新你的应用程序中的信任存储。