これは、ブラウザがhttpsサイトに接続するときにssl証明書を処理する方法です。
ブラウザにhttps://myDemoSite.comと入力すると、まずブラウザがmyDemoSite.comからの証明書を要求し(httpsが原因)、次にmyDemoSiteがその証明書をブラウザに送信します。
ブラウザがその証明書を受信すると、ブラウザはそれが検証された機関によって署名されているかどうかを確認します。
2番目のステップで「はい」の場合、3番目のステップとして、証明書の問題にブラウザのユーザーが入力したのと同じURLがあるかどうかを確認します。
今、私はJavaプログラム(HttpsConnectProg1)を介してhttpsサイトに接続しています。私の質問は、programmei.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);
}
}