2017-08-10 64 views
0

我试图通过客户端应用程序通过SSL登录到Web服务器。如何通过SSL从Java客户端进行通信

我不希望通过明文发送用户名和密码,所以我想使用Web服务器提供的SSL证书加密我的流量和随后的REST调用。

到目前为止,我的代码从服务器检索证书,并从中检索公钥。

 public void testConnectionTo(String aURL) throws Exception { 
     URL destinationURL = new URL(aURL); 
     HttpsURLConnection conn = (HttpsURLConnection) destinationURL 
       .openConnection(); 
     conn.connect(); 
     Certificate[] certs = conn.getServerCertificates(); 
     for (Certificate cert : certs) { 
      System.out.println(cert.getPublicKey()); 

     } 

这将返回3个不同的RSA公钥。 我使用哪一个,以及如何(在伪代码/代码中)使用此公钥来加密我的出站流量?

+2

如果您使用的是HTTPS,就像使用https://协议访问URL一样,您的流量会自动进行透明加密。你究竟想达到什么目的?获取服务器证书主要是检查你是否接受它们。 – 9000

+0

因此,使用HTTPS,就像我现在一样,在中间攻击中我不会受到攻击? – steam1234322

+0

是的,只要您真的相信服务器提供的证书,并且不接受过时的密码。这里是[2016年由Mozilla提供的密码推荐](https://wiki.mozilla.org/Security/Server_Side_TLS),如果你想要血淋淋的细节。 JVM拥有自己的可信根证书库,并且通常也会咨询您的操作系统的可信CA列表。如果您想成为额外的偏执狂,您可以另外检查连接的证书,如果您认为证书可能受到侵害或知道该证书已被吊销,请关闭连接。 – 9000

回答

2

如果您使用的是https://作为URL协议,则连接的底层将自动加密,您无需对连接的服务器证书进行任何操作。

您不应该采取任何其他操作来加密/解密流量。

检查认证的价值在于看到发证机构是谁,以及是否需要对证书进行额外的验证。例如,如果您要验证证书是颁发给您正在连接的网站,尝试检测是否有人正在推出具有无与伦比的证书的中间人。

但在直线加密(防止窃听)方面..这是自动完成的。

+0

谢谢,在哪里验证SSL证书来玩? – steam1234322

+0

对于实例,如果证书是X509Certificate的实例,则可以检查签名算法是什么,或者签发机构是谁。然后,如果证书不符合您的标准,您可以拒绝接受连接。 – pfranza

+0

关于如何指定我的证书标准/检查证书是否符合我的标准? – steam1234322

相关问题