【问题标题】:Hostname does not match in Lollipop devices but works fine in Postman and marshmallow devices主机名在 Lollipop 设备中不匹配,但在 Postman 和 marshmallow 设备中运行良好
【发布时间】:2017-08-22 18:51:05
【问题描述】:

最近 SSL 证书被添加到服务器,所以我将 android 中的 url 从 http://appname.com 更改为 https://www.appname.com ,这在棉花糖设备和 Postman 上运行良好,但在棒棒糖设备上抛出 javax.net.ssl.SSLException :证书中的主机名不匹配:www.appname.com != www.companyname.com OR www.companyname.com OR companyname.com

我尝试在 setHostnameVerifier 中添加 companyname.com,但没有帮助。这是代码:

 HashMap<String, String> postDataParams=new HashMap<>();
        postDataParams.put("u_phone",CN);
        postDataParams.put("u_code",st);
        postDataParams.put("device_flag",mob_device);
        postDataParams.put("app_type","PRO");
        HostnameVerifier hostnameVerifier = new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                HostnameVerifier hv =
                        HttpsURLConnection.getDefaultHostnameVerifier();
                return hv.verify("companyname.com", session);
            }
        };


        try{

            URL url = new URL("https://www.appname.com/sync/validatecheck.php");
            HttpsURLConnection urlConnection =
                    (HttpsURLConnection)url.openConnection();
            //urlConnection.setHostnameVerifier(hostnameVerifier);
            urlConnection.setReadTimeout(10000);
            urlConnection.setConnectTimeout(15000);
            urlConnection.setRequestMethod("POST");
            urlConnection.setDoInput(true);
            urlConnection.setDoOutput(true);

            OutputStream os = urlConnection.getOutputStream();
            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(os, "UTF-8"));
            writer.write(getPostDataString(postDataParams));

            writer.flush();
            writer.close();
            os.close();
            int responseCode=urlConnection.getResponseCode();

            if (responseCode == HttpsURLConnection.HTTP_OK) {
                String line;
                BufferedReader br=new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                while ((line=br.readLine()) != null) {
                    result+=line;
                }
            }
            else {
                result="";

            }
        } catch (Exception e) {
            Log.e("log_tag", "Error in http connection "+e.toString());
        }

这可能是什么问题?以及如何解决这个问题?

【问题讨论】:

  • 颁发证书的主机名是什么?检查主题中的 CN 字段。它应该发给 www.appname.com 或 *.appname.com。
  • @pedrofb CN 只是 appname.com 没有 www 或 * ,我可以编辑相同的证书吗?
  • 那么错误是正确的。您可以使用https://appname.com,但不能使用https://www.appname.com。在https://appname.com 中部署您的服务器,为www.appname.com 颁发新证书或设置 HostnameVerifier 以允许 www.appname.com
  • 是的,这行得通,我没有更改证书中的任何内容,也没有添加验证者,只是使用了appname.com

标签: java android ssl httpclient android-5.0-lollipop


【解决方案1】:

该错误表示已颁发证书的主机名(主题中的 CN 字段)与服务器名称不匹配。

如果您使用 URL https://www.appname.com,则证书应颁发给 www.appname.com*.appname.com。证书的主机名是appname.com 然后错误是正确的,您可以使用https://appname.com 但不能使用https://www.appname.com.

https://appname.com 中部署您的服务器,为www.appname.com 颁发新证书或设置HostnameVerifier 以允许www.appname.com

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多