J'ai une classe qui téléchargera un fichier à partir d'un serveur https . Lorsque je l'exécute, il renvoie beaucoup d'erreurs. Il semble que j'ai un problème avec mon certificat. Est-il possible d'ignorer l'authentification client-serveur? Si c'est le cas, comment?
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;
}
}
}
Les erreurs:
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
la source
la source
Réponses:
Le problème apparaît lorsque votre serveur possède un certificat auto-signé. Pour contourner ce problème, vous pouvez ajouter ce certificat à la liste des certificats approuvés de votre machine virtuelle Java.
Dans cet article, l' auteur explique comment récupérer le certificat à partir de votre navigateur et l'ajouter au fichier cacerts de votre machine virtuelle Java. Vous pouvez soit modifier le
JAVA_HOME/jre/lib/security/cacerts
fichier, soit exécuter votre application avec un-Djavax.net.ssl.trustStore
paramètre. Vérifiez également le JDK / JRE que vous utilisez, car cela est souvent une source de confusion.Voir aussi: Comment les noms de serveur de certificats SSL sont-ils résolus / Puis-je ajouter d'autres noms à l'aide de keytool? Si vous rencontrez une
java.security.cert.CertificateException: No name matching localhost found
exception.la source
cacerts
doivent être mis à jourVoici ce qui fonctionne de manière fiable pour moi sur macOS. Assurez-vous de remplacer example.com et 443 par le nom d'hôte et le port réels auxquels vous essayez de vous connecter et donnez un alias personnalisé. La première commande télécharge le certificat fourni à partir du serveur distant et l'enregistre localement au format x509. La deuxième commande charge le certificat enregistré dans le magasin de confiance SSL de Java.
la source
J'ai eu le même problème avec un certificat générique signé valide de symantec.
Essayez d'abord d'exécuter votre application java avec -Djavax.net.debug = SSL pour voir ce qui se passe réellement.
J'ai fini par importer le certificat intermédiaire qui provoquait la rupture de la chaîne de certificats.
J'ai téléchargé le certificat intermédiaire manquant depuis symantec (vous pouvez voir le lien de téléchargement vers le certificat manquant dans le journal de prise de contact SSL: http://svrintl-g3-aia.verisign.com/SVRIntlG3.cer dans mon cas).
Et j'ai importé le certificat dans le magasin de clés java. Après avoir importé le certificat intermédiaire, mon certificat SSL générique a finalement commencé à fonctionner:
la source
-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
ouJDK/JRE/bin
keytool -keystore ..\lib\security\cacerts -import -alias your.ssl.server.name -file .\relative-path-to-cert-file\your.ssl.server.name.crt
la source
changeit
( stackoverflow.com/a/22782035/1304830 ). Assurez-vous également d'exécuter cmd en tant qu'administrateur.@Gabe Martin-Dempesy m'a aidé. Et j'ai écrit un petit script qui s'y rapporte. L'utilisation est très simple.
Installez un certificat de l'hôte:
Supprimez le certificat déjà installé.
java-cert-importer.sh
la source
./java-cert-importer.sh example.com 1234
). C'est tout.Citation de No more «impossible de trouver un chemin de certification valide vers la cible demandée»
Essayez le code fourni ici. Ça pourrait aider.
la source
Cela a résolu mon problème,
Nous devons importer le certificat sur la java locale. Sinon, nous pourrions obtenir l'exception ci-dessous.
SSLPOKE est un outil où vous pouvez tester la connectivité https depuis votre machine locale.
Commande pour tester la connectivité:
cela demanderait d'abord "Entrez le mot de passe du magasin de clés:"
changeit
est le mot de passe par défaut. et enfin une invite "Trust this certificate? [no]:", indiquez "yes" pour ajouter le certificat au magasin de clés.Vérification:
la source
J'ai pu le faire fonctionner uniquement avec du code, c'est-à-dire pas besoin d'utiliser keytool:
la source
La source de cette erreur sur mon instance Apache 2.4 (à l'aide d'un certificat générique Comodo) était un chemin incomplet vers le certificat racine signé SHA-1. Il y avait plusieurs chaînes dans le certificat émis et la chaîne menant à un certificat racine SHA-1 manquait un certificat intermédiaire . Les navigateurs modernes savent comment gérer cela, mais Java 7 ne le gère pas par défaut (bien qu'il existe des moyens compliqués pour y parvenir dans le code). Le résultat est des messages d'erreur identiques à ceux des certificats auto-signés:
Dans ce cas, le message «impossible de trouver un chemin de certification valide vers la cible demandée» est généré en raison du certificat intermédiaire manquant. Vous pouvez vérifier quel certificat est manquant à l'aide du test SSL Labs sur le serveur. Une fois que vous avez trouvé le certificat approprié, téléchargez-le et (si le serveur est sous votre contrôle), ajoutez-le à l'ensemble de certificats. Vous pouvez également importer le certificat manquant localement. La résolution de ce problème sur le serveur est une solution plus générale au problème.
la source
Pour Windows uniquement, procédez comme suit:
la source
Pour ceux qui aiment Debian et Java préemballé:
N'oubliez pas de vérifier
/etc/default/cacerts
:Pour supprimer le cert:
la source
Cela peut également être dû à l'utilisation de certificats GoDaddy avec Java 7 signés à l'aide de SHA2.
Chrome et tous les autres navigateurs commencent à déprécier les certificats SSL signés à l'aide de SHA1, car ce n'est pas aussi sécurisé.
Plus d'informations sur le problème peuvent être trouvées ici , ainsi que comment le résoudre sur votre serveur si vous en avez besoin maintenant.
la source
J'ai eu le même problème avec l'erreur de certificats et c'était à cause de SNI, et le client http que j'ai utilisé n'a pas implémenté SNI. Donc, une mise à jour de version a fait le travail
la source
MISE À JOUR: Qu'un redémarrage a aidé était une coïncidence (je l'espérais, hourra!). La véritable cause du problème était la suivante: lorsque Gradle est invité à utiliser un magasin de clés spécifique, ce magasin de clés doit également contenir tous les certificats racine officiels. Sinon, il ne peut pas accéder aux bibliothèques à partir de référentiels réguliers. Ce que je devais faire était ceci:
Importez le certificat auto-signé:
Ajoutez les certificats racine officiels:
Peut-être que le démon Gradle a également gêné. Cela pourrait valoir la peine de tuer tous les démons en cours d'exécution trouvés
./gradlew --status
si les choses semblent sombres.AFFICHAGE ORIGINAL:
Personne ne le croira, je le sais. Pourtant, si tout le reste échoue, essayez-le: après un redémarrage de mon Mac, le problème a disparu. Grrr.
Contexte: ./gradlew jar n'arrêtait pas de me donner "impossible de trouver un chemin de certification valide vers la cible demandée"
Je suis coincé avec un certificat auto-signé, enregistré à partir du navigateur, importé dans privateKeystore.jks. Ensuite, j'ai demandé à Gradle de travailler avec privateKeystore.jks:
Comme mentionné, cela n'a fonctionné qu'après un redémarrage.
la source
La version AVG 18.1.3044 (avec Windows 10) interfère avec mon application Spring locale.
Solution: entrez dans la section AVG intitulée "Web et e-mail" et désactivez la "protection des e-mails". AVG bloque le certificat si le site n'est pas sécurisé.
la source
Assurez-vous que les https://176.66.3.69:6443/ ont un certificat valide. vous pouvez le vérifier via le navigateur d'abord si cela fonctionne dans le navigateur, cela fonctionnera en java.
ça marche pour moi
la source
Il existe de nombreuses façons de résoudre ce problème ...
Une façon consiste à définir les certificats TrustStore dans un fichier de clés et à le placer dans le chemin de l'application, puis à définir ces propriétés système dans la méthode principale:
Vous pouvez également placer le fichier de clés en tant que fichier de ressources dans le fichier jar du projet et le charger:
Dans Windows, vous pouvez également essayer cette solution: https://stackoverflow.com/a/59056537/980442
J'ai créé le fichier de clés à partir d'un fichier d'autorité de certification CA
.crt
de cette manière:Pour info: https://docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
la source
Vous avez deux options, importez le certificat auto-signé dans le magasin de clés de Java pour chaque jvm sur lequel le logiciel s'exécutera ou essayez l'usine ssl non validante:
la source
Eu le problème comme cette image.
J'ai essayé quelques solutions. Mais j'ai trouvé que même si c'est le même projet, quand il est sur le lieu de travail de l'autre, c'est tout à fait bien. Aucun réglage supplémentaire requis. Nous avons donc deviné que c'était un problème d'environnement. Nous avons essayé de changer la version JDK, IDE, mais cela n'a pas fonctionné. il a fallu environ 4 heures pour enquêter, jusqu'à ce que nous essayions la réponse la mieux notée. Je n'ai pas trouvé l'erreur mentionnée dans cette réponse mais j'ai trouvé via mon navigateur sur l'URL HTTP (verrou) qu'il y avait une certification de Charles. Puis j'ai réalisé que mon charles était allumé tout le temps. Tant que je l'ai désactivé, cela fonctionne très bien.
J'ai donc laissé mon expérience qui pourrait être utile pour votre cas.
la source
Dans mon cas, j'utilise MacOs High Sierra avec Java 1.6. Le fichier cacert est dans un emplacement différent de celui mentionné ci-dessus dans la réponse de Gabe Martin-Dempesy. Le fichier cacert était également déjà lié à un autre emplacement (/ Library / Internet Plug-Ins / JavaAppletPlugin.plugin / Contents / Home / lib / security / cacerts).
À l'aide de FireFox, j'ai exporté le certificat du site Web en question vers un fichier local appelé "exportsCertFile.crt". De là, j'ai utilisé keytool pour déplacer le certificat dans le fichier cacert. Cela a résolu le problème.
la source
téléchargez d'abord le certificat ssl puis vous pouvez aller sur votre chemin java bin exécuter la commande ci-dessous dans la console.
la source
Dans mon cas, j'avais le keystore et le truststore ayant le même certificat, donc la suppression du truststore a aidé. Parfois, la chaîne de certificats peut être un problème si vous avez plusieurs copies de certificats.
la source