Der folgende Code dient zum Vertrauen in selbstsignierte Zertifikate. Sie müssen die TrustSelfSignedStrategy verwenden, wenn Sie Ihren Client erstellen:
SSLContextBuilder builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
builder.build());
CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(
sslsf).build();
HttpGet httpGet = new HttpGet("https://some-server");
CloseableHttpResponse response = httpclient.execute(httpGet);
try {
System.out.println(response.getStatusLine());
HttpEntity entity = response.getEntity();
EntityUtils.consume(entity);
} finally {
response.close();
}
Das habe ich nicht SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
absichtlich aufgenommen: Es ging darum, das Testen mit selbstsignierten Zertifikaten zuzulassen, damit Sie kein ordnungsgemäßes Zertifikat von einer Zertifizierungsstelle erwerben müssen. Sie können problemlos ein selbstsigniertes Zertifikat mit dem richtigen Hostnamen erstellen. Führen Sie dies aus, anstatt das SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
Flag hinzuzufügen .
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
SSLContextBuilder
werden von Idea gefunden.Wenn Sie die oben beschriebene Prozedur PoolingHttpClientConnectionManager nicht verwenden, wird der benutzerdefinierte SSLContext ignoriert. Sie müssen socketFactoryRegistry im Konstruktor übergeben, wenn Sie PoolingHttpClientConnectionManager erstellen.
quelle
HttpClients.custom().setConnectionManager(cm).build()
undHttpClients.custom().setSSLSocketFactory(connectionFactory).build()
funktionieren, sodass Sie keinePoolingHttpClientConnectionManager
Wenn Sie zusätzlich zur Antwort von @mavroprovato allen Zertifikaten vertrauen möchten, anstatt nur selbstsigniert zu sein, tun Sie dies (im Stil Ihres Codes).
oder (direktes Kopieren und Einfügen aus meinem eigenen Code):
Und wenn Sie auch die Überprüfung des Hostnamens überspringen möchten, müssen Sie festlegen
auch. (ALLOW_ALL_HOSTNAME_VERIFIER ist veraltet).
Obligatorische Warnung: Sie sollten dies nicht wirklich tun. Das Akzeptieren aller Zertifikate ist eine schlechte Sache. Es gibt jedoch einige seltene Anwendungsfälle, in denen Sie dies tun möchten.
Als Hinweis auf den zuvor angegebenen Code möchten Sie die Antwort auch dann schließen, wenn httpclient.execute () eine Ausnahme auslöst
Der obige Code wurde mit getestet
Und für Interessierte ist hier mein vollständiger Testsatz:
(Arbeitstestprojekt in Github )
quelle
Eine kleine Ergänzung zur Antwort von vasekt:
Die mit der SocketFactoryRegistry bereitgestellte Lösung funktioniert bei Verwendung von PoolingHttpClientConnectionManager.
Verbindungen über einfaches http funktionieren dann jedoch nicht mehr. Sie müssen zusätzlich eine PlainConnectionSocketFactory für das http-Protokoll hinzufügen, damit sie wieder funktionieren:
quelle
http
Protokoll wirdPlainConnectionSocketFactory
standardmäßig verwendet. Ich habe mich nur registrierthttps
und diehttpclient
können immer noch einfache HTTP-URLs erhalten. Daher halte ich diesen Schritt nicht für notwendig.PoolingHttpClientConnectionManager
Nachdem Sie verschiedene Optionen ausprobiert hatten, funktionierte die folgende Konfiguration sowohl für http als auch für https
Ich benutze http-client 4.3.3 -
compile 'org.apache.httpcomponents:httpclient:4.3.3'
quelle
Einfacherer und kürzerer Arbeitscode:
quelle
Hier ist eine funktionierende Destillation der oben genannten Techniken, die "curl --insecure" entspricht:
quelle
Bei Verwendung von http client 4.5 musste ich den javasx.net.ssl.HostnameVerifier verwenden, um einen beliebigen Hostnamen zuzulassen (zu Testzwecken). Folgendes habe ich getan:
quelle
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(), hostnameVerifierAllowAll);
mitSSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(), (hostName, sslSession) -> true);
. Es vermeidet anonyme Klassen und macht Code ein wenig lesbarer.Hinzu kommt
PoolingHttpClientConnectionManager
zusammen mitRegistry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create().register("https", sslFactory).build();
Wenn Sie eine asynchrone Httpclient verwendenPoolingNHttpClientConnectionManager
den Code shoudl ähnlich sein folgendenquelle
Wenn Sie verwenden
HttpClient 4.5.x
, kann Ihr Code wie folgt aussehen:quelle
quelle
Vertrauen Sie allen Zertifikaten im Apache HTTP-Client
quelle
(Ich hätte einen Kommentar direkt zu Vasekts Antwort hinzugefügt, aber ich habe nicht genügend Reputationspunkte (nicht sicher, welche Logik dort vorhanden ist).
Wie auch immer ... was ich sagen wollte ist, dass selbst wenn Sie nicht explizit eine PoolingConnection erstellen / anfordern, dies nicht bedeutet, dass Sie keine bekommen.
Ich wurde verrückt, als ich versuchte herauszufinden, warum die ursprüngliche Lösung für mich nicht funktionierte, aber ich ignorierte die Antwort von vasekt, da sie "nicht auf meinen Fall zutraf" - falsch!
Ich starrte auf meine Stapelspur, als sie niedrig war, und siehe, ich sah eine PoolingConnection in der Mitte. Bang - ich habe seine Hinzufügung und seinen Erfolg satt !! (Unsere Demo ist morgen und ich wurde verzweifelt) :-)
quelle
Sie können das folgende Codefragment verwenden, um die HttpClient-Instanz ohne Überprüfung der SSL-Zertifizierung abzurufen.
quelle
Eine leichte Änderung, um von @divbyzero oben zu antworten und Sonar-Sicherheitswarnungen zu beheben
quelle
Anfangs konnte ich localhost mithilfe der Vertrauensstrategie deaktivieren, später fügte ich NoopHostnameVerifier hinzu. Jetzt funktioniert es sowohl für localhost als auch für jeden Computernamen
quelle