[java] 프록시 뒤의 Maven 및 SSL 사용 문제

방금 Maven을 다운로드했고 “Maven in 5 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 : 요청한 대상에 대한 유효한 인증 경로를 찾을 수 없습니다”입니다.

회사 방화벽 뒤에 앉아 있고 파일을 통한 액세스 http및 프록시 설정을 올바르게 구성했습니다 . Maven을 다운로드하여 처음으로 실행하는 모든 사람이 Maven 저장소의 SSL 인증서를 가져와야하므로 프록시에 문제가 있어야합니다. 누구든지 이것에 대한 경험이 있습니까?httpssettings.xml

전체 디버그 모드 (-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



답변

사실 maven 플러그인은 https 원격 저장소에 연결하려고합니다
(예 : https://repo.maven.apache.org/maven2/ )

이것은 Maven Central이 2014 년 8 월에 출시 된 새로운 SSL 연결입니다!

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>

내 솔루션이 작동하는지 알려주세요.)

제이.


답변

위의 답변은 효과적인 솔루션이지만 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

  • 리눅스에서 절대 경로 사용

    -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변수 에 대한 자세한 정보는 여기를 참조 하십시오 .


답변

최신 정보

방금이 버그 보고서를 우연히 발견했습니다.

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

여기서 문제의 원인 인 것 같습니다. ca-certificates-java에 오류가 발생하여 cacert가 완전히 채워지지 않은 문제가 있습니다. 나에게 이것은 15.10으로 업그레이드 한 후에 시작 되었으며이 버그는 아마도 그 과정에서 발생했을 것입니다.

해결 방법은 다음 명령을 실행하는 것입니다.

sudo /var/lib/dpkg/info/ca-certificates-java.postinst 구성

키 스토어의 내용을 확인하면 (원래 답변과 같이) 필요한 DigiCert Global Root CA를 포함하여 더 많은 것을 볼 수 있습니다.

원래 답변으로 프로세스를 진행 한 경우이 명령을 실행하여 추가 한 키를 정리할 수 있습니다 (다른 별칭을 지정하지 않은 경우).

sudo keytool-삭제-별칭 mykey -keystore / etc / ssl / certs / java / cacerts

메이븐은 이제 잘 작동합니다.


원래 답변

인증서 추가 및 키 저장소 지정에 대한 Andy의 답변을 확장하고 싶습니다. 그것은 나를 시작했고, 다른 곳의 정보와 결합하여 문제를 이해하고 다른 (더 나은) 해결책을 찾을 수있었습니다.

Andy의 답변은 Maven 인증서를 사용하여 새 키 저장소를 지정합니다. 여기서는 좀 더 광범위하게 루트 인증서를 기본 Java 신뢰 저장소에 추가합니다. 이를 통해 키 저장소를 지정하지 않고 mvn (및 기타 Java 항목)을 사용할 수 있습니다.

참고로 내 OS는 Maven 3.3.3의 Ubuntu 15.10입니다.

기본적으로이 설정의 기본 Java 신뢰 저장소는 Maven 저장소 (DigiCert Global Root 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는 위 링크에서 “thumbprint”라고 함). 추가하는 방법은 다음과 같습니다.

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 명령을 실행할 수 있었고 키 저장소를 지정할 필요가 없습니다.


답변

당신은 -Dmaven.wagon.http.ssl.insecure=true옵션을 사용할 수 있습니다


답변

SSL 인증서를 수동으로 가져 와서 키 저장소에 추가 할 수 있습니다.

리눅스 사용자의 경우

통사론:

keytool -trustcacerts -keystore / jre / lib / security / cacerts -storepass changeit -importcert -alias nexus-파일

예 :

keytool -trustcacerts -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre/lib/security/cacerts -storepass changeit -importcert -alias nexus-파일 ~ / Downloads / abc.com-ssl. crt


답변

이것이 최선의 해결책이 아닐 수도 있습니다. maven을 3.3.x에서 3.2.x로 변경했습니다. 그리고이 문제는 사라졌습니다.


답변

나는 실제로 같은 문제가 있었다.

내가 달릴 때

mvn 클린 패키지

내 maven 프로젝트에서 maven 도구에 의해이 인증서 오류가 발생합니다.

.cer 파일을 다운로드 할 때까지 @Andy의 답변을 따랐습니다.

그 후 나머지 답변은 저에게 효과가 없었지만 다음을 수행했습니다 (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 개의 인증서가 있습니다.

이제 다음 명령을 실행 하여 다운로드 한 파일 .cercacerts 파일에 추가하십시오 .

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 내용을 얻었습니다.

그것은 성공적으로 추가되었음을 의미합니다.