Hostnameverifier实现

时间:2015-11-12 15:00:26

标签: java ssl

我在尝试实施此方法时遇到了困难。我要做的是检查主机名是否与用户的请求(关于SSL证书)匹配,如果主机名匹配或不匹配,sslshopper.com将如何显示。

我的连接在Controller.java下:

HttpsURLConnection connection;
try {
    connection = (HttpsURLConnection) urlOK.openConnection();
    connection.connect();
} catch (IOException ex) {
    throw new IOException("Failed to connect: " + ex.getMessage());
}

我设置了一个名为getHostnameVerified的类,我将这些值从Controller.java传递给它getHostNameVerified.returnValid(this,urlOK,connection);

这是在Controller.java中找到的UI的setter:

public void getHostname(boolean hostnameValid) {
    if (hostnameValid) {
        hostName.setText("Hostname match");
    } else if (!hostnameValid) {
        hostName.setText("Hostname mis-match");
    }
}

这是班级:

public abstract class getHostNameVerified implements HostnameVerifier {

    public static void returnValid(Controller controller, URL url, HttpsURLConnection connection) {
        try {
            HostnameVerifier hv = new HostnameVerifier() {
                @Override
                public boolean verify(String s, SSLSession sslSession) {
                    System.out.println("DEBUG getHostNameVerified verify entered");
                    return true;
                }
            };
        }catch (Exception ex) {
            System.out.print("getHostNameVerified exception: " + ex.getMessage());
        }

    }

}

什么都没发生。我没有看到我知道的SSL证书的println语句是真的。我实施了什么错吗?我完全难过了:(。

1 个答案:

答案 0 :(得分:1)

您需要告诉HTTPURLConnection使用主机名验证器的实例。

这样的事情:

try {
   HostnameVerifier hv = new HostnameVerifier() {
       public boolean verify(String arg0, SSLSession arg1) {
           return true;
       }
   };

   HttpsURLConnection.setDefaultHostnameVerifier(hv);

} catch (Exception localException) { }