这是连接到 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);
}
}