2012-06-30 51 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」。網站是有證書的東西 - 使用你想要的證書的網站。 –

相關問題