我想发一个https请求.
我使用bouncycastle来生成这样的密钥库:
keytool -importcert -trustcacerts -alias ludevCA -file lu_dev_cert.crt -keypass mypass -keystore keystore.bks -storepass mypass -storetype BKS -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov-jdk15on-146.jar
Run Code Online (Sandbox Code Playgroud)
并且keylist命令返回正确的值.
但当我这样做时:
KeyStore ks = KeyStore.getInstance("BKS");
InputStream in = getResources().openRawResource(R.raw.keystore);
ks.load(in, "mypass".toCharArray());
Run Code Online (Sandbox Code Playgroud)
我有一个错误:
wrong version of keystore
Run Code Online (Sandbox Code Playgroud)
我尝试使用多个版本的bouncycast,但结果是一样的.我也尝试定义keysize 1024,但没有任何改变.
有任何想法吗 ?
我正在尝试与证书设置为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();
Run Code Online (Sandbox Code Playgroud)
就目前而言,这会javax.net.ssl.SSLHandshakeException: org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate signature.在getOutputStream()被召唤时抛出.
此相同的站点和证书在HTC Web浏览器和桌面浏览器中有效.当我使用相同的代码访问Google时,它可以工作(但随后会抱怨404错误).StackOverflow上的各种帖子暗示它应该"正常工作"而其他人说要设置自己的密钥库(或禁用所有HTTPS验证!)我假设行为的差异归结为使用中的不同根密钥库(任何人都可以澄清这一点?).
我现在尝试使用充气城堡创建一个密钥库,但我无法将其加载到我的设备上.
从Firefox导出证书后,我使用以下方法创建密钥库:
keytool.exe -import -alias onlinescoutmanager -file www.onlinescoutmanager.co.uk.crt -storetype BKS -keystore res\raw\keystore
Run Code Online (Sandbox Code Playgroud)
然后使用以下命令加载并在应用程序中使用:
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"); …Run Code Online (Sandbox Code Playgroud) 我在使用SSL时遇到问题,因为我收到了与我的密钥库相关的以下错误(使用keytool自行创建和自签名:http://developer.android.com/tools/publishing/app-signing.html) :
08-14 20:55:23.044:W/System.err(5430):java.io.IOException:密钥库的错误版本.08-14 20:55:23.060:W/System.err(5430):at org.bouncycastle.jce.provider.JDKKeyStore.engineLoad(JDKKeyStore.java:812)...
JDKKeyStore.java类中引发的错误出现在以下代码中:
来自JDKKeyStore.java的Blockquote:
if(version!= STORE_VERSION){if(version!= 0){throw new IOException("key store的错误版本."); }}大段引用
在这种情况下,STORE_VERSION = 1,我的版本= 3基于读取我创建的密钥库所持有的证书的详细信息.我不知道如何生成包含version = 1证书的密钥库.
我发现这个答案很有帮助: 在进行https调用时错误的版本密钥库
但是它要求使用以下参数创建密钥库:
-storetype BKS
-provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath
/path/to/bouncycastle.jar
但是,当我尝试使用以下参数创建keytool(使用Mac上的终端应用程序)时:
keytool -genkeypair -v -alias androiddebugkey -keyalg RSA -keysize 2048 -validity 10000 -keypass android -keystore /Users/djames/dropbox/bc146keystore/debug.keystore -storepass android -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath /用户/ djames /保管箱/ bc146keystore /
(其中/ Users/djames/dropbox/bc146keystore /是充气城堡罐子的路径:bcprov-jdk16-146.jar)
我收到以下错误:
keytool错误:java.lang.RuntimeException:用法错误,?providerpath不是合法命令java.lang.RuntimeException:用法错误,?providerpath不是sun.security.tools.KeyTool.parseArgs的合法命令(KeyTool.java: 375)sun.security.tools.KeyTool.run(KeyTool.java:171)at sun.security.tools.KeyTool.main(KeyTool.java:166)
我不明白这告诉我的是什么.如果我使用:keytool -help它告诉我以下是-genkeypair选项的有效选项:
-genkeypair [-v] [-protected] [-alias] [-keyalg] [-keysize] [-sigalg] [-dname] [-validity] …