In einer Anwendung mit Apache HttpClient 4 bedeutet ein HTTPS-Ziel nicht, dass jede Verbindung mit TLS beginnt. Ein gewöhnlicher HTTP-Proxy wird über eine unverschlüsselte Verbindung erreicht, bevor CONNECT den Tunnel öffnet und TLS in Richtung Ziel geschichtet wird.

Wenn ein eigener Connection-Manager nur https registriert, kann der erste Proxy-Hop mit UnsupportedSchemeException: http protocol is not supported fehlschlagen.

Für die 4.5-API müssen beim Aufbau dieses Managers beide Factories eingetragen werden:

var registry = RegistryBuilder.<ConnectionSocketFactory>create()
    .register("http", PlainConnectionSocketFactory.getSocketFactory())
    .register("https", tlsFactory)
    .build();

var manager = new PoolingHttpClientConnectionManager(registry);
var client = HttpClients.custom()
    .setConnectionManager(manager)
    .setProxy(new HttpHost("proxy.example.net", 8080, "http"))
    .build();

tlsFactory ist die vorhandene SSLConnectionSocketFactory der Anwendung mit ihrer beabsichtigten Vertrauens- und Hostnamenprüfung. Die gezeigten Typen gehören zu den org.apache.http-Paketen von Apache 4. Das Fragment setzt die lokale Variableninferenz von Java voraus; älterer Java-Quellcode kann explizite Typen verwenden.

Hängen Sie den korrigierten Manager an den Client, der für die Anfrage tatsächlich verwendet wird. Für eine erlaubte öffentliche HTTPS-Anfrage ohne Proxy-Authentifizierung kann ein HTTP-Eintrag aus der HTTP-Proxy-Liste die Proxy-Adresse von HttpHost füllen. Ein anderer Builder aktualisiert einen bereits erstellten Client nicht.

Prüfen Sie außerdem die Eigentümerschaft des Builders: Laut HttpClientBuilder kann ein ausdrücklich übergebener Connection-Manager die separaten SSL-Konfigurationseingaben überschreiben. Legen Sie die benötigten Factories in der Registry des Managers ab, statt anzunehmen, ein späterer setSSLContext-Aufruf ersetze dessen Interna.

Diese Diagnose betrifft die lokale Scheme-Registry. Eine Proxy-Authentifizierungsaufforderung oder ein abgelehntes Ziel ist ein späteres, anderes Ergebnis. Behalten Sie beide Factory-Registrierungen bei, während Sie diese Antworten untersuchen.

Ähnliche Artikel