在代理之后使用Maven和SSL的问题

我刚刚下载了Maven,试图运行在“Maven in Five Minutes”页面( http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html )上find的简单命令。 这是命令:

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:无法find有效的证书path到请求的目标”。

我坐在企业防火墙的后面,通过settings.xml文件正确configuration了httphttps访问的代理设置。 我怀疑下载Maven并首次运行它的每个人都必须导入Maven仓库的SSL证书,因此问题必须出现在代理上。 有人对这个有经验么?

以下是完整debugging模式下的堆栈跟踪(-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公司Java home:C :\ Program Files \ Java \ jdk1.7.0_45 \ jre默认语言环境:it_IT,平台编码:Cp1252操作系统名称:“windows 7”,版本:“6.1”,arch:“amd64”,系列:“windows”[DEBUG]对于https://repo.maven.apache.org/maven2,使用连接器WagonRepositoryConnector,通过*****: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-清洁插件:jar:2.5 org.apache.maven.plugin.PluginResolutionException:插件org.apache.maven.pl ugins:maven-clean-plugin:2.5或其某个依赖不能被parsing:无法读取org.apache.maven.plugins的工件描述符:maven-clean-plugin:jar:2.5在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.lifecycle.internal.MojoDescriptorCreator.findPluginForPrefix(MojoDescriptorCreator.java:260)org.apache.maven.plugin.prefix.internal.DefaultPluginPrefixResolver.resolve(DefaultPluginPrefixResolver.java:85)org 在org.apache.maven.lifecycle.internal的org.apache.maven.lifecycle.internal.DefaultLifecycleTaskSegmentCalculator.calculateTaskSegments(DefaultLifecycleTaskSegmentCalculator.java:103)中的.apache.maven.lifecycle.internal.MojoDescriptorCreator.getMojoDescriptor(MojoDescriptorCreator.java:220) .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。 (NativeMethodAccessorImpl.java:57)上的org.apache.maven.cli.MavenCli.main(MavenCli.java:158)上的sun.reflect.NativeMethodAccessorImpl.invoke0(Native方法)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingM ethodAccessorImpl.java:43)在org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)上的org.codehaus.plexus上的java.lang.reflect.Method.invoke(Method.java:606) .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)引起:org.eclipse.aether.resolution.ArtifactDescriptorException:无法读取org.apache.maven.plugins的工件描述符:maven-clean-plugin:jar:2.5在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)在org.apache.maven.plugin.internal.DefaultPluginDep environResolver.resolve(DefaultPluginDependenciesResolver.java:108)… 23更多原因:org.eclipse.aether.resolution.ArtifactResolutionException:无法传输工件org.apache.maven.plugins:maven-clean-plugin:pom:2.5 from /到中央( https://repo.maven.apache.org/maven2):sun.security.validator.ValidatorException:PKIXpath构build失败:sun.security.provider.certpath.SunCertPathBuilderException:无法find有效的证书path来请求目标在org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:459)在org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:262)在org.eclipse.aether。在org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:334)上的internal.impl.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:239)… 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 :PKIXpath构build失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到org.eclipse.aether.connector.wagon.WagonRepositoryConnector $ 6.wrap(WagonRepositoryConnector.java:1016)处的请求目标的有效证书path。 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)在java.lang.Thread.run(Thread.java:744)引起的:org.apache.maven.wagon.Transf erFailedException:sun.security.validator.ValidatorException:PKIXpath构build失败:sun.security.provider.certpath.SunCertPathBuilderException:在org.apache.maven.wagon.providers.http.AbstractHttpClientWagon.fillInputData无法find有效的authenticationpath(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)at org.eclipse.aether.connector.wagon.WagonRepositoryConnector $ GetTask.run(WagonRepositoryConnector.java:660)… 4 more引起:javax.net.ssl .SSLHandshakeException:sun.security.validator.ValidatorException:PKIXpath构build失败:sun.security.provider.certpath.SunCertPathBuilderException:无法在sun.security.ssl.Alerts.getSSLException(Alerts.java: 192)在sun.security.ssl.SSLSocketImpl.fatal(SSLSocketIm pl.java:1884)在sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)在sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270)在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。在sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)处的sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)上的process_record(Handshaker.java:804) .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)在org.apache.maven.wagon.providers.http.httpclient.impl.conn.HttpClientConnectionOperator.upgrade(HttpClientConnectionOperator .java:167)在org.apache.maven.wagon.providers.http.httpclient.impl的org.apache.maven.wagon.providers.http.httpclient.impl.conn.PoolingHttpClientConnectionManager.upgrade(PoolingHttpClientConnectionManager.java:329) .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)在org.apache.maven.wagon.providers.http.httpclient.impl.client.InternalHttpClient的org.apache.maven.wagon.providers.http.httpclient.impl.execchain.RedirectExec.execute(RedirectExec.java:108)。在org.apache.maven.wagon.providers.http.httpclient.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)上的doExecute(InternalHttpClient.java:186)在org.apache.maven.wagon.provide rshttp.AbstractHttpClientWagon.execute(AbstractHttpClientWagon.java:756)at org.apache.maven.wagon.providers.http.AbstractHttpClientWagon.fillInputData(AbstractHttpClientWagon.java:854)… 8 more引起:sun.security.validator .ValidatorException:PKIXpath构build失败:sun.security.provider.certpath.SunCertPathBuilderException:在sun.security.validator无法find有效的证书path,请求目标位于sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:385) .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更多由:sun.security.provider引起的。 certpath.SunCertPathBuilderException:无法在sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196)上的java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268)处find要求的目标的有效证书pathsun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380)… 33更多

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

这是Maven Central的新SSL连接已于2014年8月发布!

所以,请你可以validation你的settings.xml是否有正确的configuration。

  <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> 

请让我知道如果我的解决scheme工作;)

