正在获取java.security.cert.CertificateException,但证书已导入信任库

正在获取java.security.cert.CertificateException,但证书已导入信任库,java,https,ssl-certificate,keystore,truststore,Java,Https,Ssl Certificate,Keystore,Truststore,我总是收到一封信 java.security.cert.CertificateException: No subject alternative names present 异常,但我已将证书导入到我的trusrstore。这里是我的设置: 我正在使用一个基于com.sun.net.httpserver.HttpsServer的小型HTTPS服务器。我已使用自签名证书创建密钥库: keytool -genkey -keyalg RSA -alias myCert -keystore keyst

我总是收到一封信

java.security.cert.CertificateException: No subject alternative names present
异常,但我已将证书导入到我的trusrstore。这里是我的设置:

我正在使用一个基于
com.sun.net.httpserver.HttpsServer
的小型HTTPS服务器。我已使用自签名证书创建密钥库:

keytool -genkey -keyalg RSA -alias myCert -keystore keystore.jks -storepass myPass -validity 360 -keysize 2048 
我将路径和密码作为VM参数传递给密钥库
Djavax.net.ssl.keystore=/tmp/truststore.jks
Djavax.net.ssl.keystrepassword=myPass

如果我运行openssl s_client-connect 192.168.1.101:4443,我可以看到它使用了正确的证书

为了信任客户端站点上的证书,我已从服务器密钥库导出证书,并将其导入客户端信任库:

  keytool -export -alias myCert -file myCert.crt -keystore keystore.jks
  keytool -import -trustcacerts -alias -file myCert.crt -keystore truststore.jks
对于客户端,我使用了一个使用jersey的小测试程序。我正在以VM参数
-Djavax.net.ssl.truststore=/tmp/truststore.jks

public class Tester {
    public static void main(String[] args) {

        Client client = ClientBuilder.newClient();
        try {
            String name = client.target("https://192.168.1.101:4443")
                    .request(MediaType.TEXT_PLAIN)
                    .get(String.class);

            System.out.println(name);
        } catch (final Exception e) {
            System.err.println(e);
        }
    }
}
但是,不管自签名证书在信任库中如何,我总是得到

  java.security.cert.CertificateException: No subject alternative names present
exception

原因是什么?

HTTPS证书应包含
SubjectAltName
扩展名,该扩展名的值应为IP地址(在您的情况下为192.168.1.101)或者主机的DNS名称。

当我在CN中放置一个域而不是名称,然后使用本地DNS服务器将该域解析为我的本地IP地址时,它会起作用。但在这种情况下,我不需要设置SubjectAltName。