web-dev-qa-db-fra.com

scala sbt et proxy d'entreprise - SunCertPathBuilderException

Lorsque j'essaie d'utiliser SBT, certains fichiers ne peuvent pas être téléchargés avec l'erreur suivante:

Erreur d'accès au serveur: Sun.security.validator.ValidatorException: échec de la création du chemin PKIX: Sun.security.provider.certpath.SunCertPathBuilderException: impossible de trouver un chemin de certification valide vers l'url cible demandée = https: //repo1.maven. org/maven2/org/scala-sbt/sbt/1.0.0-M4/sbt-1.0.0-M4.jar

J'ai suivi quelques conseils sur Stack Overflow et importé le certificat SSL du proxy d'entreprise avec le Java keytool comme décrit dans: problème de certificat SSL dans un proxy de service Web

Il ne semble pas affecter l'outil SBT. A-t-il l'air dans un magasin de clés différent? Des idées?

Si je colle l'URL sur le navigateur, le fichier est téléchargé.

J'obtiens cette erreur en exécutant simplement l'outil SBT que j'ai installé. Lorsque j'essaie de créer un projet SBT sur IntelliJ Idea et de le mettre à jour, cela me donne la même erreur avec différentes URL. Même chose lorsque vous essayez d'utiliser l'activateur Lightbend.

11
Thiago Sayão

Cela se produit donc lorsque vous êtes derrière un proxy et que nous avons besoin que le certificat du serveur proxy soit ajouté au magasin de confiance Java

cp $Java_HOME/jre/lib/security/cacerts <some accessible dir>/
# Get the certificate of the proxy server and store it in a file-proxy.pem
keytool -keystore caerts -import -file proxy.pem -alias my_proxy
# Now we can invoke sbt with following config
sbt  "-Djavax.net.ssl.trustStore=/path/to/included/proxycert/cacerts" compile
8
user3169330

Si je me souviens bien, SBT utilise indirectement une ancienne version de Apache commons httpclient (3.1) qui ne respecte pas les propriétés système Java pour spécifier les magasins de clés de confiance par défaut).

Je peux penser à trois solutions potentielles:

  1. Utilisez un référentiel proxy comme artificiel pour que SBT ne puisse que se connecter au proxy et que le proxy puisse s'occuper de https vers l'extérieur via le proxy d'entreprise.

  2. Installez le certificat émetteur d'entreprise dans le magasin de clés de confiance par défaut pour la JVM (généralement %JDK_HOME%/jre/lib/security/cacerts). Vous devrez le faire chaque fois que vous exécutez un nouveau JRE.

  3. Essayez d'utiliser coursier . C'est un plugin pour SBT qui fournit une manière différente de récupérer les dépendances qui ne passe pas par Apache httpclient. Il utilise une bibliothèque http qui, je pense, devrait respecter les propriétés du système Java pour truststore. C'est aussi beaucoup plus rapide.

3
Brian Smith

Cela a résolu le problème:

Ajoutez -Djavax.net.ssl.trustStore = "C:\Program Files\Java\jre1.8.0_121\lib\security\cacerts" au fichier de configuration sbt (sbtconfig).

Si vous utilisez IntelliJ Idea, cliquez sur "SBT Settings" -> JVM Options -> VM Parameters et ajoutez la même ligne.

Le chemin est le chemin vers le fichier cacerts qui réside sur le chemin JDK -> lib -> sécurité.

Il est nécessaire d'importer le certificat proxy avec l'outil de magasin de clés, comme décrit dans: problème de certificat SSL dans un proxy de service Web

2
Thiago Sayão

Cette erreur peut également se produire si vous utilisez une version Java obsolète. J'ai cette erreur en utilisant Java version 1.8.0_45-b14. La mise à jour vers Java version 11.0.2 + 7 (2018-10-16) l'a résolu pour moi.

Juste pour référence, le message d'erreur complet que j'ai reçu était:

[erreur] typesafe-ivy-releases: impossible d'obtenir la ressource pour com.geirsson # sbt-scalafmt; 1.6.0-RC4: res = https://repo.typesafe.com/typesafe/ivy-releases/ com.geirsson/sbt-scalafmt/1.6.0-RC4/jars/sbt-scalafmt.jar : javax.net.ssl.SSLHandshakeException: Sun.security.validator.ValidatorException: échec de la création du chemin PKIX: Sun.security. provider.certpath.SunCertPathBuilderException: impossible de trouver un chemin de certification valide vers la cible demandée

Le passage à la nouvelle version Java l'a résolu instantanément.

1

Sur MacOS, je l'ai résolu en exécutant la commande sbt avec Sudo.

0
Vlad