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も定義しようとしましたが、何も変わりません。
何か案は ?
見てください Android:SSL証明書を信頼する
-storetype BKS
-provider org.bouncycastle.jce.provider.BouncyCastleProvider
-providerpath /path/to/bouncycastle.jar
キーストアを作成するときにこのバージョンを使用します:バージョン1.46ここにあります
お役に立てれば幸いです...
もう一度すべてのことをする必要はありません!!!
キーストアのタイプをBKSからBKS-v1に変更する必要があります(BKS-v1はBKSの古いバージョンです)。 BKSバージョンが変更されたため here
はるかに簡単な別の解決策があります:
Portecleの使用:
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());
最後に、Windowsでグラフィックエディター(KeyStore Explorer)を使用しました。
多分エラーはJava/Macバージョンの問題が原因で発生しました
解決策はここにあり、バージョンの問題を削除することができます
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();
}
}
}
この回答を投稿して、.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を使用できます
前の投稿のおかげで解決策を見つけ、このコマンドを提供することができました。それが誰かを助けることを願っています!
それらのいずれかを使用します。
KeyStore.getInstance( "BKS"); KeyStore.getInstance( "PKCS12");