Android上的通话密钥库的版本错误Android上的通话密钥库的版本错误(Wrong versi

2019-06-02 14:04发布

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

和密钥列表命令返回正确的值。

但是当我做:

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

我有一个错误:

wrong version of keystore

我试图用bouncycast的几个版本,但结果是一样的。 我也试图定义密钥长度1024,但没有任何变化。

有任何想法吗 ?

Answer 1:

看看它的Android版本:信任的SSL证书

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

并使用创建密钥库时这个版本:版本1.46 这里找到

愿它帮助...



Answer 2:

无需再次做好每一件事!

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

还有另一种解决方案,这是非常容易得多:

  1. 使用Portecle:

    • 下载Portecle http://portecle.sourceforge.net/
    • 与密码,并portecle打开BKS文件
    • 做工具>>更改密钥仓库类型>> BKS-V1
    • 保存文件
  2. 您可以使用密钥库资源管理器

新文件将与BKS-V1进行编码,并且将不再显示错误....

注:Android能与型动物BKS版本:例如,API 15将需要BKS-1违背API 23需要BKS,所以你可能需要把两个文件在您的应用程序。

注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());


Answer 3:

最后我用Windows下的图形编辑器(密钥库浏览器),它的工作。

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



Answer 4:

解决办法是在这里,能清除版本prolem

对于Android客户端创建BKS文件

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

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

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

解压缩zip和US_export_policy和local_policy复制到C:/ programes文件/ JAVA / jre7 / lib / security中的文件夹。

安装密钥存储资源管理器软件。

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

1)使用密钥库使用CA软件.crt文件创建信任文件。

脚步:

开放式软件
转到文件 - >新建 - >选择.BKS从向导导入CA证书文件转到工具 - >导入受信任的证书 - >选择CA .crt文件 - > entert密码 - >(它将如果证书是自签throwa除外)强行导入文件。

4.Save文件,.bks扩展。

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

脚步

打开软件转到文件 - >新建 - >从向导选择.BKS

导入> P12文件转到工具 - >导入密钥对 - >选择PKCS#12向导 - >输入文件和眉毛文件能解密密码 - >输入ALISE名称(如果想别的改变可以保留,因为它是) - >输入新密码

保存.bks扩展文件。

3)如果使用是.P12使用密钥存储软件不可用文件创建密钥文件

脚步

开放式软件

转到文件 - >新建 - >从向导导入> P12文件转到工具选择.BKS - >导入密钥对 - >从向导中选择的OpenSSL - >文件选中能解密密码,眉毛.KEY和.CRT(证书文件不是CA)文件 - >输入ALISE名称(如果想改变别人可以保留,因为它是) - >输入新密码

保存.bks扩展文件。

复制在res文件都/原始文件夹(这两个文件的BKS是compulsarry)。

码:

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

    }

}


Answer 5:

我张贴此答案的.pkcs12-文件转换为keystore.bks提供CMDLINE版本

需要什么样的:

  • Portecle -从下载https://sourceforge.net/projects/portecle/

如果你不知道如何生成.PKCS12-文件看看这些网站:

  • http://www.robinhowlett.com/blog/2016/01/05/everything-you-ever-wanted-to-know-about-ssl-but-were-afraid-to-ask/
  • https://www.sslshopper.com/article-most-common-java-keytool-keystore-commands.html

对于此示例我使用jetty.pkcs12源。 该命令生成:keystore.bks /usr/local/share/java/portecle-1.9/是我已经安装了下载Portecle刀具​​路径文件(.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

现在,您可以使用BKS-密钥库下的Android

多亏了上一个帖子,我能够找到一个解决方案,并提供该CMD。 希望它可以帮助别人!



Answer 6:

使用他们。

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



文章来源: Wrong version of keystore on android call