2 Stimmen

Selbstsigniertes Zertifikat "enthält kein CN- oder DNS-subjectAlt"

Ich arbeite an einem Projekt, in dem mein Kollege einen HTTPS-Server implementiert hat, der ein selbstsigniertes Zertifikat verwendet, und ich entwerfe eine Android-App, die HttpPosts dorthin sendet. Er hat es mit Curl getestet und keine Probleme festgestellt. Ich benutze Android 3.2, falls es relevant ist.

Nach diesem Tutorial hier habe ich einen Keystore generiert und zur App hinzugefügt, einen benutzerdefinierten httpClient erstellt. Ich habe die GET-Anfrage durch POST ersetzt mit dem folgenden Code:

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", "Fehler: " + "Keine HTTP-Verbindung");
        } catch (MalformedURLException e) {
            Log.e("postHttpConnection", "Fehler: " + e);
        } catch (IOException e) {
            Log.e("postHttpConnection", "Fehler: " + 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", "Fehler: " + e);
        } catch (IOException e) {
            Log.e("postHttpConnection", "Fehler: " + e);
        }
        return inStream;
    }

Wenn ich diese Funktion mit einem entsprechenden JSONObject verwende, erhalte ich den folgenden Fehler:

E/postHttpConnection(9236): Fehler: javax.net.ssl.SSLException: Zertifikat für 

Können Sie mir sagen, worauf sich das bezieht? Vielen Dank.

4voto

Das Problem liegt nicht in Ihrem Code, sondern im Zertifikat. Sie müssen Ihren Domänennamen (den, mit dem der Client verbunden ist) entweder im SubjectName.CommonName-Feld des Zertifikats oder in der Subject Alternative Name-Erweiterung des Zertifikats angeben. Sie müssen das Zertifikat neu erstellen und dabei die Anleitungen zur Spezifizierung des CommonName überprüfen (Sie müssten es auf etwas wie "www.meinedomain.com" setzen).

0voto

david Punkte 857
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;
}

es hilft vielleicht. ps. httpclient version ist 4.3.1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X