我正在尝试与证书设置为 2013 年 4 月到期并使用 GlobalSign 作为根证书的服务器建立 HTTPS 连接。
HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
// urlConnection.setSSLSocketFactory(sslSocketFactory);
urlConnection.setDoOutput(true);
urlConnection.setChunkedStreamingMode(0);
// Send the POST data
OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
out.write(postParamString.toString().getBytes("UTF8"));
// Read the reply
InputStream in = urlConnection.getInputStream();
javax.net.ssl.SSLHandshakeException: org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate signature.
就目前而言,这在getOutputStream()
被调用时抛出。
此相同站点和证书在股票 HTC 网络浏览器和桌面浏览器中有效。当我使用相同的代码访问Google时,它可以工作(但随后抱怨 404 错误)。StackOverflow 上的各种帖子暗示它应该“正常工作”,其他人说设置自己的密钥存储(或禁用所有 HTTPS 验证!)我认为行为差异取决于使用的不同根密钥存储(谁能澄清这一点?)。
我现在尝试使用充气城堡创建密钥存储,但无法将其加载到我的设备上。
从 Firefox 导出证书后,我使用以下命令创建密钥库:
keytool.exe -import -alias onlinescoutmanager -file www.onlinescoutmanager.co.uk.crt -storetype BKS -keystore res\raw\keystore
然后使用以下方法在应用程序中加载和使用它:
InputStream stream = context.getResources().openRawResource(R.raw.keystore);
// BKS seems to be the default but we want to be explicit
KeyStore ks = KeyStore.getInstance("BKS");
ks.load(stream, "www.onlinescoutmanager.co.uk".toCharArray());
stream.close();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];
SSLContext context2 = SSLContext.getInstance("TLS");
context2.init(null, new TrustManager[] { defaultTrustManager }, null);
sslSocketFactory = context2.getSocketFactory();
java.io.IOException: Wrong version of key store.
这在何时keystore.Load()
被调用时失败。
我已确保通过-storetype BKS
,使用 <=7 字符密钥库密码,将 CA 证书添加到密钥库,并使用 Bouncy Castle 版本 1.45 和 1.47 创建密钥库,报告的错误消息没有变化。
我的环境是在 Windows 8 上运行 JRE 1.7u9b5 的 Eclipse Juno 4.2.1。我正在测试的设备是运行股票 Android 2.3 的 HTC 感觉。该应用程序的最低 SDK 版本为 7,目标为 15。
如果有人能解释如何在 Windows 8 上创建有效的 BKS 密钥库,或者我如何让 Java 使用与浏览器(或系统?)相同的密钥库,那将不胜感激。
您可以下载撰写本文时的整个项目,如果需要,还可以下载生成的密钥库。