我想实现一个小的 android 应用程序,它作为 SSL 服务器工作。在密钥库的正确格式出现很多问题之后,我解决了这个问题并进入了下一个问题。
KeyStore 类正确加载了我的密钥库文件。但是当我尝试打开服务器套接字(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。
我通过调用获得了支持的密码套件列表
socket.getSupportedCipherSuites()
打印出一个长长的列表,其中的组合非常不同。但我不知道如何获得支持的密钥。在使用 portecle 将其转换为 BKS 格式后,我还尝试了 android 调试密钥库,但仍然出现相同的错误。
谁能帮助并告诉我如何生成与其中一个密码套件兼容的密钥?
版本信息:
targetSDK:15
在运行 4.0.3 的模拟器和运行 2.3.3 的真实设备上测试
BounceCastle 1.46
portecle 1.7
我的测试应用程序代码:
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());
}
}
}