我刚刚下载了Maven并试图运行"Maven in Five Minutes"页面上的简单命令(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证书的错误,无法从https://repo.maven.apache.org/maven2的中央Maven存储库下载 . 错误是"SunCertPathBuilderException: unable to find valid certification path to requested target" .
我坐在公司防火墙后面并通过 settings.xml
文件正确配置了 http
和 https
访问的代理设置 . 我怀疑所有下载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版本: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”,系列:“windows”[DEBUG]使用连接器WagonRepositoryConnector优先级为0.0表示https://repo.maven.apache.org/maven2通过*****:8080用户名= *****,密码= ***下载:https:// repo . maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom [警告]无法检索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 . 插件:maven-clean-plugin:2.5或其中一个依赖项无法解析:无法读取org.apache.maven.plugins的工件描述符:maven-clean-plugin:jar:2.5 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)在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)在澳rg.apache.maven.lifecycle.internal.MojoDescriptorCreator.getMojoDescriptor(MojoDescriptorCreator.java:220)位于org.apache.maven.lifecycle的org.apache.maven.lifecycle.internal.DefaultLifecycleTaskSegmentCalculator.calculateTaskSegments(DefaultLifecycleTaskSegmentCalculator.java:103) . 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.maven.maven.cli.MavenCli.doMain的org.apache.maven.maven.cli.MavenCli.execute(MavenCli.java:582)的org.apache.maven.DefaultMaven.execute(DefaultMaven.java:154)(MavenCli)的.java:214)在org.apache.maven.cli.MavenCli.main(MavenCli.java:158)在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57 )在sun.reflect.DelegatingMethodAccessorImpl.invoke(Delegatin gMethodAccessorImpl.java:43)位于org.codehaus.plexus的org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)的java.lang.reflect.Method.invoke(Method.java:606) .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 atg.apache.maven . repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:349)位于org.eclipse.aether.internal.impl.DefaultRepositorySystem.readArtifactDescriptor的org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor(DefaultArtifactDescriptorReader.java:231) DefaultRepositorySystem.java:288)org.apache.maven.plugin.internal.DefaultPluginD ependenciesResolver.resolve(DefaultPluginDependenciesResolver.java:108)... 23更多引起:org.eclipse.aether.resolution.ArtifactResolutionException:无法传输工件org.apache.maven.plugins:maven-clean-plugin:pom:2.5 from / to central(https://repo.maven.apache.org/maven2):sun.security.validator.ValidatorException:PKIX路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException:无法在org.eclipse.aether.internal.impl的org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:459)中找到所请求目标的有效证书路径位于org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom的Org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:239)中的.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:262)(DefaultArtifactDescriptorReader.java :334)... 26更多引起:org.eclipse.aether.transfer.ArtifactTransferException:无法传输工件org.apache.maven.plugins:maven-clean-plugin:pom:2.5 from / to central(https:/ /repo.maven.apache.org/maven2):sun.security.validator.ValidatorException: PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法在org.eclipse上找到org.eclipse.aether.connector.wagon.WagonRepositoryConnector $ 6.wrap(WagonRepositoryConnector.java:1016)中所请求目标的有效证书路径.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.TransferFailedException:sun.security.validator.ValidatorException:PKIX路径建设失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到有效的认证在org.apache的org.apache.maven.maven.wagon.StreamWagon.getInputStream(StreamWagon.java:116)的org.apache.maven.wagon.providers.http.AbstractHttpClientWagon.fillInputData(AbstractHttpClientWagon.java:935)中请求目标的路径.maven.wagon.StreamWagon.getIfNewer(StreamWagon.java:88)在org.apache.maven.wagon.StreamWagon.get(StreamWagon.java:61)在org.eclipse.aether.connector.wagon.WagonRepositoryConnector $ GetTask.run javax.net.ssl.SSLHandshakeException::(WagonRepositoryConnector.java:660)... 4个所致sun.security.validator.ValidatorException:PKIX路径建设失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到有效在sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884)在sun.security.ssl.Handshaker.fatalSE(在sun.security.ssl.Alerts.getSSLException(Alerts.java:192)认证路径请求的目标Handshaker.java:276)at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270)at sun.security.ssl.ClientHandshaker.serverCertifi位于sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)sun.security.ssl.Handshaker的sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153)的cate(ClientHandshaker.java:1341) .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)在sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)在org.apache.maven.wagon.providers.http.httpclient.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket( SSLConnectionSocketFactory.java:280)在org.apache.maven.wagon.providers.http.httpclient.impl.conn.HttpClientConnectionOperator.upgrade(HttpClientConnectionOperator.java:167)在org.apache.maven.wagon.providers.http.httpclient . org.apache.maven.wag中的impl.conn.PoolingHttpClientConnectionManager.upgrade(PoolingHttpClientConnectionManager.java:329) on.providers.http.httpclient.impl.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)at 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.providers.http.AbstractHttpClientWagon.execute(AbstractHttpClientWagon.java:756)atorg.apache.maven.wagon.providers.http.AbstractHttpClientWagon.fillInputData(AbstractHttpClientWagon.java:854)... 8更多引起:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath .SunCertPathBuilderException:无法在sun.security.validBuild(PKIXValidator.java:385)sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)sun.security的sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:385)找到所请求目标的有效证书路径.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更多引起:sun.security.provider.certpath.SunCertPathBuilderException:无法找到有效的认证路径要求sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196)在sun.security.valid.PKIXValidator.doBuild的java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268)上请求目标 . PKIXValidator.java:380)......还有33个
9 回答
我在同样的情况下遇到了这个问题,我写了一个关于堆栈溢出的相关问题detailed answer解释了如何更容易地修改系统's cacerts using a GUI tool. I think it'比使用一次性密钥库更好地用于特定项目或修改maven的设置(这可能会导致路上的麻烦) .
上面的答案是一个很好的工作解决方案,但如果你想使用SSL repo,这里有如何做到这一点:
使用浏览器(我使用IE)转到https://repo.maven.apache.org/
点击锁定图标并选择"View Certificate"
转到"Details"标签并选择"Save to File"
选择类型"Base 64 X.509 (.CER)"并将其保存在某处
现在打开命令提示符并键入(使用您自己的路径):
keytool -import -file C:\temp\mavenCert.cer -keystore C:\temp\mavenKeystore
-Djavax.net.ssl.trustStore=C:\temp\mavenKeystore
-Djavax.net.ssl.trustStore=/tmp/mavenKeystore
否则this将会发生
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false -Djavax.net.ssl.trustStore=C:\temp\mavenKeystore
Optional:
您可以使用
MAVEN_OPTS
环境变量,因此您不必再担心它 . 查看MAVEN_OPTS
变量here的更多信息:您可以手动导入SSL证书,只需将其添加到密钥库即可 .
对于linux用户,
句法:
示例:
当Maven尝试自动下载必要的模块时,我收到了有关SSL证书的相同错误 .
作为补救措施,我试图实施Luke 's answer above, but found that the DigiCert Global Root CA certificate is already in Java'的可信密钥库 .
帮助我的是将
%JAVA_HOME%\bin
添加到Path变量(我正在运行Windows) . 并且%JAVA_HOME%
是JDK位置,而不仅仅是JRE位置,因为Maven需要JDK .我不确定它为什么会有所帮助,但确实如此 . 我绝对相信这是我唯一改变的事情 .
如果 HTTPS 存储库发生此问题,请执行此操作 . https://repo.spring.io/milestone你可以尝试用非安全替换:http://repo.spring.io/milestone . 就是这样
我实际上遇到了同样的问题 .
我跑的时候
在我的maven项目中,我通过maven工具获得此证书错误 .
我跟着@Andy的答案,直到我下载了 .cer 文件
之后,其余的答案对我不起作用,但我做了以下(我在Linux Debian机器上运行)
首先,运行:
例如在我的情况下它是:
如果它询问密码,只需按Enter键 .
该命令应该列出java接受的所有ssl证书 . 当我运行此命令时,在我的情况下,我获得了93个证书 .
现在,通过运行以下命令将下载的文件 .cer 添加到 cacerts 文件:
写你的sudo密码然后它会问你 keystore password
默认的是 changeit
然后说 y 你相信这个证书 .
如果你运行命令
再一次,在我的情况下,我得到了 cacerts 文件的94个内容
这意味着,它已成功添加 .
更新
我只是偶然发现了这个错误报告:
https://bugs.launchpad.net/ubuntu/+source/ca-certificates-java/+bug/1396760
它似乎是我们这里问题的原因 . 有ca-certificates-java的东西遇到错误而不是完全填充cacerts . 对我来说,这是在我升级到15.10后开始发生的,这个错误可能发生在那个过程中 .
解决方法是执行以下命令:
如果您检查密钥库的内容(如我原来的答案),您现在将看到更多,包括所需的DigiCert全局根CA.
如果您在原始答案中完成了该过程,则可以通过运行此命令来清理我们添加的密钥(假设您未指定其他别名):
Maven现在可以正常工作了 .
原始答案
我只想扩展Andy关于添加证书和指定密钥库的答案 . 这让我开始,并结合其他地方的信息,我能够理解问题,找到另一个(更好的?)解决方案 .
Andy的回答指定了一个具有Maven证书的新密钥库 . 在这里,我将更广泛地将根证书添加到默认的Java信任库 . 这允许我在不指定密钥库的情况下使用mvn(和其他java东西) .
作为参考,我的操作系统是带有Maven 3.3.3的Ubuntu 15.10 .
基本上,此设置中的默认Java信任库不信任Maven存储库(DigiCert全局根CA)的根证书,因此需要添加它 .
我在这里找到并下载:
https://www.digicert.com/digicert-root-certificates.htm
然后我找到了默认的信任库位置,它位于此处:
您可以通过运行此命令来查看当前的证书:
出现提示时,默认密钥库密码为“changeit”(但没有人这样做) .
在我的设置中,“DigiCert Global Root CA”的指纹不存在(DigiCert在上面的链接中将其称为“指纹”) . 所以这是添加它的方法:
如果你信任证书,这应该提示,说是 .
再次使用keytool -list验证密钥是否存在 . 我没有费心去指定一个别名(-alias),所以它最终是这样的:
然后我就能正常运行mvn命令,无需指定密钥库 .
事实是你的maven插件试图连接到https远程存储库
(例如https://repo.maven.apache.org/maven2/)
这是Maven Central的新SSL连接,于2014年8月推出!
所以,请您验证您的settings.xml是否具有正确的配置 .
您也可以像这样使用简单的http maven存储库
如果我的解决方案有效,请告诉我;)
J.
这可能不是最好的解决方案 . 我将我的maven从3.3.x改为3.2.x.这个问题消失了 .