【发布时间】:2012-05-30 09:55:06
【问题描述】:
这是浏览器在连接到 https 站点时处理 ssl 证书的方式
当我在浏览器中输入 https://myDemoSite.com 时,首先我的浏览器会从 myDemoSite.com 请求证书(由于 https),然后 myDemoSite 将该证书发送到浏览器
一旦浏览器收到该证书,浏览器将检查它是否像威瑞信那样由经过验证的权威机构签署
如果第二步是,那么作为第三步,它检查证书问题是否与用户在浏览器中输入的 url 相同
现在我通过 java 程序连接 https 站点说 HttpsConnectProg1。我的问题是程序 i.e HttpsConnectProg1 将如何处理这个 使用 https 站点连接颁发的证书(尽管此 https 站点颁发的证书是经过验证的,即由经过验证的权威机构签署)。
我只是尝试了一个小 连接到颁发认证证书的 https 站点的程序。我预计会出现一些错误,例如 sslhandshake 错误或一些证书错误 (因为我没有在 $JAVA_HOME\jre\lib\security 文件夹中添加这个认证证书)但令我惊讶的是我没有收到任何错误。
现在重要的问题是 HttpsConnectProg1 是否检查浏览器完成的第 3 步,因为它是非常重要的一步?在这里供您参考
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Properties;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
public class ConnectToDemoSite {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String urlStr = "https://www.myDemoSite.com/demo1/";
URL url;
Properties reply = new Properties();
try {
url = new URL(urlStr);
URLConnection conn = url.openConnection();
if(conn instanceof HttpsURLConnection)
{
HttpsURLConnection conn1 = (HttpsURLConnection)url.openConnection();
conn1.setHostnameVerifier(new HostnameVerifier()
{
public boolean verify(String hostname, SSLSession session)
{
return true;
}
});
reply.load(conn1.getInputStream());
}
else
{
conn = url.openConnection();
reply.load(conn.getInputStream());
}
} catch (MalformedURLException e) {
e.printStackTrace();
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("reply is"+reply);
}
}
【问题讨论】: