Java-HttpClient-Fehler für die kein SSL-Zertifikat gefunden, das Zertifikat als String innerhalb des Codes?
Ich bin ein bisschen verwirrt bei dem Versuch, zu verwenden HttpClient rufen Sie eine https-site, die verwendet ein selbstsigniertes Zertifikat. Ich habe den code wie unten, die es mir ermöglicht, den Anruf zu tätigen, aber dann bin ich immer die Fehler, wie javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found
heruntergeladen habe ich das Zertifikat von meinem browser und verstehen kann ich importieren Sie Sie in die keystore-aber ich würde lieber legen Sie Sie einfach in den code und verwenden Sie es auf diese Weise, gibt es eine Möglichkeit, dies zu tun?
HttpClient client = new HttpClient();
EasySSLProtocolSocketFactory easySSLProtocolSocketFactory = new EasySSLProtocolSocketFactory();
Protocol https = new Protocol("https", easySSLProtocolSocketFactory,
443);
Protocol.registerProtocol("https", https);
BufferedReader br = null;
String responseString = "";
GetMethod method = new GetMethod(path);
int returnCode = client.executeMethod(method);
- Warum auf der Erde würden Sie es in den code? Was passiert, wenn das server-Zertifikat abgelaufen ist und Sie einen neuen bekommen? Tun Sie das nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorausgesetzt, das Zertifikat ist im PEM-format. Sie einbetten zu können in den code und verwenden Sie BouncyCastle's
PEMReader
machen es zu einemX509Certificate
Instanz. Sobald dies geschehen ist, erstellen Sie eineKeyStore
Instanz im Speicher und setzen Sie das X. 509 Zertifikat. Anschließend instanziieren Sie ein neuesSSLContext
mit, dassKeyStore
wie die trust store und machen Sie Ihr HTTP-client benutzen.Dieser würde dann so Aussehen (nicht ausprobiert, denken Sie daran, schließen Sie Leser an und fangen Sie die Ausnahmen...):
Verwenden Sie dann diese
SSLContext
für Ihre Verbindung. Sie können dies tun, mit Apache HttpClient ist SSLSocketFactory wenn Sie mit der version 4.x (oder diese wenn Sie mit version 3.x). Ich würde vorschlagen, mit Apache HttpClient 4.x heute.EasySSLProtocolSocketFactory
in meinem code? Irgendwelche Tipps, dies zu benutzen ist sehr geschätztSSLSocketFactory
ich gelinkt hast ist für den Apache HttpClient 4. Sie scheinen mit Apache HttpClient 3 (in dem Fall könnte man die eine aus jSSLutils). Wenn Sie nicht den Umgang mit legacy-code, der verwendet HttpClient-3, könnte man genauso gut ein upgrade auf die version 4, ab version 3 wird nicht mehr unterstützt. (Ich spreche vonjavax.net.ssl.SSLContext
)Gebäude auf Antwort von Alexander Chzhen und für HttpClient 4.3 ich zuerst einen Kontext erstellen, der vertraut allen:
Dann die client-generator:
ist und ich nur den Rahmen. Ich glaube nicht, verwenden setSSLSocketFactory, weil es behindert setHostnameVerifier unten:
Schließlich habe ich ein hostname verifier überprüft dann alle:
Schließlich bauen die AUFTRAGGEBER:
Wenn Sie möchten, akzeptieren Sie nur das Zertifikat aber nicht alle selbst signierten Zertifikate, dann sollten Sie laden Sie das Zertifikat herunter und speichern Sie die
pem
Datei irgendwo.Jetzt können Sie diesen code verwenden, um das laden der
pem
- Datei, erstellen Sie eine neue truststore mit diesem Zertifikat, und verwenden Sie die truststore-für IhrenHttpClient
.Dies ist, wie Apache HttpClient 4.3, akzeptieren, selbst-signierte Zertifikate:
Nun zum ausführen von POST-oder GET-Anfragen verwenden Sie standard Methode execute:
Erinnerung: Sie sind verwundbar, wenn Sie Vertrauen, selbst-signiertes Zertifikat.
In vielen Situationen, Zertifikat-pinning könnte besser sein, das hardcoding einem bestimmten Zertifikat.
Ja, Sie können hartcodieren ein Zertifikat in Ihren code, und das wird funktionieren und sicher zu sein. Es ist ein durchaus vernünftiger Ansatz. Jedoch, gibt es einige Nachteile. Ein Fallstrick ist, dass schließlich das Zertifikat abläuft, und dann wird Ihre app wird nicht mehr funktionieren. Auch, wenn Sie jemals wollen, ändern Sie Ihre privaten Schlüssel, werden Sie nicht in der Lage.
Daher in vielen Szenarien, mit Zertifikats-pinning ist flexibler und vorzuziehen. Sehen hier für Referenzen, wie zu implementieren Zertifikat-pinning.