使用Maven和SSL代理背后的问题使用Maven和SSL代理背后的问题(Problems usin

2019-05-09 10:37发布

我刚刚下载的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:无法找到有效的认证路径请求的目标”。

我坐在公司防火墙之后,并且正确的配置都在代理服务器设置httphttps通过访问settings.xml文件。 我怀疑,大家谁下载Maven和运行它首次拥有自营Maven仓库的SSL证书,所以这个问题必须与代理。 有人对这个有经验么?

下面是完整的调试模式(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 version: 1.7.0_45, vendor: Oracle Corporation Java home: C:\Program Files\Java\jdk1.7.0_45\jre Default locale: it_IT, platform encoding: Cp1252 OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows" [DEBUG] Using connector WagonRepositoryConnector with priority 0.0 for https://repo.maven.apache.org/maven2 via *****:8080 with username=*****, password=*** Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom [WARNING] Failed to retrieve plugin descriptor for org.apache.maven.plugins:maven-clean-plugin:2.5: Plugin org.apache.maven.plugins:maven-clean-plugin:2.5 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-clean-plugin:jar:2.5 org.apache.maven.plugin.PluginResolutionException: Plugin org.apache.maven.plugins:maven-clean-plugin:2.5 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-clean-plugin:jar:2.5 at org.apache.maven.plugin.internal.DefaultPluginDependenciesResolver.resolve(DefaultPluginDependenciesResolver.java:122) at org.apache.maven.plugin.internal.DefaultMavenPluginManager.getPluginDescriptor(DefaultMavenPluginManager.java:148) at org.apache.maven.plugin.DefaultBuildPluginManager.loadPlugin(DefaultBuildPluginManager.java:81) at org.apache.maven.plugin.prefix.internal.DefaultPluginPrefixResolver.resolveFromProject(DefaultPluginPrefixResolver.java:138) at org.apache.maven.plugin.prefix.internal.DefaultPluginPrefixResolver.resolveFromProject(DefaultPluginPrefixResolver.java:121) at org.apache.maven.plugin.prefix.internal.DefaultPluginPrefixResolver.resolve(DefaultPluginPrefixResolver.java:85) at org.apache.maven.lifecycle.internal.MojoDescriptorCreator.findPluginForPrefix(MojoDescriptorCreator.java:260) at org.apache.maven.lifecycle.internal.MojoDescriptorCreator.getMojoDescriptor(MojoDescriptorCreator.java:220) at org.apache.maven.lifecycle.internal.DefaultLifecycleTaskSegmentCalculator.calculateTaskSegments(DefaultLifecycleTaskSegmentCalculator.java:103) at org.apache.maven.lifecycle.internal.DefaultLifecycleTaskSegmentCalculator.calculateTaskSegments(DefaultLifecycleTaskSegmentCalculator.java:83) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:85) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:347) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:154) at org.apache.maven.cli.MavenCli.execute(MavenCli.java:582) at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:214) at org.apache.maven.cli.MavenCli.main(MavenCli.java:158) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) Caused by: org.eclipse.aether.resolution.ArtifactDescriptorException: Failed to read artifact descriptor for org.apache.maven.plugins:maven-clean-plugin:jar:2.5 at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:349) at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor(DefaultArtifactDescriptorReader.java:231) at org.eclipse.aether.internal.impl.DefaultRepositorySystem.readArtifactDescriptor(DefaultRepositorySystem.java:288) at org.apache.maven.plugin.internal.DefaultPluginDependenciesResolver.resolve(DefaultPluginDependenciesResolver.java:108) ... 23 more Caused by: org.eclipse.aether.resolution.ArtifactResolutionException: Could not transfer artifact org.apache.maven.plugins:maven-clean-plugin:pom:2.5 from/to central (https://repo.maven.apache.org/maven2): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:459) at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:262) at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:239) at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:334) ... 26 more Caused by: org.eclipse.aether.transfer.ArtifactTransferException: Could not transfer artifact org.apache.maven.plugins:maven-clean-plugin:pom:2.5 from/to central (https://repo.maven.apache.org/maven2): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at org.eclipse.aether.connector.wagon.WagonRepositoryConnector$6.wrap(WagonRepositoryConnector.java:1016) at org.eclipse.aether.connector.wagon.WagonRepositoryConnector$6.wrap(WagonRepositoryConnector.java:1004) at org.eclipse.aether.connector.wagon.WagonRepositoryConnector$GetTask.run(WagonRepositoryConnector.java:725) at org.eclipse.aether.util.concurrency.RunnableErrorForwarder$1.run(RunnableErrorForwarder.java:67) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:744) Caused by: org.apache.maven.wagon.TransferFailedException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at org.apache.maven.wagon.providers.http.AbstractHttpClientWagon.fillInputData(AbstractHttpClientWagon.java:935) at org.apache.maven.wagon.StreamWagon.getInputStream(StreamWagon.java:116) at org.apache.maven.wagon.StreamWagon.getIfNewer(StreamWagon.java:88) at org.apache.maven.wagon.StreamWagon.get(StreamWagon.java:61) at org.eclipse.aether.connector.wagon.WagonRepositoryConnector$GetTask.run(WagonRepositoryConnector.java:660) ... 4 more Caused by: 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 sun.security.ssl.Alerts.getSSLException(Alerts.java:192) at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.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) at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153) at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868) at sun.security.ssl.Handshaker.process_record(Handshaker.java:804) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323) at 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) at org.apache.maven.wagon.providers.http.httpclient.impl.conn.PoolingHttpClientConnectionManager.upgrade(PoolingHttpClientConnectionManager.java:329) at org.apache.maven.wagon.providers.http.httpclient.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:392) at org.apache.maven.wagon.providers.http.httpclient.impl.execchain.MainClientExec.execute(MainClientExec.java:218) at org.apache.maven.wagon.providers.http.httpclient.impl.execchain.ProtocolExec.execute(ProtocolExec.java:194) at org.apache.maven.wagon.providers.http.httpclient.impl.execchain.RetryExec.execute(RetryExec.java:85) at org.apache.maven.wagon.providers.http.httpclient.impl.execchain.RedirectExec.execute(RedirectExec.java:108) at org.apache.maven.wagon.providers.http.httpclient.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:186) at org.apache.maven.wagon.providers.http.httpclient.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) at org.apache.maven.wagon.providers.http.AbstractHttpClientWagon.execute(AbstractHttpClientWagon.java:756) at org.apache.maven.wagon.providers.http.AbstractHttpClientWagon.fillInputData(AbstractHttpClientWagon.java:854) ... 8 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(PKIXValidator.java:385) at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) at sun.security.validator.Validator.validate(Validator.java:260) at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326) at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231) at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1323) ... 27 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:196) at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268) at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380) ... 33 more

Answer 1:

事实是,你的Maven插件尝试连接到HTTPS远程仓库
(例如https://repo.maven.apache.org/maven2/ )

这是对Maven中央一个新的SSL连接在8月份提供2014!

所以,请你能确认你的settings.xml具有正确的配置。

    <settings>
  <activeProfiles>
    <!--make the profile active all the time -->
    <activeProfile>securecentral</activeProfile>
  </activeProfiles>
  <profiles>
    <profile>
      <id>securecentral</id>
      <!--Override the repository (and pluginRepository) "central" from the
         Maven Super POM -->
      <repositories>
        <repository>
          <id>central</id>
          <url>http://repo1.maven.org/maven2</url>
          <releases>
            <enabled>true</enabled>
          </releases>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>central</id>
          <url>http://repo1.maven.org/maven2</url>
          <releases>
            <enabled>true</enabled>
          </releases>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
</settings>

您也可以使用简单的HTTP Maven仓库这样的

 <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <name>Maven Plugin Repository</name>
      <url>http://repo1.maven.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
    </pluginRepository>
  </pluginRepositories>

请让我知道,如果我的解决方案的工作;)

J.



Answer 2:

以上答案是一个很好的工作的解决方案,但在这里是如何做到这一点,如果你想使用SSL回购:

  • 使用浏览器(使用IE)去https://repo.maven.apache.org/
    • 点击锁图标,然后选择“查看证书”
    • 转到“详细信息”选项卡,然后选择“保存到文件”
    • 选择类型为“基地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变量在这里 :



Answer 3:

更新

我只是偶然在这个错误报告:

https://bugs.launchpad.net/ubuntu/+source/ca-certificates-java/+bug/1396760

这似乎是我们的问题的原因在这里。 一些与CA证书的Java遇到错误并没有完全填充的cacerts。 对我来说,这开始发生后,我升级到15.10和这个bug在这个过程可能发生。

解决方法是执行以下命令:

须藤/var/lib/dpkg/info/ca-certificates-java.postinst配置

如果您检查密钥库的内容(如在我原来的答复),你现在看到一大堆更多,包括所需要的DigiCert全球根CA.

如果你通过我原来的答复的过程中去,你可以清理我们增加了运行以下命令(假设你没有指定一个不同的别名)的关键:

须藤密钥工具-delete -alias的myKey -keystore的/ etc / SSL /证书/ JAVA / cacerts中

Maven的现在将正常工作。


原来的答案

我只是想在安迪的回答展开有关将证书和指定密钥库。 这让我开始,并与信息相结合,在其他地方,我能够理解问题并找到另一个(更好?)解决方案。

安迪的回答指定使用Maven一个新的密钥库证书明确。 在这里,我要多一点广阔并添加根证书默认的Java信任。 这允许我使用MVN(和其他Java的东西)没有指定一个密钥。

仅供参考我的操作系统是Ubuntu的15.10与Maven 3.3.3。

基本上,在此设置的缺省Java信任不信任的Maven的回购协议(DigiCert全局根CA)的根证书,因此需要添加。

我在这里找到并下载:

https://www.digicert.com/digicert-root-certificates.htm

然后我发现默认信任的位置,它位于在这里:

的/ etc / SSL /证书/ JAVA / cacerts中

你可以看到,目前在那里有什么证书,运行以下命令:

密钥工具-list -keystore的/ etc / SSL /证书/ JAVA / cacerts中

系统提示时,默认密钥库的密码是“的changeit”(但从来没有人做)。

在我的设置“ DigiCert全局根CA”的指纹不存在(DigiCert调用它上面的链接“指纹”)。 因此,这里是如何添加它:

须藤密钥工具-import -file DigiCertGlobalRootCA.crt -keystore的/ etc / SSL /证书/ JAVA / cacerts中

这应该提示,如果你信任的证书,说的话。

使用keytool -list再次确认键存在。 我没有刻意去指定别名(-alias),所以它弄成这个样子:

的myKey 12月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命令为正常,无需要指定密钥库。



Answer 4:

这可能不是最好的解决办法。 我改变了我的行家从3.3.x到3.2.x. 而这个问题了。



Answer 5:

您可以手动导入SSL证书,只是把它添加到密钥库。

对于Linux用户,

句法:

密钥工具-trustcacerts -keystore / JRE / lib / security中/ cacerts的-storepass的changeit -importcert -alias -file关系

例如:

密钥工具-trustcacerts -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre/lib/security/cacerts -storepass的changeit -importcert -alias关系-file〜/下载/ abc.com-SSL。 CRT



Answer 6:

其实我有同样的问题。

当我运行

MVN清洁套装

在我的Maven项目,我得到了行家的工具这个证书错误。

我跟着@Andy的答案,直到地步,我下载的.cer文件

之后,答案的其余部分我没有工作,但我做了(我的Debian的Linux机器上运行)以下

首先,运行:

密钥工具-list -keystore “的Java路径+”/ JRE / lib / security中/ cacerts中 “”

例如,在我的情况是:

密钥工具-list -keystore / usr / lib中/ JVM / JDK -8-甲骨文ARM32-VFP-hflt / JRE / LIB /安全/ cacerts中

如果询问密码,只需点击进入。

这个命令应该列出所有由java接受SSL证书。 当我跑这条命令,在我来说,我得到了例如93个证书。

现在添加下载的文件.CER通过运行以下命令cacerts文件:

须藤密钥工具-importcert -file /home/hal/Public/certificate_file_downloaded.cer -keystore / usr / lib中/ JVM / JDK -8-甲骨文ARM32-VFP-hflt / JRE /安全/ cacerts中

写你的sudo密码,然后它会问你关于密钥库密码

一个默认为changeit

然后说Ÿ您信任此证书。

如果您运行的命令

密钥工具-list -keystore / usr / lib中/ JVM / JDK -8-甲骨文ARM32-VFP-hflt / JRE / LIB /安全/ cacerts中

再次,在我的情况,我得到了cacerts文件的内容94

这意味着,它已成功添加。



Answer 7:

我得到关于SSL证书同样的错误时,Maven的尝试自动下载必要的模块。
作为补救,我试图实现以上卢克的回答,却发现DigiCert全球根CA证书已经在Java的信任密钥库。

什么帮助我被加入%JAVA_HOME%\bin Path变量(我运行Windows)。 而且%JAVA_HOME%是JDK的位置,而不仅仅是JRE的位置,因为Maven的需要JDK。
我不能肯定它为什么帮助,但它没有。 我绝对相信,这是我改变了嘛。



Answer 8:

如果这个问题发生了HTTPS存储库,铁https://repo.spring.io/milestone你可以尝试用非固定替代: http://repo.spring.io/milestone 。 这就是它



Answer 9:

我跑进了同样的情况这个问题,我写了一个详细的解答到一个相关的问题上堆栈溢出,说明如何更方便地使用GUI工具修改系统的cacerts中。 我认为这是一个有点比使用一次性密钥存储为特定项目或修改Maven的(这可能会导致麻烦的道路)设置好。



Answer 10:

第1步:获取网站的证书内容(你想拥有它的导入为受信任的根)

$ keytool -printcert -rfc -sslserver maven.2xoffice.com*

-----BEGIN CERTIFICATE-----
MIIFNTCCBB2gAwIBAgIHJ73QrVnyJjANBgkqhkiG9w0BAQsFADCBtDELMAkGA1UEBhMCVVMxEDAO
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMxITAfBgNVBAoT
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
...
-----END CERTIFICATE-----
The -rfc option outputs the certificate chain in PEM-encoded format for easy import back into a keystore.

第2步:保存整个事情(包括Begin Certificate和End Certificate行,这是显著在这种情况下)为godaddyg2.pem,并通过导入到我的信任存储:

第3步:导入密钥库中的证书(java的信任密钥库)

$ keytool -importcert -file ./godaddyg2.pem -keystore $JRE_LIB/lib/security/cacerts


Answer 11:

即使我把证书在cacerts中,我仍然得到错误。 打开我们的,我把他们的JRE,而不是JDK / JRE。

有两个密钥库,记住这一点!



Answer 12:

这个问题,我是初,我用的是JDK 1.8.0_31安装证书。 我切换到jdk的1.8.0_191但没有安装证书。

但是,我的项目是工作的罚款,我意识到,它们的依赖已经下载。 所以,他们也只是编译和打包的项目。 但是,这并没有为新的Maven项目,它们的依赖并没有先前下载工作。

解::

  1. 切换到较早的JDK版本(其中有证书已安装)为您的新项目,并做全新安装
  2. 再次下载证书,你最近切换到,然后做清洁安装新的JDK版本


文章来源: Problems using Maven and SSL behind proxy