web-dev-qa-db-ja.com

Android呼び出しでのキーストアのバージョンが間違っています

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を使用してみましたが、結果は同じです。キーサイズ1024も定義しようとしましたが、何も変わりません。

何か案は ?

32
JuSchz

見てください Android:SSL証明書を信頼する

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

キーストアを作成するときにこのバージョンを使用します:バージョン1.46ここにあります

お役に立てれば幸いです...

32
Strider

もう一度すべてのことをする必要はありません!!!

キーストアのタイプをBKSからBKS-v1に変更する必要があります(BKS-v1はBKSの古いバージョンです)。 BKSバージョンが変更されたため here

はるかに簡単な別の解決策があります:

  1. Portecleの使用:

    • ダウンロードPortecle http://portecle.sourceforge.net/
    • パスワードとポートでbksファイルを開きます
    • ツール>>キーストアタイプの変更>>BKS-v1
    • ファイルを保存します
  2. KeyStore Explorerを使用できます

新しいファイルはBKS-v1でエンコードされ、エラーは表示されなくなります...

注:Androidは、異なるBKSバージョンで動作します。たとえば、API 15はAPI 23とは逆にBKS-1を必要とします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());
26
Cukic0d

最後に、Windowsでグラフィックエディター(KeyStore Explorer)を使用しました。

多分エラーはJava/Macバージョンの問題が原因で発生しました

5
JuSchz

解決策はここにあり、バージョンの問題を削除することができます

AndroidクライアントのBKSファイルを作成しています

BKSファイルの作成に必要なソフトウェアインストールの詳細:

リンクからKeystore 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フォルダーにコピーします。

keystore Explorerソフトウェアをインストールします。

BKSファイルを生成する手順:(CAファイル、証明書ファイル、キーファイル、およびPKCSファイル(利用可能な場合)。

1)キーストアソフトウェアを使用して、CA .crtファイルを使用して信頼ファイルを作成します。

手順:

オープンソフトウェア
ファイルから移動->新規->ウィザードから.BKSを選択CA証明書ファイルをインポートするにはツール->信頼できる証明書のインポート-> CA .crtファイルを選択->パスワードを入力->(次の場合に例外がスローされます証明書は自己署名です)ファイルを強制的にインポートします。

4. .bks拡張子を付けてファイルを保存します。

2)キーストアソフトウェアを使用して.P12ファイルを使用してキーファイルを作成する

手順

ソフトウェアGoファイル->新規->ウィザードから.BKSを開きます。

インポート> p12ファイルGoツール->鍵ペアのインポート->ウィザードからPKCS#12を選択->ファイルの説明パスワードを入力してファイルを参照->変更名を入力(変更したい場合はそのままにすることができます)->新規に入力パスワード

拡張子が.bksのファイルを保存します。

3).P12が使用できない場合にキーストアソフトウェアを使用してキーファイルを作成する

手順

オープンソフトウェア

ファイルに移動->新規->ウィザードから.BKSを選択> p12ファイルの移動ツール->鍵ペアのインポート->ウィザードからOpenSSLを選択->ファイルのチェックされていない説明パスワード、.keyおよび.crtを参照(CAではなく証明書ファイル)ファイル->アリス名を入力(変更したい場合は、そのまま保持できます)->新しいパスワードを入力

拡張子が.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();
        }

    }

}
2
Vikrant

この回答を投稿して、.pkcs12-Fileをkeystore.bksに変換するためのcmdline-versionを提供します

必要とされていること:

.PKCS12-Fileの生成方法がわからない場合は、次のサイトを確認してください。

このサンプルでは、​​ソースとして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を使用できます

前の投稿のおかげで解決策を見つけ、このコマンドを提供することができました。それが誰かを助けることを願っています!

0
Mike Mitterer

それらのいずれかを使用します。

KeyStore.getInstance( "BKS"); KeyStore.getInstance( "PKCS12");

0
Ali Bagheri