【问题标题】:Self signed certificate "doesn' contain CN or DNS subjectAlt"自签名证书“​​不包含 CN 或 DNS subjectAlt”
【发布时间】:2012-05-26 03:56:42
【问题描述】:

我正在做一个项目,我的同事在该项目中实现了一个使用自签名服务器的 https 服务器,并且我正在设计一个向其发送 httpposts 的 Android 应用程序。他已经使用 curl 对其进行了测试,没有任何问题。如果相关,我使用的是 Android 3.2。

按照本教程here,我生成了一个密钥库并将其添加到应用程序中,同时还创建了一个自定义 httpClient。我使用以下代码将 get 请求替换为 post:

    private InputStream postHttpConnection(String urlValue,
        JSONObject jsonPost, Context context) {
            InputStream inStream = null;
            URL url;
            try {
                url = new URL(urlValue);
                URLConnection conn = url.openConnection();
                if (!(conn instanceof HttpURLConnection))
                    Log.e("postHttpConnection", "Fail: " + "Not an HTTP connection");
            } catch (MalformedURLException e) {
                Log.e("postHttpConnection", "Fail: " + e);
            } catch (IOException e) {
                Log.e("postHttpConnection", "Fail: " + e);
            }
            try {
                DefaultHttpClient client = new MyHttpClient(context);
                HttpConnectionParams
                        .setConnectionTimeout(client.getParams(), 10000);
                HttpResponse postResponse;
                HttpPost post = new HttpPost(urlValue);
                StringEntity se = new StringEntity(jsonPost.toString());
                post.setEntity(se);
                post.setHeader("Accept", "application/json");
                post.setHeader("Content-type", "application/json");
                postResponse = client.execute(post);
                inStream = postResponse.getEntity().getContent();
            } catch (ClientProtocolException e) {
                Log.e("postHttpConnection", "Fail: " + e);
            } catch (IOException e) {
                Log.e("postHttpConnection", "Fail: " + e);
            }
            return inStream;
        }

当我通过适当的 JSONObject 使用此函数时,我收到以下错误:

    E/postHttpConnection(9236): Fail: javax.net.ssl.SSLException: Certificate for <address> doesn't contain CN or DNS subjectAlt

你能告诉我这与什么有关吗?谢谢。

【问题讨论】:

    标签: android https certificate


    【解决方案1】:

    问题不在于您的代码,而在于证书。您需要在证书的 SubjectName.CommonName 字段或证书的主题备用名称扩展中指定您的域名(客户端连接的域名)。您需要重新创建证书,并且在执行此操作时,请查看有关如何指定 CommonName 的手册(您需要将其设置为“www.mydomain.com”之类的内容)。

    【讨论】:

    • 谢谢,我会让我的同事调查一下。
    • @Cath 感谢 SO 的正确方法是投票给答案(或问题)。如果答案确实回答了您的问题,则应通过勾选投票柜台下方的复选标记来接受。这适用于您迄今为止提出的所有问题。
    【解决方案2】:
    private HttpClient getHttpClient(){
        RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder.<ConnectionSocketFactory> create();
        ConnectionSocketFactory plainSF = new PlainConnectionSocketFactory();
        registryBuilder.register("http", plainSF);
        try {
            KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
            TrustStrategy anyTrustStrategy = new TrustStrategy() {
                @Override
                public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
                    return true;
                }
            };
            SSLContext sslContext = SSLContexts.custom().useTLS().loadTrustMaterial(trustStore, anyTrustStrategy)
                    .build();
            LayeredConnectionSocketFactory sslSF = new SSLConnectionSocketFactory(sslContext,
                    SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
            registryBuilder.register("https", sslSF);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        Registry<ConnectionSocketFactory> registry = registryBuilder.build();
        PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(registry);
        HttpClient httpclient = HttpClientBuilder.create().setConnectionManager(connManager).build();
    
        return httpclient;
    }
    

    也许对你有帮助。 附言。 httpclient版本为4.3.1

    【讨论】:

      猜你喜欢
      • 2014-01-26
      • 1970-01-01
      • 2015-01-08
      • 2021-08-23
      • 2013-12-18
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多