我试图创建一个HTTPS连接到一个证书将在2013年四月过期,使用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();
目前情况是,当调用getOutputStream()
时,会抛出javax.net.ssl.SSLHandshakeException: org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate signature.
的异常。
相同的网站和证书在原装HTC网络浏览器和桌面浏览器中有效。当我使用相同的代码访问Google时,它可以正常工作(但然后会抱怨404错误)。StackOverflow上的各种帖子暗示它应该“只是工作”,而其他人则建议设置自己的密钥库(或禁用所有HTTPS验证!)我假设行为上的差异归因于使用的不同根密钥库(有人可以澄清一下吗?)。
我现在尝试使用Bouncy Castle创建密钥库,但无法在我的设备上加载它。
从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();
在调用keystore.Load()
时,出现了java.io.IOException: Wrong version of key store.
的错误。
我已经确保传递了-storetype BKS
,使用了长度小于等于7个字符的密钥库密码,将CA证书添加到了密钥库中,并且使用Bouncy Castle版本1.45和1.47创建了密钥库,但报告的错误消息没有改变。
我的开发环境是运行在Windows 8上的Eclipse Juno 4.2.1,使用JRE 1.7u9b5。我正在测试的设备是一台运行原生Android 2.3的HTC Sensation手机。该应用程序的最低SDK版本为7,目标版本为15。
如果有人能够解释如何在Windows 8上创建有效的BKS密钥库,或者如何让Java使用与浏览器(或系统?)相同的密钥库,那将不胜感激。