SSLサーバーとして動作する小さなアンドロイドアプリケーションを実装したいと思います。 正しい形式のキーストアで問題が発生した後、私はこれを解決して次のキーストアに入ります。SSLException:有効な暗号スイートをサポートするキーストアエントリが見つかりませんでした
キーストアファイルがキーストアクラスによって正しくロードされています。しかし、サーバーソケット(socket.accept())を開こうとすると、次のエラーが発生します。
javax.net.ssl.SSLException:有効な暗号スイートをサポートするキーストアエントリが見つかりませんでした。
私は、このコマンドを使用して、私のキーストアを生成:
のkeytool -genkey -keystore test.keystore -keyalg RSA -keypass ssltest -storepass ssltest -storetype BKS -provider org.bouncycastle.jce.provider。 BouncyCastleProvider -providerpath bcprov.jar
Java SE6の無制限強度管轄ポリシーは、私のjre6に適用されています。
私は非常に異なる組み合わせでlong listを印刷し
socket.getSupportedCipherSuites()
を呼び出すことによってサポートされる暗号スイートのリストを得ました。しかし、私はサポートされているキーを取得する方法を知らない。 私もアンドロイドのデバッグキーストアをportecleを使ってBKSフォーマットに変換してみましたが、同じエラーが出ます。
暗号スイートのいずれかと互換性のある鍵をどのように生成することができますか?
バージョン情報:
targetSDK:
:4.0.3と私のテストアプリケーションの2.3.3BounceCastle 1.46
portecle 1.7
コードを実行している実際のデバイスを実行しているエミュレータ上でテスト15
public class SSLTestActivity extends Activity implements Runnable {
SSLServerSocket mServerSocket;
ToggleButton tglBtn;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.tglBtn = (ToggleButton)findViewById(R.id.toggleButton1);
tglBtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
new Thread(SSLTestActivity.this).run();
} else {
try {
if (mServerSocket != null)
mServerSocket.close();
} catch (IOException e) {
Log.e("SSLTestActivity", e.toString());
}
}
}
});
}
@Override
public void run() {
try {
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(getAssets().open("test.keystore"), "ssltest".toCharArray());
ServerSocketFactory socketFactory = SSLServerSocketFactory.getDefault();
mServerSocket = (SSLServerSocket) socketFactory.createServerSocket(8080);
while (!mServerSocket.isClosed()) {
Socket client = mServerSocket.accept();
PrintWriter output = new PrintWriter(client.getOutputStream(), true);
output.println("So long, and thanks for all the fish!");
client.close();
}
} catch (Exception e) {
Log.e("SSLTestActivity", e.toString());
}
}
}
ありがとうございます。 SSLContextを使用して問題を解決しました:) –
ありがとうございました。 KeyManagersではなく、TrustManagersでのみ初期化されたSSLContextからSSLServerSocketFactoryを取得しようとしていたので、あらゆる種類のエラーが発生しました。あなたの説明とコードは本当に助けてくれました。 –