首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >安卓不支持sunX509吗?Android客户端通过SSLsocket连接到java服务器

安卓不支持sunX509吗?Android客户端通过SSLsocket连接到java服务器
EN

Stack Overflow用户
提问于 2018-06-13 22:54:53
回答 1查看 474关注 0票数 0

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

第1部分:我用Java SDK附带的keytool创建了一个新的Keystore。

代码语言:javascript
复制
keytool -genkey -alias projectname -keystore /PATH/project.keystore -validity 365

然后根据密钥库生成证书。

代码语言:javascript
复制
keytool -export -alias projectname -keystore /PATH/project.keystore -file /PATH/projectcert.cer

为Android客户端创建了.BKS文件。

代码语言:javascript
复制
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客户端

代码语言:javascript
复制
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服务器

代码语言:javascript
复制
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。然而,我得到了握手失败。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-15 08:06:24

我不知道你是从哪里得到"sunx509"作为KeyManagerFactory或TrustManagerFactory算法的。从JDK1.6开始,为这两个版本列出的唯一一个是"PKIX"。在任何情况下,您都应该使用

代码语言:javascript
复制
KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm())

代码语言:javascript
复制
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())

I还在两端将sunX509更改为PKIX.然而,我得到了握手失败。

“握手失败”是进程。你已经通过了所有这些代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50840331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档