我正在用服务器-客户机模型制作一个非常小的应用程序,其中服务器是一个j2se应用程序,客户机是一个android应用程序。服务器将与动态dns托管,需要在更改域名时可移植。现在使用ssl,这可能会有问题,因为证书需要有一个可识别的服务器地址(域名或ip),这两个地址都可能会更改。我假设这是为了防止有人伪装成从不同位置发送相同公钥的服务器。那么我该如何应对这种情况呢?
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方法来覆盖它们。
1条答案
按热度按时间kkih6yb81#
下面是继续的提示。为验证服务器证书的连接添加一个自定义信任管理器,并添加一个自定义主机名验证逻辑,该逻辑将主机名从可接受列表中计算出来,或者仅将硬代码设置为true。
从文档-
此类使用hostnameverifier和sslsocketfactory。这两个类都定义了默认实现。但是,可以在每个类(静态)或每个示例的基础上替换实现。所有新的httpsurlconnections示例都将在示例创建时被分配“default”静态值,但是可以通过在连接之前调用相应的per instance set方法来覆盖它们。