Проблемы с использованием Maven и SSL за прокси-сервером
Я только что загрузил Maven и пытался запустить простую команду, найденную на странице «Maven за пять минут» ( http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html ). Это команда:
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Когда я запускаю его, я получаю сообщение об ошибке с сертификатом SSL и не могу загрузить его из центрального репозитория Maven по адресу https://repo.maven.apache.org/maven2 . Ошибка: «SunCertPathBuilderException: невозможно найти допустимый путь сертификации для запрошенной цели».
Я сижу за корпоративным брандмауэром и правильно настроил параметры прокси для доступа http
и https
через файл settings.xml
. Я сомневаюсь, что каждый, кто загружает Maven и запускает его в первый раз, должен импортировать сертификат SSL в repository Maven, поэтому проблема должна быть с прокси-сервером. У кого-нибудь есть опыт?
- Facebook JavaScript SDK через HTTPS, загрузка незащищенных элементов
- Как заставить прокси-сервер charles работать с nougat 7 Android?
- Получение ошибки сертификата в IE и Chrome, но открывается в FireFox
- Игнорирование сертификата SSL в Apache HttpClient 4.3
- Каков правильный способ безопасного отключения сокета SSL asio?
Вот трассировка стека в полном режиме отладки (-X):
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-11T22: 58: 10 + 02: 00) Maven home: C: \ Projects \ maven \ bin .. Java-версия: 1.7.0_45, поставщик: Oracle Corporation Java home: C : \ Program Files \ Java \ jdk1.7.0_45 \ jre Язык по умолчанию: it_IT, кодировка платформы: Cp1252 Название ОС: “windows 7”, версия: “6.1”, arch: “amd64”, family: “windows” [DEBUG] Использование соединителя WagonRepositoryConnector с приоритетом 0.0 для https://repo.maven.apache.org/maven2 через *****: 8080 с именем пользователя = *****, password = *** Загрузка: https: // repo. maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom [WARNING] Не удалось получить дескриптор плагина для org.apache.maven.plugins: maven-clean-plugin: 2.5: Плагин org.apache.maven.plugins: maven-clean-plugin: 2.5 или одна из его зависимостей не может быть разрешена: Не удалось прочитать дескриптор артефакта для org.apache.maven.plugins: maven- clean-plugin: jar: 2.5 org.apache.maven.plugin.PluginResolutionException: плагин org.apache.maven.pl ugins: maven-clean-plugin: 2.5 или одна из его зависимостей не может быть решена: не удалось прочитать дескриптор артефакта для org.apache.maven.plugins: maven-clean-plugin: jar: 2.5 at org.apache.maven.plugin .internal.DefaultPluginDependenciesResolver.resolve (DefaultPluginDependenciesResolver.java:122) в org.apache.maven.plugin.internal.DefaultMavenPluginManager.getPluginDescriptor (DefaultMavenPluginManager.java:148) в org.apache.maven.plugin.DefaultBuildPluginManager.loadPlugin (DefaultBuildPluginManager.java : 81) at org.apache.maven.plugin.prefix.internal.DefaultPluginPrefixResolver.resolveFromProject (DefaultPluginPrefixResolver.java:138) в org.apache.maven.plugin.prefix.internal.DefaultPluginPrefixResolver.resolveFromProject (DefaultPluginPrefixResolver.java:121) в org.apache.maven.plugin.prefix.internal.DefaultPluginPrefixResolver.resolve (DefaultPluginPrefixResolver.java:85) в org.apache.maven.lifecycle.internal.MojoDescriptorCreator.findPluginForPrefix (MojoDescriptorCreator.java:260) в org .apache.maven.lifecycle.internal.MojoDescriptorCreator.getMojoDescriptor (MojoDescriptorCreator.java:220) в org.apache.maven.lifecycle.internal.DefaultLifecycleTaskSegmentCalculator.calculateTaskSegments (DefaultLifecycleTaskSegmentCalculator.java:103) в org.apache.maven.lifecycle.internal .DefaultLifecycleTaskSegmentCalculator.calculateTaskSegments (DefaultLifecycleTaskSegmentCalculator.java:83) в org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:85) в org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:347) в org.apache.maven.DefaultMaven.execute (DefaultMaven.java:154) на org.apache.maven.cli.MavenCli.execute (MavenCli.java:582) на org.apache.maven.cli.MavenCli.doMain (MavenCli. java: 214) at org.apache.maven.cli.MavenCli.main (MavenCli.java:158) at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) на sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingM ethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:606) в org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289) на org.codehaus.plexus .classworlds.launcher.Launcher.launch (Launcher.java:229) в org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:415) в org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:356) Вызвано: org.eclipse.aether.resolution.ArtifactDescriptorException: Не удалось прочитать дескриптор артефакта для org.apache.maven.plugins: maven-clean-plugin: jar: 2.5 at org.apache.maven. repository.internal.DefaultArtifactDescriptorReader.loadPom (DefaultArtifactDescriptorReader.java:349) в org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor (DefaultArtifactDescriptorReader.java:231) в org.eclipse.aether.internal.impl.DefaultRepositorySystem.readArtifactDescriptor ( DefaultRepositorySystem.java:288) на org.apache.maven.plugin.internal.DefaultPluginDep endenciesResolver.resolve (DefaultPluginDependenciesResolver.java:108) … 23 more Причинено: org.eclipse.aether.resolution.ArtifactResolutionException: Не удалось передать артефакт org.apache.maven.plugins: maven-clean-plugin: pom: 2.5 из / to central ( https://repo.maven.apache.org/maven2 ): sun.security.validator.ValidatorException: не удалось создать путь PKIX: sun.security.provider.certpath.SunCertPathBuilderException: не удалось найти допустимый путь сертификации для запроса target at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve (DefaultArtifactResolver.java:459) в org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts (DefaultArtifactResolver.java:262) в org.eclipse.aether. internal.impl.DefaultArtifactResolver.resolveArtifact (DefaultArtifactResolver.java:239) в org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom (DefaultArtifactDescriptorReader.java:334) … 26 more Причиняется: org.eclipse.aether.transfer .ArtifactTransferExceptio n: Не удалось передать артефакт org.apache.maven.plugins: maven-clean-plugin: pom: 2.5 от / до центра ( https://repo.maven.apache.org/maven2 ): sun.security.validator.ValidatorException : Не удалось создать путь PKIX: sun.security.provider.certpath.SunCertPathBuilderException: не удалось найти допустимый путь сертификации для запрошенной цели на org.eclipse.aether.connector.wagon.WagonRepositoryConnector $ 6.wrap (WagonRepositoryConnector.java:1016) в org. eclipse.aether.connector.wagon.WagonRepositoryConnector $ 6.wrap (WagonRepositoryConnector.java:1004) на org.eclipse.aether.connector.wagon.WagonRepositoryConnector $ GetTask.run (WagonRepositoryConnector.java:725) на org.eclipse.aether.util .concurrency.RunnableErrorForwarder $ 1.run (RunnableErrorForwarder.java:67) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1145) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:615) на java.lang.Thread.run (Thread.java:744) Вызвано: org.apache.maven.wagon.Transf erFailedException: sun.security.validator.ValidatorException: Не удалось создать путь PKIX: sun.security.provider.certpath.SunCertPathBuilderException: не удалось найти допустимый путь сертификации для запрошенной цели на org.apache.maven.wagon.providers.http.AbstractHttpClientWagon.fillInputData (AbstractHttpClientWagon.java:935) в org.apache.maven.wagon.StreamWagon.getInputStream (StreamWagon.java:116) в org.apache.maven.wagon.StreamWagon.getIfNewer (StreamWagon.java:88) в org.apache. maven.wagon.StreamWagon.get (StreamWagon.java:61) на org.eclipse.aether.connector.wagon.WagonRepositoryConnector $ GetTask.run (WagonRepositoryConnector.java:660) … еще 4 вызвано: javax.net.ssl .SSLHandshakeException: sun.security.validator.ValidatorException: Не удалось создать путь PKIX: sun.security.provider.certpath.SunCertPathBuilderException: не удалось найти допустимый путь сертификации для запрошенной цели на sun.security.ssl.Alerts.getSSLException (Alerts.java: 192) на sun.security.ssl.SSLSocketImpl.fatal (SSLSocketIm pl.java:1884) at sun.security.ssl.Handshaker.fatalSE (Handshaker.java:276) at sun.security.ssl.Handshaker.fatalSE (Handshaker.java:270) at sun.security.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:1341) на sun.security.ssl.ClientHandshaker.processMessage (ClientHandshaker.java:153) на sun.security.ssl.Handshaker.processLoop (Handshaker.java:868) на sun.security.ssl.Handshaker. process_record (Handshaker.java:804) на sun.security.ssl.SSLSocketImpl.readRecord (SSLSocketImpl.java:1016) на sun.security.ssl.SSLSocketImpl.performInitialHandshake (SSLSocketImpl.java:1312) на sun.security.ssl.SSLSocketImpl .startHandshake (SSLSocketImpl.java:1339) на sun.security.ssl.SSLSocketImpl.startHandshake (SSLSocketImpl.java:1323) в org.apache.maven.wagon.providers.http.httpclient.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket (SSLConnectionSocketFactory .java: 280) at org.apache.maven.wagon.providers.http.httpclient.impl.conn.HttpClientConnectionOperator.upgrade (HttpClientConnectionOperator .java: 167). .execchain.MainClientExec.establishRoute (MainClientExec.java:392) в org.apache.maven.wagon.providers.http.httpclient.impl.execchain.MainClientExec.execute (MainClientExec.java:218) на org.apache.maven.wagon .providers.http.httpclient.impl.execchain.ProtocolExec.execute (ProtocolExec.java:194) в org.apache.maven.wagon.providers.http.httpclient.impl.execchain.RetryExec.execute (RetryExec.java:85) на org.apache.maven.wagon.providers.http.httpclient.impl.execchain.RedirectExec.execute (RedirectExec.java:108) на org.apache.maven.wagon.providers.http.httpclient.impl.client.InternalHttpClient. doExecute (InternalHttpClient.java:186) в org.apache.maven.wagon.providers.http.httpclient.impl.client.CloseableHttpClient.execute (CloseableHttpClient.java:82) на org.apache.maven.wagon.provide rs.http.AbstractHttpClientWagon.execute (AbstractHttpClientWagon.java:756) на org.apache.maven.wagon.providers.http.AbstractHttpClientWagon.fillInputData (AbstractHttpClientWagon.java:854) … еще 8 Причина: sun.security.validator .ValidatorException: Не удалось создать путь PKIX: sun.security.provider.certpath.SunCertPathBuilderException: не удалось найти допустимый путь сертификации для запрошенной цели на sun.security.validator.PKIXValidator.doBuild (PKIXValidator.java:385) at sun.security.validator .PKIXValidator.engineValidate (PKIXValidator.java:292) на sun.security.validator.Validator.validate (Validator.java:260) на sun.security.ssl.X509TrustManagerImpl.validate (X509TrustManagerImpl.java:326) на sun.security. ssl.X509TrustManagerImpl.checkTrusted (X509TrustManagerImpl.java:231) на sun.security.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java:126) на sun.security.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:1323) … 27 more Причинение: sun.security.provider. certpath.SunCertPathBuilderException: не удалось найти допустимый путь сертификации для запрошенной цели на sun.security.provider.certpath.SunCertPathBuilder.engineBuild (SunCertPathBuilder.java:196) в java.security.cert.CertPathBuilder.build (CertPathBuilder.java:268) в sun.security.validator.PKIXValidator.doBuild (PKIXValidator.java:380) … еще 33
- Самоподписанный сертификат SSL или CA?
- Самоподписанный SSL-прием на Android
- javax.net.ssl.SSLHandshakeException: удаленное подключение к удаленному хосту во время рукопожатия во время веб-службы Communicaiton
- GMail и SSL Encryption - сколько зашифровано
- Почему некоторые веб-сайты отображают название компании рядом с URL-адресом?
- Как исправить ошибку «java.security.cert.CertificateException: нет альтернативных имен объектов»?
- Как я могу работать с NET: ERR_CERT_AUTHORITY_INVALID в Chrome?
- Как разрешены имена серверов сертификатов SSL / Можно ли добавлять альтернативные имена с помощью keytool?
Дело в том, что ваш плагин maven пытается подключиться к удаленному репозиторию https
(например, https://repo.maven.apache.org/maven2/ )
Это новая возможность подключения SSL для Maven Central была доступна в августе 2014 года!
Поэтому, пожалуйста, можете ли вы проверить, что ваш settings.xml имеет правильную конфигурацию.
securecentral securecentral central http://repo1.maven.org/maven2 true central http://repo1.maven.org/maven2 true
Вы также можете использовать простой почтовый хранилище http maven
по
central Maven Plugin Repository http://repo1.maven.org/maven2 default false never
central Maven Plugin Repository http://repo1.maven.org/maven2 default false never
Пожалуйста, дайте мне знать, если мое решение работает;)
J.
Ответ выше – хорошее рабочее решение, но вот как это сделать, если вы хотите использовать SSL-репо:
- Используйте браузер (я использовал IE), чтобы перейти на https://repo.maven.apache.org/
- Нажмите на значок блокировки и выберите «Просмотреть сертификат»
- Перейдите на вкладку «Подробности» и выберите «Сохранить в файл»,
- Выберите тип «Base 64 X.509 (.CER)» и сохраните его где-нибудь
-
Теперь откройте командную строку и введите (используйте свои собственные пути):
keytool -import -file C:\temp\mavenCert.cer -keystore C:\temp\mavenKeystore
-
Теперь вы можете снова запустить команду с параметром
-Djavax.net.ssl.trustStore=C:\temp\mavenKeystore
-
Под linux используйте абсолютный путь
-Djavax.net.ssl.trustStore=/tmp/mavenKeystore
в противном случае это произойдет
-
Как это:
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false -Djavax.net.ssl.trustStore=C:\temp\mavenKeystore
Необязательный:
Вы можете использовать MAVEN_OPTS
окружения MAVEN_OPTS
чтобы вам не пришлось беспокоиться об этом снова. Подробнее о переменной MAVEN_OPTS
здесь :
Обновить
Я просто наткнулся на этот отчет об ошибке:
https://bugs.launchpad.net/ubuntu/+source/ca-certificates-java/+bug/1396760
Это, по-видимому, является причиной наших проблем. Что-то с ca-certificate-java встречает ошибку и не полностью заполняет cacerts. Для меня это началось после обновления до 15.10, и эта ошибка, вероятно, произошла во время этого процесса.
Обходным путем является выполнение следующей команды:
sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure
Если вы проверите содержимое хранилища ключей (как и в моем первоначальном ответе), вы увидите больше целой группы, включая необходимый DigiCert Global Root CA.
Если вы выполнили этот процесс в своем первоначальном ответе, вы можете очистить ключ, который мы добавили, выполнив эту команду (при условии, что вы не указали другой псевдоним):
sudo keytool -delete -alias mykey -keystore / etc / ssl / certs / java / cacerts
Теперь Maven будет работать нормально.
Оригинальный ответ
Я просто хотел бы расширить ответ Энди о добавлении сертификата и определении хранилища ключей. Это заставило меня начать, и в сочетании с информацией в других местах я смог понять проблему и найти другое (лучшее?) Решение.
Ответ Энди определяет новое хранилище ключей с сертификатом Maven. Здесь я собираюсь немного шире и добавлю корневой сертификат в хранилище java по умолчанию. Это позволяет мне использовать mvn (и другие java-файлы) без указания хранилища ключей.
Для справки моя ОС – Ubuntu 15.10 с Maven 3.3.3.
В принципе, в этом установочном хранилище по умолчанию java не доверяет корневому сертификату Maven repo (DigiCert Global Root CA), поэтому его необходимо добавить.
Я нашел его здесь и скачал:
https://www.digicert.com/digicert-root-certificates.htm
Затем я нашел местоположение доверия по умолчанию, которое находится здесь:
/ и т.д. / SSL / Certs / Java / cacerts
Вы можете видеть, какие сертификаты в настоящее время находятся там, выполнив эту команду:
keytool -list -keystore / etc / ssl / certs / java / cacerts
Когда будет предложено, пароль хранилища ключей по умолчанию «changeit» (но никто никогда не делает).
В моей настройке отпечаток «DigiCert Global Root CA» не существовал (DigiCert называет его «отпечаток пальца» в ссылке выше). Итак, вот как это добавить:
sudo keytool -import -file DigiCertGlobalRootCA.crt -keystore / etc / ssl / certs / java / cacerts
Это должно спросить, доверяете ли вы сертификату, скажите «да».
Повторно используйте keytool -list, чтобы проверить, существует ли ключ. Я не стал указывать псевдоним (-alias), так что это закончилось следующим образом:
mykey, 2 декабря 2015 г., trustedCertEntry, отпечаток сертификата (SHA1): A8: 98: 5D: 3A: 65: E5: E5: C4: B2: D7: D6: 6D: 40: C6: DD: 2F: B1: 9C : 54: 36
Затем мне удалось запустить команды mvn как обычно, не нужно указывать хранилище ключей.
Это не может быть лучшим решением. Я изменил свой maven с 3.3.x до 3.2.x. И эта проблема исчезла.
Вы можете импортировать сертификат SSL вручную и просто добавить его в хранилище ключей.
Для пользователей Linux,
Синтаксис:
keytool -trustcacerts -keystore / jre / lib / security / cacerts -storepass changeit -importcert -alias nexus -file
Пример :
keytool -trustcacerts -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre/lib/security/cacerts -storepass changeit -importcert -alias nexus -file ~ / Downloads / abc.com-ssl. катодно-лучевая трубка
У меня на самом деле была та же проблема.
когда я бегу
mvn clean package
в моем проекте maven, я получаю эту ошибку сертификата с помощью инструмента maven.
Я последовал за ответом @Andy до момента, когда я загрузил файл .cer
после этого остальная часть ответа не сработала для меня, но я сделал следующее (я работаю на Linux-машине Debian)
в первую очередь, запустить:
keytool -list -keystore “Java path +” / jre / lib / security / cacerts “”
например, в моем случае это:
keytool -list -keystore / usr / lib / jvm / jdk-8-oracle-arm32-vfp-hflt / jre / lib / security / cacerts
если он спрашивает о пароле, просто нажмите enter.
эта команда должна отображать все сертификаты ssl, принятые java. когда я запускал эту команду, в моем случае я получил 93 сертификата, например.
Теперь добавьте загруженный файл .cer в файл cacerts , выполнив следующую команду:
sudo keytool -importcert -file /home/hal/Public/certificate_file_downloaded.cer -keystore / usr / lib / jvm / jdk-8-oracle-arm32-vfp-hflt / jre / security / cacerts
напишите свой пароль sudo, тогда он спросит вас о пароле хранилища ключей
по умолчанию используется changeit
затем скажите y, что вы доверяете этому сертификату.
если вы запустите команду
keytool -list -keystore / usr / lib / jvm / jdk-8-oracle-arm32-vfp-hflt / jre / lib / security / cacerts
еще раз, в моем случае, я получил 94 содержимого файла cacerts
это означает, что оно было добавлено успешно.
Если эта проблема возникает для репозитория HTTPS , fe https://repo.spring.io/milestone вы можете просто попытаться заменить не защищенным: http://repo.spring.io/milestone . Вот и все
Я получал ту же ошибку в отношении SSL-сертификата, когда Maven попытался автоматически загрузить необходимые модули.
В качестве средства защиты я пытался выполнить ответ Luke выше, но обнаружил, что сертификат DigiCert Global Root CA уже находится в надежном хранилище ключей Java.
Что помогло мне добавить %JAVA_HOME%\bin
в переменную Path (я запускаю Windows). И %JAVA_HOME%
– это место JDK, а не только место JRE, так как Maven нуждается в JDK.
Я не уверен, почему это помогло, но так оно и было. Я абсолютно уверен, что это единственное, что я изменил.