我们有一个密集的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();
}
如果我需要提供任何进一步的细节,请告诉我