[myserver.mydomain.com] 不受信任的 Java 信任库根证书

标签 java ssl openssl keytool truststore

我在尝试使用自定义 Java 信任库连接到服务器时遇到了一些困难,当我尝试连接时出现以下错误。我对使用 Java 通过 SSL 连接的经验很少,所以我担心我不知道会导致问题:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: root certificate not trusted of [myserver.mydomain.com]
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1341)
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153)
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
    at org.jiv

连接需要我按以下方式创建的 keystore 和信任库:

keystore :

  • 在客户端生成私钥(openssl genrsa -out mykey.key 4096)
  • 生成自签名 CSR/w 挑战密码 ( openssl req -new -key mykey.key -out mykey.csr )
  • 生成自签名证书公钥对证书 ( openssl req -x509 -days 365 -key mykey.key -in mykey.csr -out mykey.cer )
  • 从私钥 (openssl pkcs12 -export -out mykey.p12 -inkey mykey.key -in mykey.cer) 生成 PKCS12 文件
  • 将新的 PKCS12 文件添加到新的 keystore (keytool -importkeystore -srckeystore mykey.p12 -destkeystore mykeystore.jks -srcstoretype PKCS12)
  • 在从 pem 转换后将服务器的公共(public)证书添加到 keystore 中至 der ( keytool -import -alias mnt1 -keystore mykeystore.jks -file puiblicserver.der )

信任库:

  • 将来自服务器的相同公钥添加到新的信任库 (keytool -import -alias root -keystore truststore.jks -file puiblicserver.der)

我从那里将 mykey.cer 上传到服务器的受信任证书存储区。我注意到的一件事是,当我使用我的 jar 文件 ( java -Djavax.net.debug=ssl,handshake -jar myjar.jar myserver.mydomain.com User truststore.jks <PW> mykeystore.jks <PW> ) 检查连接时,服务器实际上是由 Digicert 中间证书签名的。因此,我还将来自 Digicert 的中间证书和根证书都添加到信任库(而不是 keystore )中,但这不起作用。

但是,如果我获取中间证书和根证书并在从客户端到成功连接的服务器的 openssl 连接中使用它们,这让我相信这与 java 信任库有关。


编辑:我在 java 中使用以下内容调用连接:

TLSConfiguration config = new TLSConfiguration();
    config.setHosts(hostnames);
    config.setUserName(username);
    config.setGroup(Group.EPS.value());
    config.setKeystorePath(keystoreFilename);
    config.setKeystorePassphrase(keystorePassword);
    config.setTruststorePath(truststoreFilename);
    config.setTruststorePassphrase(truststorePassword);

示例:java -Djavax.net.debug=ssl,handshake -jar myjar.jar myserver.mydomain.com User truststore.jks <PW> mykeystore.jks <PW>

最佳答案

从您的问题中并不清楚您使用的是哪个信任库。您是否使用类似的方式将自签名证书加载到默认信任库中?

keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer

如果不是,您需要告诉 Java 使用哪个信任库。如果您不这样做,它将使用默认值(其中没有您的自签名证书)。你需要这样做:

-Djavax.net.ssl.trustStore=<path to your trusstore>.jks -Djavax.net.ssl.trustStorePassword=<your password>

注意:如果您通过 -D 参数设置信任库,您的代码将只信任该信任库中的 CA。

要指定要使用的 keystore ,您可以添加这些 java 选项:

-Djavax.net.ssl.keyStore=<path to your keystore>.jks -Djavax.net.ssl.keyStorePassword=<your keystore password>

关于[myserver.mydomain.com] 不受信任的 Java 信任库根证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52447626/

相关文章:

c++ - CentOS 6.02 64 位操作系统中的 OpenSSL 构建错误

ssh - 使用 OpenSSL 生成私钥,为 SSH 生成公钥 ssh-keygen

java - java 到 python 的最新通信

java - 在 Android Things Developer Preview 5 (RPI3) 上与 UART header 通信时出现问题

ssl - Web 浏览器缓存的信息是否仍受 SSL 保护?

java - Java 6 中的客户端,用于 tls 上的 doint http post

java - Java Applet 中开箱即用的 SSL

java - 如何在 JUnit 4 中运行属于某个类别的所有测试

java - 为什么在 Kotlin 类中实现 Cloneable 接口(interface)会导致 "error: no interface expected here"?

c - openSSL mac undefined symbol