使用具有不可导出私钥的证书进行SSL客户端身份验证

时间:2017-06-13 13:47:21

标签: java ssl jsse

我们有一个密集的Java客户端,并进行SSL服务器和客户端身份验证。

此方案适用于Mac OS。

我们的用户获得具有不可导出私钥的证书。

现在,如果我想进行SSL客户端身份验证,则此证书将失败。下面是我正在使用的代码片段来创建密钥存储区(与我有证书别名),我创建了KeyManager,然后传递给SSLContext。

    KeyStore systemKeyStore = KeyStore.getInstance("KEYCHAINSTORE");
    systemKeyStore.load(null, null);

    resultKeyStore = KeyStore.getInstance("JKS");
    resultKeyStore.load(null, null);

    if (certalias != null && !certalias.trim().equals("") && systemKeyStore.containsAlias(certalias) && systemKeyStore.isKeyEntry(certalias)) {

        try {
            Key key = systemKeyStore.getKey(certalias, "t".toCharArray());
            Certificate certs[] = systemKeyStore.getCertificateChain(certalias);
            resultKeyStore.setKeyEntry(certalias, key, "randompw".toCharArray(), certs);
        } catch (Exception e) {
            }

这条线 Key key = systemKeyStore.getKey(certalias, "t".toCharArray()); fails as it返回的密钥对象为null

问题是,是否可以使用标记为不可导出的私钥的证书进行SSL客户端身份验证?

更新 正如我在下面的一条评论中提到的那样。我尝试通过传递SSL系统属性来使用默认的SSL上下文属性。但它仍然没有用。以下是我的代码

System.setProperty("javax.net.ssl.trustStore", "cacerts.jks");
    System.setProperty("javax.net.ssl.keyStoreType", "KEYCHAINSTORE");

    System.setProperty("javax.net.ssl.keyStore", "KEYCHAINSTORE");



    if (socketFactory == null) {
        // socketFactory = initializeSocketFactory(Settings.isCertificateAuth(), Settings.getClientCertAlias());
        socketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
    }

如果我需要提供任何进一步的细节,请告诉我

0 个答案:

没有答案
相关问题