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

And*_*ndy 119 java ssl proxy maven

我刚刚下载了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
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我收到SSL证书的错误,无法从https://repo.maven.apache.org/maven2的中央Maven存储库下载.错误是"SunCertPathBuilderException:无法找到请求目标的有效证书路径".

我坐在公司防火墙后面并正确配置了两者的代理设置httphttps通过该settings.xml文件进行访问.我怀疑所有下载Maven并且第一次运行它的人都必须导入Maven存储库的SSL证书,所以问题必须在于代理.有人对这个有经验么?

这是完全调试模式(-X)中的堆栈跟踪:

 mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Run Code Online (Sandbox Code Playgroud)

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.pl ugins: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)在组织 位于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)在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)在org.apache.maven.cli.MavenCli.main(MavenCli.java:158)在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingM ethodAccessorImpl.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)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 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.DefaultPluginDep endenciesResolver.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.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:459)处org.eclipse.aether org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:262)靶. org.eclipse.aether.transfer:internal.impl.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:239)在org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:334)...... 26多所致.ArtifactTransferExceptio n:无法传输工件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.connector.wagon.WagonRepositoryConnector $ 6.wrap(WagonRepositoryConnector.java:1016)上找到请求目标的有效证书路径. 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) at 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的org.apache.maven.wagon.StreamWagon.getInputStream(StreamWagon.java:116)org.apache.maven.wagon.StreamWagon.getIfNewer(StreamWagon.java:88). maven.wagon.StreamWagon.get(StreamWagon.java:61)at 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)at 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)在org.apache.maven.wagon.providers.http.httpclient.impl.conn.PoolingHttpClientConnectionManager.upgrade(PoolingHttpClientConnectionManager.java:329)在org.apache.maven.wagon.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)在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. doOecute(InternalHttpClient.java:186)位于org.apache.maven.wagon.provide的org.apache.maven.wagon.providers.http.httpclient.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)sun.security.validator:rs.http.AbstractHttpClientWagon.execute(AbstractHttpClientWagon.java:756)在org.apache.maven.wagon.providers.http.AbstractHttpClientWagon.fillInputData(AbstractHttpClientWagon.java:854)... 8个所致.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法在sun.security.validBuild(PKIXValidator.java:385)的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更多引起: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更多

bio*_*nfo 174

事实是您的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>
Run Code Online (Sandbox Code Playgroud)

您也可以像这样使用简单的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>
Run Code Online (Sandbox Code Playgroud)

如果我的解决方案有效,请告诉我;)

J.

  • 自 2020 年 1 月 15 日起,中央存储库不再支持通过纯 HTTP 进行的不安全通信,并要求对存储库的所有请求都通过 HTTPS 进行加密。 (13认同)
  • 是的,我尝试了它,它的工作原理.但是,在第一个代码块中,我必须将存储库URL从https更改为http,否则我会收到与以前相同的错误消息.此外,对于任何尝试此操作的人,请不要忘记<activeProfiles>标记. (4认同)
  • 感谢您快速准确的回复,它对我有用,并且可能会帮助很多在 2014 年 8 月之后开始使用 maven 的人:-) 同时我想出了如何让它与 SSL 一起工作。我会将其作为答案发布在下面以帮助其他人,但您的答案将是官方接受的答案。谢谢 (2认同)
  • 刚刚尝试了第二种替代简单解决方案,它对我有用......谢谢。 (2认同)

And*_*ndy 161

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

  • 这应该被接受为正确的答案.您的ISA代理正在插入JDK不信任的中间证书. (13认同)
  • 我让maven通过命令行工作.我如何让它在日食中运作? (2认同)
  • 另外,在Ubuntu上,您可以运行诸如sudo keytool -import -file ./repo.maven.apache.org.crt -keystore / usr / lib / jvm / java-8-oracle / jre / lib / security /证书 (2认同)

小智 41

您可以使用该-Dmaven.wagon.http.ssl.insecure=true选项


Luk*_*uke 21

更新

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

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东西).

作为参考,我的OS是带有Maven 3.3.3的Ubuntu 15.10.

基本上,此设置中的默认Java信任库不信任Maven仓库(DigiCert全局根CA)的根证书,因此需要添加它.

我在这里找到并下载:

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

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

的/ 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 -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命令,无需指定keystore.


Mit*_*n.O 12

如果这种情况是由公司防火墙引起的,并且您使用的是 Windows,则您的 Windows 证书存储可能配置为信任防火墙。-Djavax.net.ssl.trustStoreType=WINDOWS-ROOT您可以通过将选项添加到命令行或 MAVEN_OPTS 来告诉 Java 依赖 Windows 证书。


小智 10

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

当我跑

mvn 清洁包

在我的 Maven 项目中,我通过 Maven 工具收到此证书错误。

我一直跟着@Andy 的回答直到我下载了.cer文件

之后,其余的答案对我不起作用,但我做了以下操作(我在 Linux Debian 机器上运行)

首先,运行:

keytool -list -keystore "Java 路径+"/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

然后说y你信任这个证书。

如果你运行命令

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

再一次,就我而言,我得到了cacerts 的94 个内容文件的

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


Bal*_*yan 10

您可以手动导入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从3.3.x改为3.2.x. 这个问题消失了.


vks*_*vks 6

步骤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.
Run Code Online (Sandbox Code Playgroud)

第 2 步:将整个内容(包括 BEGIN CERTIFICATE 和 END CERTIFICATE 行,在本例中很重要)保存为 Godaddyg2.pem 并通过以下方式将其导入我的信任存储:

第三步:在keystore(java可信密钥库)中导入证书

$ keytool -importcert -file ./godaddyg2.pem -keystore $JRE_LIB/lib/security/cacerts
Run Code Online (Sandbox Code Playgroud)


小智 6

发生这种情况是因为您的 Maven 插件尝试连接到HTTPS远程存储库 ( https://repo.maven.apache.org/maven2 ) 或 ( https://repo1.maven.apache.org )。

不久前,您可以将这些 URL 更改为使用 HTTP,而不是使用 HTTPS,但自2020 年 1 月 15 日起,这些 URL 不再有效,只能使用 HTTPS URL。

作为解决此问题的简单方法,您可以在 settings.xml 文件中使用不安全的Maven URL。因此,您需要将上面提到的所有引用更改为:http://insecure.repo1.maven.org/maven2/

提示:您的 JAVA_HOME 变量始终需要指向 JDK 路径,而不是 JRE 路径,例如:“C:\Program Files\Java\jdk1.7.0_80”。


归档时间:

查看次数:

218140 次

最近记录:

6 年,3 月 前