谢谢你帮我!首先要做的是。我试着用我的平板电脑(Android 7.1.1)通过wi-fi通过SSLSocket连接到我的笔记本电脑(java服务器JDK1.8)。
第1部分:我用Java SDK附带的keytool创建了一个新的Keystore。
keytool -genkey -alias projectname -keystore /PATH/project.keystore -validity 365
然后根据密钥库生成证书。
keytool -export -alias projectname -keystore /PATH/project.keystore -file /PATH/projectcert.cer
为Android客户端创建了.BKS文件。
keytool -import -alias projectname -file /PATH/projectcert.cer -keystore /PATH/project.bks -storetype BKS -providerClass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath /path/bcprov-jdk16-146.jar
现在我有3个文件。project.keystore (我只是把这个放到Android Raw文件夹中) project.bks (我使用portecle工具将类型"bks“切换为"JKS”,然后复制到java服务器) cprojectcert.cer
第2部分: Android客户端
public class HTTPSClient{
..............
..............
private SSLContext createSSLContext(){
try{
KeyStore keyStore = KeyStore.getInstance("BKS");
InputStream in = context.getResources().openRawResource(R.raw.project);
keyStore.load(in,"password".toCharArray());
// Create key manager
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("sunX509");
keyManagerFactory.init(keyStore, "password".toCharArray());
KeyManager[] km = keyManagerFactory.getKeyManagers();
// Create trust manager
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("sunX509");
trustManagerFactory.init(keyStore);
TrustManager[] tm = trustManagerFactory.getTrustManagers();
// Initialize SSLContext
SSLContext sslContext = SSLContext.getInstance("TLSv1");
sslContext.init(km, tm, null);
return sslContext;
} catch (Exception ex){
ex.printStackTrace();
}
return null;
}
}
第3部分: java服务器
private SSLContext createSSLContext(){
try{
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(new FileInputStream("temp"+'/'+"project.jks"),"password".toCharArray());
// Create key manager
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("sunX509");
keyManagerFactory.init(keyStore, "password".toCharArray());
KeyManager[] km = keyManagerFactory.getKeyManagers();
// Create trust manager
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("sunX509");
trustManagerFactory.init(keyStore);
TrustManager[] tm = trustManagerFactory.getTrustManagers();
// Initialize SSLContext
SSLContext sslContext = SSLContext.getInstance("TLSv1");
sslContext.init(km, tm, null);
return sslContext;
} catch (Exception ex){
ex.printStackTrace();
}
return null;
}
错误:
W/System.err: java.security.NoSuchAlgorithmException: sunX509 KeyManagerFactory不可用
我还在两端将sunX509更改为PKIX。然而,我得到了握手失败。
发布于 2018-06-15 08:06:24
我不知道你是从哪里得到"sunx509"
作为KeyManagerFactory或TrustManagerFactory算法的。从JDK1.6开始,为这两个版本列出的唯一一个是"PKIX"
。在任何情况下,您都应该使用
KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm())
和
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
I还在两端将sunX509更改为PKIX.然而,我得到了握手失败。
“握手失败”是进程。你已经通过了所有这些代码。
https://stackoverflow.com/questions/50840331
复制相似问题