android调用keystore版本错误

我想做一个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 

而keylist命令返回一个正确的值。

但是,当我这样做:

 KeyStore ks = KeyStore.getInstance("BKS"); InputStream in = getResources().openRawResource(R.raw.keystore); ks.load(in, "mypass".toCharArray()); 

我有一个错误:

 wrong version of keystore 

我试图使用几个版本的bouncycast,但结果是一样的。 我也试图定义keysize 1024,但没有任何改变。

有任何想法吗 ?

Solutions Collecting From Web of "android调用keystore版本错误"

看一下Android:信任SSL证书

  -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath /path/to/bouncycastle.jar 

创build密钥库时使用这个版本:版本1.46 在这里find

愿它帮助…

没有必要再做所有的事情!

您需要更改密钥库的types,从BKS​​到BKS-v1(BKS-v1是BKS的旧版本)。 因为这里说的BKS版本改变了

还有另外一个解决scheme,要容易得多:

  1. 使用Portecle:

  2. 您可以使用KeyStore Explorer

新文件将用BKS-v1编码,不会再显示错误….

注意: Android可以使用不同的BKS版本:例如,API 15将需要BKS-1,与需要BKS的API 23相反,因此您可能需要将这两个文件放在您的应用程序中。

注2:您可以使用此代码:

 int bks_version; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { bks_version = R.raw.publickey; //The BKS file } else { bks_version = R.raw.publickey_v1; //The BKS (v-1) file } KeyStore ks = KeyStore.getInstance("BKS"); InputStream in = getResources().openRawResource(bks_version); ks.load(in, "mypass".toCharArray()); 

最后,我在Windows下使用了一个graphics编辑器(KeyStore Explorer),它正在工作。

也许错误是由Java / Mac版本问题引起的

解决scheme是在这里,能够删除版本问题

为Android客户端创buildBKS文件

创buildBKS文件所需的软件安装细节:

从链接下载Keystore Explorer软件http://keystore-explorer.sourceforge.net/

http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html下载UnlimitedJCEPolicyJDK7

提取zip并将US_export_policy和local_policy复制到C:/ programes文件/ java / jre7 / lib / security文件夹中。

安装Keystore Explorer软件。

生成BKS文件的步骤:(需要CA文件,证书文件,密钥文件和.P12 iePKCS文件(如果可用)。

1)使用keystore软件使用CA.crt文件创buildTrust文件。

脚步:

打开软件
Go File→New->select.BKS从导入CA证书文件转到工具 – >导入可信证书 – >selectCA.crt文件 – > entert密码 – >(如果证书是自签名的,它会抛出一个exception)强制导入文件。

4.使用.bks扩展名保存文件。

2)使用密钥库软件使用.P12文件创build密钥文件

脚步

打开软件转到文件 – >新build – >从向导中select.BKS

导入> p12文件转到工具 – >导入密钥对 – >从向导中selectPKCS#12 – >input文件和眉毛文件的密码 – >inputalise名称(如果想改变其他可以保持原样) – >input新密码

用.bks扩展名保存文件。

3)使用密钥库软件,如果.P12不可用,则创build密钥文件

脚步

打开软件

Go File→New→从向导中select.BKS导入> p12文件转到工具 – >导入密钥对 – >从向导中selectOpenSSL – >未选中的文件密码,眉毛.key和.crt(证书文件不是CA)文件 – >inputalise名称(如果想更改其他可以保持原样) – >input新的密码

用.bks扩展名保存文件。

复制res / raw文件夹中的两个文件(两个BKS文件都是强制的)。

码:

  static final String ENABLED_CIPHERS[] = { "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", "TLS_DHE_RSA_WITH_AES_256_CBC_SHA", "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_RC4_128_SHA", "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", "TLS_RSA_WITH_AES_256_CBC_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA", "SSL_RSA_WITH_3DES_EDE_CBC_SHA", "SSL_RSA_WITH_RC4_128_SHA", "SSL_RSA_WITH_RC4_128_MD5", }; // put this in a place where it can be reused static final String ENABLED_PROTOCOLS[] = { "TLSv1.2", "TLSv1.1", "TLSv1" }; private void sslCon() { try { // setup truststore to provide trust for the server certificate // load truststore certificate InputStream trustStoresIs = getResources().openRawResource(R.raw.client_ca); String trustStoreType = KeyStore.getDefaultType(); KeyStore trustStore = KeyStore.getInstance(trustStoreType); trustStore.load(trustStoresIs, "spsoft_123".toCharArray()); //keyStore.setCertificateEntry("ca", ca); // initialize trust manager factory with the read truststore String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); tmf.init(trustStore); // setup client certificate // load client certificate InputStream keyStoreStream = getResources().openRawResource(R.raw.client_cert_key); KeyStore keyStore = null; keyStore = KeyStore.getInstance("BKS"); keyStore.load(keyStoreStream, "your password".toCharArray()); KeyManagerFactory keyManagerFactory = null; keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); keyManagerFactory.init(keyStore, "your password".toCharArray()); // Create an SSLContext that uses our TrustManager SSLContext context = SSLContext.getInstance("SSL"); context.init(keyManagerFactory.getKeyManagers(), tmf.getTrustManagers(), null); SSLSocketFactory sslsocketfactory = (SSLSocketFactory)context.getSocketFactory(); InetAddress serverAddr = InetAddress.getByName("192.168.11.104"); sslSocket = (SSLSocket) sslsocketfactory.createSocket(serverAddr, 5212); //String[] ciphers = sslSocket.getEnabledCipherSuites(); sslSocket.setEnabledCipherSuites(ENABLED_CIPHERS); // put this right before setEnabledCipherSuites()! //sslSocket.setEnabledProtocols(ENABLED_PROTOCOLS); //InputStream inputStream = sslSocket.getInputStream(); OutputStream out = sslSocket.getOutputStream(); Toast.makeText(getApplicationContext(), "Connected", Toast.LENGTH_SHORT).show(); sslSocket.close(); } catch (KeyManagementException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (CertificateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (KeyStoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnrecoverableKeyException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 

我发布这个答案来提供一个cmdline版本用于将.pkcs12文件转换为keystore.bks

需要什么:

如果您不知道如何生成.PKCS12文件,请查看这些网站:

对于此示例,我使用jetty.pkcs12作为源。 该命令生成:keystore.bks /usr/local/share/java/portecle-1.9/是我安装了下载的Portecle-Tool(.ZIP)的path,

 keytool -importkeystore -srckeystore jetty.pkcs12 \ -srcstoretype PKCS12 -deststoretype BKS -providerpath \ /usr/local/share/java/portecle-1.9/bcprov.jar -provider \ org.bouncycastle.jce.provider.BouncyCastleProvider-destkeystore \ keystore.bks 

现在,您可以使用Android下的BKS-Keystore

感谢prev发布,我能find一个解决scheme,并提供此cmd。 希望它可以帮助别人!