Mam klasę, która pobierze plik z serwera https . Po uruchomieniu zwraca wiele błędów. Wygląda na to, że mam problem z certyfikatem. Czy można zignorować uwierzytelnianie klient-serwer? Jeśli tak to jak?
package com.da;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.CharBuffer;
import java.util.concurrent.Future;
import org.apache.http.HttpResponse;
import org.apache.http.client.utils.URIUtils;
import org.apache.http.impl.nio.client.DefaultHttpAsyncClient;
import org.apache.http.nio.IOControl;
import org.apache.http.nio.client.HttpAsyncClient;
import org.apache.http.nio.client.methods.AsyncCharConsumer;
import org.apache.http.nio.client.methods.HttpAsyncGet;
import org.apache.http.nio.client.methods.HttpAsyncPost;
public class RSDDownloadFile {
static FileOutputStream fos;
public void DownloadFile(String URI, String Request) throws Exception
{
java.net.URI uri = URIUtils.createURI("https", "176.66.3.69:6443", -1, "download.aspx",
"Lang=EN&AuthToken=package", null);
System.out.println("URI Query: " + uri.toString());
HttpAsyncClient httpclient = new DefaultHttpAsyncClient();
httpclient.start();
try {
Future<Boolean> future = httpclient.execute(
new HttpAsyncGet(uri),
new ResponseCallback(), null);
Boolean result = future.get();
if (result != null && result.booleanValue()) {
System.out.println("\nRequest successfully executed");
} else {
System.out.println("Request failed");
}
}
catch(Exception e){
System.out.println("[DownloadFile] Exception: " + e.getMessage());
}
finally {
System.out.println("Shutting down");
httpclient.shutdown();
}
System.out.println("Done");
}
static class ResponseCallback extends AsyncCharConsumer<Boolean> {
@Override
protected void onResponseReceived(final HttpResponse response) {
System.out.println("Response: " + response.getStatusLine());
System.out.println("Header: " + response.toString());
try {
//if(response.getStatusLine().getStatusCode()==200)
fos = new FileOutputStream( "Response.html" );
}catch(Exception e){
System.out.println("[onResponseReceived] Exception: " + e.getMessage());
}
}
@Override
protected void onCharReceived(final CharBuffer buf, final IOControl ioctrl) throws IOException {
try
{
while (buf.hasRemaining())
{
//System.out.print(buf.get());
fos.write(buf.get());
}
}catch(Exception e)
{
System.out.println("[onCharReceived] Exception: " + e.getMessage());
}
}
@Override
protected void onCleanup() {
try
{
if(fos!=null)
fos.close();
}catch(Exception e){
System.out.println("[onCleanup] Exception: " + e.getMessage());
}
System.out.println("onCleanup()");
}
@Override
protected Boolean buildResult() {
return Boolean.TRUE;
}
}
}
Błędy:
URI Query: https://176.66.3.69:6443/download.aspx?Lang=EN&AuthToken=package
Aug 2, 2011 3:47:57 PM org.apache.http.impl.nio.client.NHttpClientProtocolHandler exception
SEVERE: I/O error: General SSLEngine problem
javax.net.ssl.SSLHandshakeException: General SSLEngine problem
at com.sun.net.ssl.internal.ssl.Handshaker.checkThrown(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLEngineImpl.checkTaskThrown(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLEngineImpl.writeAppRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLEngineImpl.wrap(Unknown Source)
at javax.net.ssl.SSLEngine.wrap(Unknown Source)
at org.apache.http.impl.nio.reactor.SSLIOSession.doHandshake(SSLIOSession.java:154)
at org.apache.http.impl.nio.reactor.SSLIOSession.isAppInputReady(SSLIOSession.java:276)
at org.apache.http.impl.nio.client.InternalClientEventDispatch.inputReady(InternalClientEventDispatch.java:79)
at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:161)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:335)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:275)
at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:542)
at java.lang.Thread.run(Unknown Source)
Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.net.ssl.internal.ssl.Handshaker$DelegatedTask.run(Unknown Source)
at org.apache.http.impl.nio.reactor.SSLIOSession.doHandshake(SSLIOSession.java:180)
... 9 more
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(Unknown Source)
at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
at sun.security.validator.Validator.validate(Unknown Source)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(Unknown Source)
... 16 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
at java.security.cert.CertPathBuilder.build(Unknown Source)
... 21 more
onCleanup()
[DownloadFile] Exception: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
Shutting down
Done
java
ssl
https
ssl-certificate
neztreh
źródło
źródło
Odpowiedzi:
Problem pojawia się, gdy serwer ma samopodpisany certyfikat. Aby obejść ten problem, możesz dodać ten certyfikat do listy zaufanych certyfikatów maszyny JVM.
W tym artykule autor opisuje, jak pobrać certyfikat z przeglądarki i dodać go do pliku cacerts JVM. Możesz edytować
JAVA_HOME/jre/lib/security/cacerts
plik lub uruchomić aplikację z-Djavax.net.ssl.trustStore
parametrem. Sprawdź, którego JDK / JRE używasz, ponieważ często jest to źródłem zamieszania.Zobacz także: Jak są rozwiązywane nazwy serwerów certyfikatów SSL / Czy mogę dodawać alternatywne nazwy za pomocą keytool? Jeśli spotkasz
java.security.cert.CertificateException: No name matching localhost found
wyjątek.źródło
cacerts
muszą być zaktualizowaneOto, co niezawodnie działa dla mnie w systemie macOS. Pamiętaj, aby zastąpić example.com i 443 rzeczywistą nazwą hosta i portem, z którym próbujesz się połączyć, i podać niestandardowy alias. Pierwsze polecenie pobiera dostarczony certyfikat ze zdalnego serwera i zapisuje go lokalnie w formacie x509. Drugie polecenie ładuje zapisany certyfikat do magazynu zaufanych certyfikatów SSL Java.
źródło
Miałem ten sam problem z ważnym podpisanym certyfikatem wieloznacznym z firmy Symantec.
Najpierw spróbuj uruchomić aplikację Java z -Djavax.net.debug = SSL, aby zobaczyć, co się naprawdę dzieje.
W końcu zaimportowałem certyfikat pośredni, który spowodował zerwanie łańcucha certyfikatów.
Pobrałem brakujący certyfikat pośredni z firmy Symantec (link do brakującego certyfikatu można zobaczyć w dzienniku uzgadniania ssl: http://svrintl-g3-aia.verisign.com/SVRIntlG3.cer w moim przypadku).
Zaimportowałem certyfikat do magazynu kluczy Java. Po zaimportowaniu certyfikatu pośredniego mój wildcard ssl cert w końcu zaczął działać:
źródło
-Djavax.net.debug=ssl,handshake -Djavax.net.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.keyStore=our-client-certs -Djavax.net.ssl.trustStoreType=jks -Djavax.net.ssl.trustStore=their-server-certs
JRE_HOME/bin
lubJDK/JRE/bin
keytool -keystore ..\lib\security\cacerts -import -alias your.ssl.server.name -file .\relative-path-to-cert-file\your.ssl.server.name.crt
źródło
changeit
( stackoverflow.com/a/22782035/1304830 ). Pamiętaj też, aby uruchomić cmd jako administrator.Odpowiedź Gabe'a Martina-Dempesy'ego jest mi pomocna. I napisałem krótki skrypt z tym związany. Użycie jest bardzo proste.
Zainstaluj certyfikat z hosta:
Usuń już zainstalowany certyfikat.
java-cert-importer.sh
źródło
./java-cert-importer.sh example.com 1234
.). Otóż to.Cytowanie z „Nie można już znaleźć prawidłowej ścieżki certyfikacji do żądanego celu”
Wypróbuj kod tam podany. To może pomóc.
źródło
To rozwiązało mój problem,
Musimy zaimportować certyfikat do lokalnej Java. Jeśli nie, możemy uzyskać poniższy wyjątek.
SSLPOKE to narzędzie, w którym można przetestować łączność https z lokalnego komputera.
Polecenie przetestowania łączności:
najpierw wyświetli się monit „Wprowadź hasło magazynu kluczy:”
changeit
to hasło domyślne. i na koniec monit „Zaufaj temu certyfikatowi [[nie]:”), wpisz „tak”, aby dodać certyfikat do magazynu kluczy.Weryfikacja:
źródło
Udało mi się sprawić, że działa tylko z kodem, tzn. Nie trzeba używać keytoola:
źródło
Źródłem tego błędu w mojej instancji Apache 2.4 (przy użyciu certyfikatu wieloznacznego Comodo) była niekompletna ścieżka do podpisanego certyfikatu głównego SHA-1. W wydanym certyfikacie było wiele łańcuchów, aw łańcuchu prowadzącym do certyfikatu głównego SHA-1 brakowało certyfikatu pośredniego . Nowoczesne przeglądarki wiedzą, jak sobie z tym poradzić, ale Java 7 domyślnie tego nie obsługuje (chociaż istnieją pewne skomplikowane sposoby osiągnięcia tego w kodzie). Rezultatem są komunikaty o błędach wyglądające identycznie jak w przypadku certyfikatów z podpisem własnym:
W takim przypadku pojawia się komunikat „nie można znaleźć prawidłowej ścieżki certyfikacji do żądanego celu” z powodu braku certyfikatu pośredniego. Możesz sprawdzić, którego certyfikatu brakuje, testując SSL Labs na serwerze. Po znalezieniu odpowiedniego certyfikatu pobierz go i (jeśli serwer jest pod twoją kontrolą) dodaj go do pakietu certyfikatów. Możesz też zaimportować brakujący certyfikat lokalnie. Uwzględnienie tego problemu na serwerze jest bardziej ogólnym rozwiązaniem problemu.
źródło
Tylko w systemie Windows wykonaj następujące kroki:
źródło
Dla tych, którzy lubią Debian i paczkowaną Javę:
Nie zapomnij sprawdzić
/etc/default/cacerts
:Aby usunąć cert:
źródło
Może to być również spowodowane używaniem certyfikatów GoDaddy w Javie 7 podpisanych przy użyciu SHA2.
Chrome i wszystkie inne przeglądarki zaczynają tracić ważność certyfikatów SSL podpisanych przy użyciu SHA1, ponieważ nie jest to tak bezpieczne.
Więcej informacji na temat problemu można znaleźć tutaj , a także, w jaki sposób rozwiązać go na serwerze, jeśli jest to konieczne.
źródło
Miałem ten sam problem z błędem certyfikatów i byłem z powodu SNI, a klient HTTP, którego użyłem, nie miał zaimplementowanego SNI. Tak więc aktualizacja wersji wykonała zadanie
źródło
AKTUALIZACJA: To, że ponowne uruchomienie pomogło, było przypadkowe (miałem nadzieję, hura!). Prawdziwa przyczyna problemu była następująca: gdy Gradle otrzymuje polecenie użycia określonego magazynu kluczy, ten magazyn kluczy musi również zawierać wszystkie oficjalne certyfikaty główne. W przeciwnym razie nie może uzyskać dostępu do bibliotek ze zwykłych repozytoriów. Musiałem to zrobić:
Zaimportuj samopodpisany certyfikat:
Dodaj oficjalne certyfikaty główne:
Może przeszkadzał też demon Gradle. Być może warto zabić wszystkie uruchomione demony,
./gradlew --status
jeśli wszystko zacznie wyglądać ponuro.ORYGINALNE OGŁOSZENIE:
Wiem, że nikt w to nie uwierzy. Mimo to, jeśli wszystko inne zawiedzie, spróbuj: Po ponownym uruchomieniu komputera Mac problem zniknął. Grrr.
Tło: słoik ./gradlew ciągle daje mi „nie mogę znaleźć ważnej ścieżki certyfikacji do żądanego celu”
Utknąłem z samopodpisanym certyfikatem, zapisanym z przeglądarki, zaimportowanym do privateKeystore.jks. Następnie poinstruował Gradle, aby współpracował z privateKeystore.jks:
Jak wspomniano, działało to dopiero po ponownym uruchomieniu.
źródło
AVG w wersji 18.1.3044 (z Windows 10) zakłóca moją lokalną aplikację Spring.
Rozwiązanie: wpisz sekcję AVG o nazwie „Internet i poczta e-mail” i wyłącz „ochronę poczty e-mail”. AVG blokuje certyfikat, jeśli witryna nie jest bezpieczna.
źródło
Upewnij się, że https://176.66.3.69:6443/ ma ważny certyfikat. możesz to najpierw sprawdzić za pomocą przeglądarki, jeśli działa w przeglądarce, będzie działać w Javie.
to działa dla mnie
źródło
Jest wiele sposobów na rozwiązanie tego ...
Jednym ze sposobów jest ustawienie certyfikatów TrustStore w pliku kluczy i umieszczenie go w ścieżce aplikacji oraz ustawienie tych właściwości systemowych w głównej metodzie:
Innym sposobem jest umieszczenie magazynu kluczy jako pliku zasobów w pliku jar projektu i załadowanie go:
W systemie Windows możesz również wypróbować to rozwiązanie: https://stackoverflow.com/a/59056537/980442
Plik magazynu kluczy utworzyłem z pliku CA urzędu certyfikacji
.crt
w następujący sposób:FYI: https://docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
źródło
Masz dwie opcje: zaimportuj samopodpisany certyfikat do magazynu kluczy Java dla każdego pliku JVM, na którym będzie działać oprogramowanie, lub wypróbuj nie sprawdzającą fabrykę ssl:
źródło
Miałem problem taki jak ten obraz.
Wypróbowałem kilka rozwiązań. Ale okazało się, że nawet jeśli jest to ten sam projekt, gdy jest w miejscu pracy drugiego, jest całkowicie w porządku. Nie są wymagane żadne dodatkowe ustawienia. Więc zgadliśmy, że jest to problem środowiskowy. Próbowaliśmy zmienić wersję JDK, IDE, ale nie działało. dochodzenie zajęło około 4 godzin, zanim wypróbowaliśmy najlepiej ocenianą odpowiedź. Nie znalazłem błędu wspomnianego w tej odpowiedzi, ale znalazłem za pośrednictwem przeglądarki HTTP URL (blokada), że istnieje certyfikat Charlesa. Potem zdałem sobie sprawę, że mój Charles był cały czas włączony. Tak długo, jak to wyłączyłem, wszystko działa dobrze.
Opuściłem więc moje doświadczenie, które może być pomocne w twojej sprawie.
źródło
W moim przypadku używam MacOs High Sierra z Javą 1.6. Plik cacert znajduje się w innym miejscu niż wspomniane powyżej w odpowiedzi Gabe Martin-Dempesy. Plik cacert był już również powiązany z inną lokalizacją (/ Library / Internet Plug-Ins / JavaAppletPlugin.plugin / Contents / Home / lib / security / cacerts).
Za pomocą FireFox wyeksportowałem certyfikat z omawianej strony internetowej do lokalnego pliku o nazwie „exportedCertFile.crt”. Stamtąd użyłem keytool do przeniesienia certyfikatu do pliku cacert. To rozwiązało problem.
źródło
najpierw pobierz certyfikat ssl, a następnie przejdź do ścieżki bin Java, wykonaj poniższe polecenie w konsoli.
źródło
W moim przypadku zarówno magazyn kluczy, jak i magazyn zaufanych certyfikatów posiadały ten sam certyfikat, więc usunięcie zaufanego magazynu pomogło. Czasami łańcuch certyfikatów może być problemem, jeśli masz wiele kopii certyfikatów.
źródło