2014-03-24 22 views
0

我总是收到一个获取java.security.cert.CertificateException,但该证书导入到信任

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.jksDjavax.net.ssl.keyStorePassword=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 

对于客户端我用用球衣一个小的测试程序。我传递的路径,作为信任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 

可能是什么原因?

回答

0

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

+0

这似乎也没有工作 – markus

+0

它的工作原理是,当我把一个域名而不是名称,然后使用本地DNS服务器将域解析为我的本地IP地址。但在这种情况下,我不需要设置SubjectAltName。 – markus