安卓不支持sunX509?Android 客户端使用 SSLsocket 连接到 Java 服务器



谢谢你帮助我! 首先要做的是。 我尝试使用我的平板电脑(Android 7.1.1(通过SSLSocket通过Wi-Fi连接到我的笔记本电脑(java服务器JDK1.8(。

第 1 部分:我创建了一个新的密钥库,其中包含 Java SDK。

keytool -genkey -alias projectname -keystore /PATH/project.keystore -validity 365

然后基于密钥库生成证书。

keytool -export -alias projectname -keystore /PATH/project.keystore -file /PATH/projectcert.cer

创建。适用于安卓客户端的 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 部分:安卓客户端

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;
}

error:
W/System.err: java.security.NoSuchAlgorithmException: sunX509 KeyManagerFactory 不可用

我还把两边的 sunX509 都改成了 PKIX。但是,我握手失败了。

我不知道你从哪里得到"sunx509"作为KeyManagerFactory或TrustManagerFactory算法。自至少JDK 1.6以来,唯一为两者列出的一个是"PKIX"。无论如何,您应该只使用

KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm())

TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())

我还把两边的 sunX509 都改成了 PKIX。但是,我握手失败了。

"握手失败"是进步。你通过了所有这些代码。

最新更新