2017-01-04 34 views
0

我正在使用服务器 - 客户端模型制作一个非常小规模的应用程序,其中服务器是j2se应用程序,客户端是android应用程序。使用SSL与android-j2se上的服务器客户端套接字通信

该服务器将由动态DNS托管,并且需要像更改域名一样可移植。

现在使用SSL,这可能会产生问题,因为证书需要具有可识别的服务器地址,无论是域名还是IP,它们都可能会更改。我认为这是为了防止某人伪装成服务器从不同位置发送相同的公钥。

那么我该如何应对这种情况呢?

回答

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实例将为 分配“默认”静态值,但在连接之前可以通过调用适当的每个实例设置方法 来覆盖它们。

+0

那么这是https方式,但我打算使用普通的旧套接字作为双向通信是必需的,而不是简单的http请求和响应模型 – Allahjane

相关问题