首页 文章

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

提问于
浏览
102

我刚刚下载了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 文件正确配置了 httphttps 访问的代理设置 . 我怀疑所有下载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 回答

  • 136

    我在同样的情况下遇到了这个问题,我写了一个关于堆栈溢出的相关问题detailed answer解释了如何更容易地修改系统's cacerts using a GUI tool. I think it'比使用一次性密钥库更好地用于特定项目或修改maven的设置(这可能会导致路上的麻烦) .

  • 8

    上面的答案是一个很好的工作解决方案,但如果你想使用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

    • 在linux下使用绝对路径

    -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的更多信息:

  • 150

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

  • 8

    当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 .
    我不确定它为什么会有所帮助,但确实如此 . 我绝对相信这是我唯一改变的事情 .

  • 1

    如果 HTTPS 存储库发生此问题,请执行此操作 . https://repo.spring.io/milestone你可以尝试用非安全替换:http://repo.spring.io/milestone . 就是这样

  • 20

    我实际上遇到了同样的问题 .

    我跑的时候

    mvn清洁包

    在我的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键 .

    该命令应该列出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密码然后它会问你 keystore password

    默认的是 changeit

    然后说 y 你相信这个证书 .

    如果你运行命令

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

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

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

  • 4

    更新

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

    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.postinst configure

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

    如果您在原始答案中完成了该过程,则可以通过运行此命令来清理我们添加的密钥(假设您未指定其他别名):

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

    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

    然后我找到了默认的信任库位置,它位于此处:

    / etc / 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,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命令,无需指定密钥库 .

  • 0

    事实是你的maven插件试图连接到https远程存储库
    (例如https://repo.maven.apache.org/maven2/

    这是Maven Central的新SSL连接,于2014年8月推出!

    所以,请您验证您的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.

  • 1

    这可能不是最好的解决方案 . 我将我的maven从3.3.x改为3.2.x.这个问题消失了 .

相关问题