android调用上的密钥库错误版本

时间:2012-06-20 10:21:10

标签: java android certificate bouncycastle 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,但没有任何改变。

有什么想法吗?

6 个答案:

答案 0 :(得分:31)

看看Android: Trusting SSL certificates

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

在创建密钥库时使用此版本:版本1.46 found here

愿它有助于......

答案 1 :(得分:26)

无需再做所有事情!!!

您需要更改密钥库的类型,从BKS​​更改为BKS-v1(BKS-v1是BKS的旧版本)。因为BKS版本已更改为here

还有另一种解决方案,那就容易多了:

  1. 使用Portecle:

    • 下载Portecle http://portecle.sourceforge.net/
    • 使用密码和portecle
    • 打开您的bks文件
    • 执行工具>>更改密钥库类型>> BKS-v1
    • 保存文件
  2. 您可以使用KeyStore Explorer

  3. 新文件将使用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());
    

答案 2 :(得分:5)

最后,我在Windows下使用了一个图形编辑器(KeyStore Explorer),它正在运行。

可能错误是由Java / Mac版本问题引起的

答案 3 :(得分:2)

解决方案就在这里,能够删除版本问题

为Android客户端创建BKS文件

创建BKS文件所需的软件安装详细信息:

从链接http://keystore-explorer.sourceforge.net/

下载Keystore Explorer软件

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)使用密钥库软件使用CA .crt文件创建信任文件。

步骤:

打开软件
Go File-> New->从向导中选择.BKS 要导入CA证书文件Go Tool->导入可信证书 - >选择CA .crt文件 - > entert password->(如果证书是自签的话会抛出异常)强行导入文件。

4.保存扩展名为.bks的文件。

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

步骤

开放软件  Go File-> New->从向导中选择.BKS

导入> p12文件Go工具 - >导入密钥对 - >从向导中选择PKCS#12 - >输入文件和眉毛文件的描述密码 - >输入alise名称(如果想要更改,则可以保持原样) - >输入新密码

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

3)使用密钥库软件<。p12使用.P12不可用文件创建密钥文件

步骤

开放软件

Go File-&gt; New-&gt;从向导中选择.BKS 导入&gt; p12文件Go工具 - &gt;导入密钥对 - &gt;从向导中选择OpenSSL - &gt;对文件,brows .key和.crt(证书文件不是CA)文件的未经检查的描述密码 - &gt;输入alise名称(如果想要更改,则可以保持原样) - &gt;输入新密码

使用.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();
        }

    }

}

答案 4 :(得分:0)

我发布此答案以提供cmdline版本,以便将.pkcs12-File转换为keystore.bks

需要什么:

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

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

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

感谢上一篇文章,我找到了解决方案并提供了这个cmd。希望它可以帮助别人!

答案 5 :(得分:0)

使用它们。

KeyStore.getInstance( “BKS”); KeyStore.getInstance( “PKCS12”);