客户端证书身份验证代码在java7中工作,而不是在java8中工作

客户端证书身份验证代码在java7中工作,而不是在java8中工作,java,java-8,ssl-certificate,rsa,client-certificates,Java,Java 8,Ssl Certificate,Rsa,Client Certificates,我已经编写了下面的代码来使用客户端证书身份验证连接到服务器 public void login() { try { KeyStore ks = KeyStore.getInstance("Windows-MY", "SunMSCAPI"); ks.load(null, null); String kalg = KeyManagerFactory.getDefaultAlgorithm(); System.out.pr

我已经编写了下面的代码来使用客户端证书身份验证连接到服务器

public void login()
    {
    try {
        KeyStore ks = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
        ks.load(null, null);
        String kalg = KeyManagerFactory.getDefaultAlgorithm();
        System.out.println(kalg);
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(kalg);
        kmf.init(ks, null);
        String talg = TrustManagerFactory.getDefaultAlgorithm();
        System.out.println(talg);
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(talg);
        KeyStore ts;
        ts = KeyStore.getInstance("Windows-ROOT", "SunMSCAPI");

        ts.load(null, null);
        tmf.init(ts);
        TrustManager tm[] = tmf.getTrustManagers();
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(kmf.getKeyManagers(), tm, new java.security.SecureRandom());
        HttpsURLConnection
            .setDefaultSSLSocketFactory(sc.getSocketFactory());
        URL url = new URL("https://xxxxxx/");
        HttpsURLConnection httpsCon = (HttpsURLConnection) url
            .openConnection();
        InputStream is = httpsCon.getInputStream();
        httpsCon.getHeaderFields();
        String str =httpsCon.getHeaderField("Set-Cookie");
        System.out.println(httpsCon.getResponseMessage());
        int c;
        StringBuffer sb = new StringBuffer();
        while ((c = is.read()) >= 0) {
        System.out.print((char)c);
        sb.append((char) c);
        }
        is.close();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    }
出于测试目的,我创建了自签名服务器和客户端证书

此代码仅适用于java 7,在java 8中引发异常:

java.security.InvalidKeyException:未安装提供程序支持 此密钥:sun.security.mscapi.RSAPrivateKey


这与java 8中引入的某些功能有关吗?

是否安装了java加密扩展(JCE)Unlimited Strength?否。。我将在JCE中做一些研究..在代码中添加解释。为什么这个代码会工作?OP的代码中有什么问题?
public static void login()
{
try {
    KeyStore ks = KeyStore.getInstance("Windows-MY");
    ks.load(null, null);
    String kalg = KeyManagerFactory.getDefaultAlgorithm();
    System.out.println(kalg);
    KeyManagerFactory kmf = KeyManagerFactory.getInstance(kalg);
    kmf.init(ks, null);
    String talg = TrustManagerFactory.getDefaultAlgorithm();
    System.out.println(talg);
    final TrustManager[] trustAllCerts = new TrustManager[] { new       X509TrustManager() {
        @Override
        public void checkClientTrusted(final X509Certificate[] chain,
                final String authType) {
        }

        @Override
        public void checkServerTrusted(final X509Certificate[] chain,
                final String authType) {
        }

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    } };


    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(kmf.getKeyManagers(), trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection
        .setDefaultSSLSocketFactory(sc.getSocketFactory());
    URL url = new URL("xxxxx");
    HttpsURLConnection httpsCon = (HttpsURLConnection) url
        .openConnection();
    InputStream is = httpsCon.getInputStream();
    httpsCon.getHeaderFields();
    String str =httpsCon.getHeaderField("Set-Cookie");
    System.out.println(httpsCon.getResponseMessage());
    int c;
    StringBuffer sb = new StringBuffer();
    while ((c = is.read()) >= 0) {
    System.out.print((char)c);
    sb.append((char) c);
    }
    is.close();
} catch (Exception ex) {
    ex.printStackTrace();
}
}