在android-j2se上使用ssl与服务器-客户端套接字通信

huus2vyu  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(366)

我正在用服务器-客户机模型制作一个非常小的应用程序,其中服务器是一个j2se应用程序,客户机是一个android应用程序。
服务器将与动态dns托管,需要在更改域名时可移植。
现在使用ssl,这可能会有问题,因为证书需要有一个可识别的服务器地址(域名或ip),这两个地址都可能会更改。我假设这是为了防止有人伪装成从不同位置发送相同公钥的服务器。
那么我该如何应对这种情况呢?

kkih6yb8

kkih6yb81#

下面是继续的提示。为验证服务器证书的连接添加一个自定义信任管理器,并添加一个自定义主机名验证逻辑,该逻辑将主机名从可接受列表中计算出来,或者仅将硬代码设置为true。

SSLContext ctx = SSLContext.getInstance("TLS");
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(getTrustedCert());//todo
        ctx.init(null, tmf.getTrustManagers(), null);

        HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());

        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {  
            @Override
            public boolean verify(String arg0, SSLSession arg1) {
                return isInAcceptableHostNameList(arg0);//todo
            }
        });

从文档-
此类使用hostnameverifier和sslsocketfactory。这两个类都定义了默认实现。但是,可以在每个类(静态)或每个示例的基础上替换实现。所有新的httpsurlconnections示例都将在示例创建时被分配“default”静态值,但是可以通过在连接之前调用相应的per instance set方法来覆盖它们。

相关问题