我正在使用服务器 - 客户端模型制作一个非常小规模的应用程序,其中服务器是一个j2se应用程序,客户端是一个Android应用程序。
服务器将使用动态DNS托管,并且需要像更改域名一样可移植。
现在使用SSL可能会出现问题,因为证书需要具有可识别的服务器地址,域名或IP,这两者都可能会发生变化。我认为这是为了防止有人伪装成服务器从不同的位置发送相同的公钥。
那么我应该如何应对这种情况呢?
答案 0 :(得分:0)
以下是继续提示。为验证服务器证书的连接添加自定义信任管理器 - 并添加自定义主机名验证逻辑,该逻辑将主机名评估为可接受的列表 - 或者只是硬编码为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
}
});
来自docs -
此类使用HostnameVerifier和SSLSocketFactory。有 为这两个类定义的默认实现。然而 实现可以在每个类(静态)或 每个实例的基础。所有新的HttpsURLConnections实例都将是 分配了"默认"实例创建时的静态值,但它们 可以通过调用适当的每个实例集方法来覆盖 在连接之前。