J.

上面的答案是一个很好的工作解决scheme,但是如果您想要使用SSL回购,请执行以下操作:

  • 使用浏览器(我用IE)去https://repo.maven.apache.org/
    • 点击locking图标,然后select“查看证书”
    • 转到“详细信息”选项卡并select“保存到文件”
    • select“Base 64 X.509(.CER)”并保存在某个地方
  • 现在打开一个命令提示符并input(使用你自己的path):

    keytool -import -file C:\temp\mavenCert.cer -keystore C:\temp\mavenKeystore

  • 现在可以使用参数再次运行该命令

    -Djavax.net.ssl.trustStore=C:\temp\mavenKeystore

  • 在linux下使用绝对path

    -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环境variables,所以你不必再担心它。 查看更多有关MAVEN_OPTSvariables的信息 :

更新

我只是偶然发现了这个错误报告:

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

这似乎是我们问题的原因。 什么与ca-certificates-java遇到一个错误,并没有完全填充cacerts。 对我来说,这个问题在升级到15.10后就开始发生了,这个错误很可能发生在这个过程中。

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

sudo /var/lib/dpkg/info/ca-certificates-java.postinstconfiguration

如果您检查密钥库的内容(如我原来的答案),现在您将看到更多,包括所需的DigiCert全局根CA.

如果你在我原来的回答中经历了这个过程,你可以通过运行这个命令来清理我们添加的密钥(假设你没有指定一个不同的别名):

sudo keytool -delete -alias mykey -keystore / etc / ssl / certs / java / cacerts

Maven现在可以正常工作了。


原始答复

我只想扩展Andy的关于添加证书和指定密钥库的回答。 这让我开始了,结合其他地方的信息,我能够理解这个问题,并find另一个(更好的?)解决scheme。

Andy的答案特别指定了一个带有Maven证书的新密钥库。 在这里,我要更宽泛一些,并将根证书添加到默认的java truststore。 这使我可以使用mvn(和其他java的东西),而不指定密钥库。

作为参考,我的操作系统是Ubuntu 15.10和Maven 3.3.3。

基本上,这个设置中的默认Java信任库不信任Maven回购(DigiCert Global Root CA)的根证书,因此需要添加它。

我在这里find并下载:

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

然后我find了默认的信任库位置,它位于:

的/ etc / SSL /证书/ 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 -listvalidation密钥是否存在。 我懒得指定一个别名(-alias),所以它最终是这样的:

mykey,2015年12月2日,trustedCertEntry,证书指纹(SHA1):A8:98:5D:3A:65:E5:E5:C4:B2:D7:D6:6D:40:C6:DD:2F:B1:9C :54:36

然后我可以正常运行mvn命令,不需要指定密钥库。

这可能不是最好的解决scheme。 我把我的maven从3.3.x改为3.2.x. 而这个问题没有了。

当Maven试图自动下载必要的模块时,我得到了与SSL证书相同的错误。
作为一种补救措施,我试图实现Luke上面的答案,但发现DigiCert全局根CA证书已经在Java的可信密钥库中。

什么帮助我添加%JAVA_HOME%\bin到Pathvariables(我正在运行Windows)。 而%JAVA_HOME%是一个JDK位置,而不仅仅是一个JRE位置,因为Maven需要一个JDK。
我不确定为什么它有帮助,但它确实。 我绝对相信这是我改变的唯一的东西。

我其实也有同样的问题。

当我跑步

mvn清理软件包

在我的maven项目中,我得到这个证书错误的maven工具。

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

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

首先运行:

keytool -list -keystore“Javapath+”/ jre / lib / security / cacerts“”

例如在我的情况是这样的:

keytool -list -keystore / usr / lib / jvm / jdk-8-oracle-arm32 -vfp -hflt / jre / lib / security / cacerts

如果询问密码,只需按回车。

这个命令应该列出java所接受的所有SSL证书。 当我运行这个命令时,在我的例子中,我有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

然后说你相信这个证书。

如果你运行这个命令

keytool -list -keystore / usr / lib / jvm / jdk-8-oracle-arm32 -vfp -hflt / jre / lib / security / cacerts

在我的情况下,我又收到了94个cacerts文件的内容

这意味着,它被成功添加了。

如果HTTPS存储库发生此问题, 请https://repo.spring.io/milestone,您可以尝试以非安全方式replace:; http : //repo.spring.io/milestone 。 就是这样

您可以手动导入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。 CRT