使用 URL.openConnection() 建立 HTTPS 连接
我正在尝试与证书设置为 2013 年 4 月到期的服务器建立 HTTPS 连接,并使用 GlobalSign 作为根证书。
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()
我已确保我正在传递 -store 类型 BKS
,使用 <=7 个字符的密钥库密码,将 CA 证书添加到密钥存储,并使用 Bouncy Castle 版本 1.45 和 1.47 来创建密钥存储,报告的错误消息没有变化。
我的环境是Eclipse Juno 4.2.1,JRE 1.7u9b5运行在Windows 8上。我正在测试的设备是运行Android 2.3的HTC感觉。该应用程序的最低 SDK 版本为 7,目标为 15。
如果有人可以解释如何在Windows 8上创建有效的BKS密钥存储,或者我如何让Java使用与浏览器(或系统?)相同的密钥存储,那将不胜感激。