Basic-Authentifizierung mit HTTPS
Ich bin versucht derzeit, den Zugriff auf eine URL mit HTTP-und HTTPS. Die URL, die ich versuche, auf die grundlegenden Authentifizierung erfordert. Mit HTTP funktioniert es einwandfrei, aber mit HTTPS nicht. Ich bin mir nicht sicher, ob ich etwas hinzufügen müssen anders mit HTTPS. Die URL soll zu mir zurück text, der in key-value-format, das ich laden kann, in eine Properties
Objekt.
Hier ist der code, den ich bisher ausprobiert habe.
if (cpUrl.getProtocol().equals("https")) {
out.println("https", 0);
HttpsURLConnection connection = (HttpsURLConnection) cpUrl.openConnection();
TrustManager[] trustAllCerts = new TrustManager[] { new BusinessIntelligenceX509TrustManager() };
SSLContext sc;
try {
sc = SSLContext.getInstance("SSL");
}
catch (NoSuchAlgorithmException noSuchAlgorithmException) {
return;
}
HostnameVerifier hv = new BusinessIntelligenceHostnameVerifier();
try {
sc.init(null, trustAllCerts, new java.security.SecureRandom());
}
catch (KeyManagementException keyManagementException) {
return;
}
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(hv);
connection.setDoInput(true);
connection.setRequestProperty("Authorization", "Basic " + encode);
connection.setRequestMethod("POST");
connection.connect();
stream = connection.getInputStream();
Properties properties = new Properties();
properties.load(stream);
}
Hier sind die Zertifikat-Klassen
//HTTPS CERTIFICATE CLASSES
class BusinessIntelligenceHostnameVerifier implements HostnameVerifier {
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
}
class BusinessIntelligenceX509TrustManager implements X509TrustManager {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
//no-op
}
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
//no-op
}
}
Die Fehlermeldung, wenn ich entfernen Sie alle Gutschein-code (wie auch mit dem Zeugnis-code):
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1518)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:848)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:818)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1030)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1057)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1041)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:402)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:170)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:133)
at com.tecsys.bi.install.BiInstall2ControlPanelPromptsProcessor.run(BiInstall2ControlPanelPromptsProcessor.java:117)
at java.lang.Thread.run(Thread.java:595)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:221)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:145)
at sun.security.validator.Validator.validate(Validator.java:203)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172)
at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:841)
... 12 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:236)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:194)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:216)
... 17 more
- Wo kommt dein code nicht? Scheitert es im Anschluss-setup im basic-Authentifizierung oder anderswo?
- Es scheitert beim laden der Eigenschaften. Es sagt theres nichts. Obwohl es ist.
- Auf einer anderen Anmerkung, die Umsetzung der Hostnamen verifier und trust-manager-Klassen in der Art und Weise gezeigt, ist überflüssig und unsicher. Wenn Ihr
cacerts
- Datei geladen wurde, werden mit den entsprechenden Zertifikaten, sollten nicht Sie haben ein problem mit der SSL - /TLS-setup-phase. - >', Lassen Sie mich wissen, wenn Sie brauchen, anythign anderes.' -- Die Fehlermeldung natürlich
- Ich nehme an, du meintest diese Zeile -
properties.load(stream);
. - Reynolds ja.
- Ich bin ein wenig verwirrt. Hat der server ein selbst signiertes Zertifikat? Oder ein cert, dessen root-CA nicht bekannt ist Java? Müssen Sie verwenden ein client-cert? Wenn keine der oben genannten, dann HTTPS sollte einfach funktionieren ... ohne benutzerdefinierte Codierung. Die Ausgabe der Basic-Authentifizierung werden sollte, orthogonal, denn das Zeug alles geschieht, nachdem die TLS-Verbindung wurde hergestellt.
- Keines der oben genannten, ich denke, bevor ich ursprünglich kein Schein, code und es war das gleiche wie http, aber ich habe immer Ausnahme zu sagen, dass ich benötigt ein Zertifikat.
- was passiert, wenn Sie besuchen Sie die URL in den browser? Nicht der browser zeigt den Inhalt der Eigenschaft? Außerdem haben Sie auch versucht dumping den Inhalt der Verbindung input-stream in das System.oder einen logger?
- Reynolds, wenn ich Besuch-url in den browser, es fragt mich nach meinem Benutzernamen und Kennwort, und es funktioniert Prima.
- Sorry, ich hätte mehr spezifisch. Dies ist die HTTPS-link, den ich meinte. Auch haben Sie bemerkt, jede HTTP-Umleitungen ausgestellt wird, nach der Anmeldung über den HTTPS-Kanal? Ich bin zu Ahnen, dass das zugrunde liegende Verhalten der server für HTTP und HTTPS, was in einer anderen Antwort für HTTPS.
- Es gibt keine Umleitung.
- greifen nach Strohhalmen jetzt. Ist die Codierung der Reaktion ISO-8859-1 im Falle von HTTPS?
Properties
Objekte geladen werden können-streams und-Dateien nur, wenn die Codierung ist die eine oben genannten. - Reynolds, ich habe einen Fehler gemacht, es schlägt fehl, wenn es versucht, sich zu verbinden. im sorry, ich dachte, es war etwas anderes.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint das problem zu sein mit der Tatsache, dass die Verbindung geöffnet wird, bevor die
SSLContext
undHostNameVerifier
Instanzen geändert werden, für die Verbindung. Dies ist nicht möglich, für die SSL/TLS-handshake erfolgt, noch bevor der Inhalt der Verbindung Lesen aus einerInputStream
.In anderen Worten, die folgende Zeile
sollte nur ausgeführt wird, nachdem die
SSLContext
undHostNameVerifier
s-Instanzen registriert mit derHttpsURLConnection
Klasse.Festsetzung dieser Reihenfolge sollte das problem beheben, für die handshake wird jetzt auftreten, mit den neuen Parametern.