2012-06-30 50 views
1

我从一个函数获取以下一段代码,该函数将主机名称作为输入并假定为该主机提取证书。我需要显示远程主机的IP地址。我使用“.getInetAdress()”来返回远程主机的IP:http://docs.oracle.com/javase/1.5.0/docs/api/java/net/Socket.html#getInetAddress()。.getInetAddress()的返回不是实际的IP

SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory(); 

System.out.println("Starting SSL Socket For "+hostname+" port "+port); 
SSLSocket socket = (SSLSocket) factory.createSocket(hostname, port); 

//To get the IP for the remote host. Format: (domain name/IP), 
//then manually covert it to string 

String remoteIP=socket.getInetAddress().toString(); 
System.out.println("Remote address = " + remoteIP); 

socket.startHandshake();  
Certificate[] serverCerts = socket.getSession().getPeerCertificates(); 

当运行该程序,例如,主机是: “www.tesco.com” 中, “.getInetAddress()”。将此IP返回给我:88.221.94.232。当我尝试在浏览器中输入此IP时,即使在向URL添加“https://”后,它也会给我“无效的URL”。而如果我试图ping“tesco.com”,则会得到另一个IP:“212.140.185.177”,如果我在浏览器中键入它,则会打开tesco的网页。

我误解了什么?除getInetAddress & getHostAddress()以外,是否还有其他方法可以获取远程主机的IP地址(不使用套接字)?

回答

7

您正在获取正确的IP地址。

当我运行程序时,例如,主机是:“www.tesco.com”,“.getInetAddress()”。将此IP返回给我:88.221.94.232。

没错。这就是您为www.tesco.com获得的IP地址。

当我尝试在浏览器中键入此IP时,它会给我“无效的URL”。

因为该服务器(一个Akamai加速器)不知道你想要哪个网站。

虽然,如果我试图平 “tesco.com” 我得到另一个IP: “212.140.185.177”

对的,因为tesco.com是不一样的www.tesco.com

如果我在浏览器中输入它,它会打开tesco的网页。

由于该Web服务器是知道你想要哪个网站,因为它只能处理tesco.com,即处理www.tesco.com能够处理很多网站服务器不同。

如果仔细观察,您会发现将浏览器指向tesco.com会将您重定向到www.tesco.com。他们使用Akamai。

+0

因此,为了确保我找到了您的答案,这意味着“88.221.94.232”是托管许多网站的托管服务器,不仅仅是特易购。这给我带来了另一个问题,如果我想为支持SSL的服务器(为用户提供证书以确保交易期间安全通信的服务器,如tesco和amazon等)提取证书,那就意味着我创建了我的套接字(请参阅以我的代码获取更多信息):“tesco.com”而不是“www.tesco.com”?? –

+0

另外,如果可能的话,我需要一般的答案,不仅仅是我的tesco例子:我应该使用什么主机名来提取证书?它与www。或没有? –

+0

是的,它是一个托管服务器(实际上它不止一个,它是Akamai,它们在全球都有服务器)。如果您需要网站“tesco.com”的证书,请使用“tesco.com”。如果您需要网站“www.tesco.com”的证书,请使用“www.tesco.com”。网站是有证书的东西 - 使用你想要的证书的网站。 –

相关问题