it-swarm-ko.tech

Java : Sun.security.provider.certpath.SunCertPathBuilderException : 요청 된 대상에 대한 유효한 인증 경로를 찾을 수 없습니다.

나는 https 서버에서 파일을 다운로드 할 클래스가 있습니다. 나는 그것을 실행할 때 많은 오류를 반환합니다. 내 인증서에 문제가있는 것 같습니다. 클라이언트 - 서버 인증을 무시할 수 있습니까? 그렇다면 어떻게?

package com.da;

import Java.io.FileOutputStream;
import Java.io.IOException;
import Java.nio.CharBuffer;
import Java.util.concurrent.Future;

import org.Apache.http.HttpResponse;
import org.Apache.http.client.utils.URIUtils;
import org.Apache.http.impl.nio.client.DefaultHttpAsyncClient;
import org.Apache.http.nio.IOControl;
import org.Apache.http.nio.client.HttpAsyncClient;
import org.Apache.http.nio.client.methods.AsyncCharConsumer;
import org.Apache.http.nio.client.methods.HttpAsyncGet;
import org.Apache.http.nio.client.methods.HttpAsyncPost;

public class RSDDownloadFile {
    static FileOutputStream fos;

    public void DownloadFile(String URI, String Request) throws Exception
    {
        Java.net.URI uri = URIUtils.createURI("https", "176.66.3.69:6443", -1, "download.aspx",
                "Lang=EN&AuthToken=package", null);
        System.out.println("URI Query: " + uri.toString());

        HttpAsyncClient httpclient = new DefaultHttpAsyncClient();
        httpclient.start();
        try {
            Future<Boolean> future = httpclient.execute(
                    new HttpAsyncGet(uri),
                    new ResponseCallback(), null);

            Boolean result = future.get();
            if (result != null && result.booleanValue()) {
                System.out.println("\nRequest successfully executed");
            } else {
                System.out.println("Request failed");
            }              
        } 
        catch(Exception e){
            System.out.println("[DownloadFile] Exception: " + e.getMessage());
        }
        finally {
            System.out.println("Shutting down");
            httpclient.shutdown();
        }
        System.out.println("Done");  

    }

    static class ResponseCallback extends AsyncCharConsumer<Boolean> {

        @Override
        protected void onResponseReceived(final HttpResponse response) {
             System.out.println("Response: " + response.getStatusLine());
             System.out.println("Header: " + response.toString());
             try {   
                 //if(response.getStatusLine().getStatusCode()==200)
                     fos = new FileOutputStream( "Response.html" );
             }catch(Exception e){
                 System.out.println("[onResponseReceived] Exception: " + e.getMessage());
             }
        }

        @Override
        protected void onCharReceived(final CharBuffer buf, final IOControl ioctrl) throws IOException {
            try
            {
                while (buf.hasRemaining()) 
                {
                    //System.out.print(buf.get());
                    fos.write(buf.get());
                }
            }catch(Exception e)
            {
                System.out.println("[onCharReceived] Exception: " + e.getMessage());
            }
        }

        @Override
        protected void onCleanup() {
            try
            {             
                if(fos!=null)
                    fos.close();
            }catch(Exception e){
                System.out.println("[onCleanup] Exception: " + e.getMessage());         
            }
             System.out.println("onCleanup()");
        }

        @Override
        protected Boolean buildResult() {
            return Boolean.TRUE;
        }

    }
}

오류 :

URI Query: https://176.66.3.69:6443/download.aspx?Lang=EN&AuthToken=package
Aug 2, 2011 3:47:57 PM org.Apache.http.impl.nio.client.NHttpClientProtocolHandler exception
SEVERE: I/O error: General SSLEngine problem
javax.net.ssl.SSLHandshakeException: General SSLEngine problem
    at com.Sun.net.ssl.internal.ssl.Handshaker.checkThrown(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.SSLEngineImpl.checkTaskThrown(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.SSLEngineImpl.writeAppRecord(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.SSLEngineImpl.wrap(Unknown Source)
    at javax.net.ssl.SSLEngine.wrap(Unknown Source)
    at org.Apache.http.impl.nio.reactor.SSLIOSession.doHandshake(SSLIOSession.Java:154)
    at org.Apache.http.impl.nio.reactor.SSLIOSession.isAppInputReady(SSLIOSession.Java:276)
    at org.Apache.http.impl.nio.client.InternalClientEventDispatch.inputReady(InternalClientEventDispatch.Java:79)
    at org.Apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.Java:161)
    at org.Apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.Java:335)
    at org.Apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.Java:315)
    at org.Apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.Java:275)
    at org.Apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.Java:104)
    at org.Apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.Java:542)
    at Java.lang.Thread.run(Unknown Source)
Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
    at com.Sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.Handshaker$1.run(Unknown Source)
    at Java.security.AccessController.doPrivileged(Native Method)
    at com.Sun.net.ssl.internal.ssl.Handshaker$DelegatedTask.run(Unknown Source)
    at org.Apache.http.impl.nio.reactor.SSLIOSession.doHandshake(SSLIOSession.Java:180)
    ... 9 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(Unknown Source)
    at Sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
    at Sun.security.validator.Validator.validate(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(Unknown Source)
    ... 16 more
Caused by: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at Sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
    at Java.security.cert.CertPathBuilder.build(Unknown Source)
    ... 21 more
onCleanup()

[DownloadFile] Exception: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
Shutting down
Done
203
neztreh

서버에 자체 서명 된 인증서가있는 경우 문제가 나타납니다. 이를 해결하기 위해이 인증서를 JVM의 신뢰할 수있는 인증서 목록에 추가 할 수 있습니다.

이 기사에서 저자는 브라우저에서 인증서를 가져와 JVM의 cacerts 파일에 추가하는 방법을 설명합니다. Java_HOME/jre/lib/security/cacerts 파일을 편집하거나 -Djavax.net.ssl.trustStore 매개 변수를 사용하여 응용 프로그램을 실행할 수 있습니다. 이것이 종종 혼동의 원인이되기 때문에 어느 JDK/JRE를 사용하고 있는지 확인하십시오.

참고 : SSL 인증서 서버 이름은 어떻게 해석합니까?/keytool을 사용하여 대체 이름을 추가 할 수 있습니까?Java.security.cert.CertificateException: No name matching localhost found 예외가 발생하면.

184
Maxim Mazin

다음은 macOS에서 안정적으로 작동하는 이유입니다. example.com과 443을 연결하려는 실제 호스트 이름과 포트로 바꾸고 맞춤 별칭을 지정하십시오. 첫 번째 명령은 원격 서버에서 제공된 인증서를 다운로드하여 x509 형식으로 로컬에 저장합니다. 두 번째 명령은 저장된 인증서를 Java의 SSL 신뢰 저장소로로드합니다.

openssl x509 -in <(openssl s_client -connect example.com:443 -prexit 2>/dev/null) -out ~/example.crt
Sudo keytool -importcert -file ~/example.crt -alias example -keystore $(/usr/libexec/Java_home)/jre/lib/security/cacerts -storepass changeit
127
Gabe Martin-Dempesy

Symantec에서 서명 한 유효한 와일드 카드 인증서와 동일한 문제가 있습니다.

먼저 Java 애플리케이션을 - Djavax.net.debug = SSL 으로 실행하여 실제로 진행중인 작업을 확인하십시오.

나는 중간 인증서 를 가져와서 인증서 체인이 깨지는 것을 막을 수있었습니다.

Symantec에서 누락 된 중간 인증서를 다운로드했습니다 (ssl 핸드 셰이크 로그에 누락 된 인증서 다운로드 링크가 있습니다 : http://svrintl-g3-aia.verisign.com/SVRIntlG3). cer 내 경우에는).

그리고 자바 키 저장소에 인증서를 가져 왔습니다. 중간 인증서를 가져온 후 와일드 카드 SSL 인증서가 마침내 작동하기 시작했습니다.

keytool -import -keystore ../jre/lib/security/cacerts -trustcacerts -alias "VeriSign Class 3 International Server CA - G3" -file /pathto/SVRIntlG3.cer
40
Stephan Oudmaijer
  1. Firefox를 사용하여 SSL 인증서를 내 보냅니다. 브라우저에서 URL을 눌러 내 보낸 다음 인증서를 내보낼 수있는 옵션을 선택할 수 있습니다. cert 파일 이름이 your.ssl.server.name.crt 라고 가정합니다.
  2. JRE_HOME/bin 또는 JDK/JRE/bin로 이동하십시오.
  3. 명령을 입력하십시오.
  4. keytool -keystore ..\lib\security\cacerts -import -alias your.ssl.server.name -file .\relative-path-to-cert-file\your.ssl.server.name.crt
  5. Java 프로세스를 다시 시작하십시오.
34
Robin

인용 부호 '요청 된 대상에 대한 유효한 인증 경로를 찾을 수 없습니다'

jSSE를 사용하여 호스트에 대한 SSL 연결을 열려고 할 때. 이것은 일반적으로 서버가 Verisign 또는 GoDaddy와 같은 잘 알려진 상용 인증 기관의 인증서가 아닌 테스트 인증서 (keytool을 사용하여 생성되었을 수 있음)를 사용하고 있음을 의미합니다. 웹 브라우저는이 경우 경고 대화 상자를 표시하지만 JSSE는 대화식 사용자가 있다고 가정 할 수 없으므로 기본적으로 예외를 throw합니다.

인증서 유효성 검사는 SSL 보안의 매우 중요한 부분이지만 세부 사항을 설명하기 위해이 항목을 쓰지는 않습니다. 관심이 있으시면 Wikipedia 광고를 읽어보십시오. 필자가 정말로 원한다면이 항목을 작성하여 호스트와 테스트 인증서를 교환하는 간단한 방법을 보여줍니다.

기본적으로 신뢰할 수있는 인증서를 사용하여 서버의 인증서를 KeyStore에 추가하려고합니다.

제공된 코드를 사용해보십시오. 도움이 될지도 모릅니다.

17
Nishant

@Gabe Martin-Dempesy의 대답이 나에게 도움이된다. 그리고 나는 그것에 관련된 작은 스크립트를 썼다. 사용법은 매우 간단합니다.

호스트에서 인증서 설치 :

> Sudo ./Java-cert-importer.sh example.com

이미 설치된 인증서를 제거하십시오.

> Sudo ./Java-cert-importer.sh example.com --delete

Java-cert-importer.sh

#!/usr/bin/env bash

# Exit on error
set -e

# Ensure script is running as root
if [ "$EUID" -ne 0 ]
  then echo "WARN: Please run as root (Sudo)"
  exit 1
fi

# Check required commands
command -v openssl >/dev/null 2>&1 || { echo "Required command 'openssl' not installed. Aborting." >&2; exit 1; }
command -v keytool >/dev/null 2>&1 || { echo "Required command 'keytool' not installed. Aborting." >&2; exit 1; }

# Get command line args
Host=$1; port=${2:-443}; deleteCmd=${3:-${2}}

# Check Host argument
if [ ! ${Host} ]; then
cat << EOF
Please enter required parameter(s)

usage:  ./Java-cert-importer.sh <Host> [ <port> | default=443 ] [ -d | --delete ]

EOF
exit 1
fi;

if [ "$Java_HOME" ]; then
    javahome=${Java_HOME}
Elif [[ "$OSTYPE" == "linux-gnu" ]]; then # Linux
    javahome=$(readlink -f $(which Java) | sed "s:bin/Java::")
Elif [[ "$OSTYPE" == "darwin"* ]]; then # Mac OS X
    javahome="$(/usr/libexec/Java_home)/jre"
fi

if [ ! "$javahome" ]; then
    echo "WARN: Java home cannot be found."
    exit 1
Elif [ ! -d "$javahome" ]; then
    echo "WARN: Detected Java home does not exists: $javahome"
    exit 1
fi

echo "Detected Java Home: $javahome"

# Set cacerts file path
cacertspath=${javahome}/lib/security/cacerts
cacertsbackup="${cacertspath}.$$.backup"

if ( [ "$deleteCmd" == "-d" ] || [ "$deleteCmd" == "--delete" ] ); then
    Sudo keytool -delete -alias ${Host} -keystore ${cacertspath} -storepass changeit
    echo "Certificate is deleted for ${Host}"
    exit 0
fi

# Get Host info from user
#read -p "Enter server Host (E.g. example.com) : " Host
#read -p "Enter server port (Default 443) : " port

# create temp file
tmpfile="/tmp/${Host}.$$.crt"

# Create Java cacerts backup file
cp ${cacertspath} ${cacertsbackup}

echo "Java CaCerts Backup: ${cacertsbackup}"

# Get certificate from speficied Host
openssl x509 -in <(openssl s_client -connect ${Host}:${port} -prexit 2>/dev/null) -out ${tmpfile}

# Import certificate into Java cacerts file
Sudo keytool -importcert -file ${tmpfile} -alias ${Host} -keystore ${cacertspath} -storepass changeit

# Remove temp certificate file
rm ${tmpfile}

# Check certificate alias name (same with Host) that imported successfully
result=$(keytool -list -v -keystore ${cacertspath} -storepass changeit | grep "Alias name: ${Host}")

# Show results to user
if [ "$result" ]; then
    echo "Success: Certificate is imported to Java cacerts for ${Host}";
else
    echo "Error: Something went wrong";
fi;
17
bhdrk

코드 만 사용하여 작업 할 수있었습니다. 즉 keytool을 사용할 필요가 없습니다.

import com.netflix.config.DynamicBooleanProperty;
import com.netflix.config.DynamicIntProperty;
import com.netflix.config.DynamicPropertyFactory;
import org.Apache.http.client.config.RequestConfig;
import org.Apache.http.config.Registry;
import org.Apache.http.config.RegistryBuilder;
import org.Apache.http.conn.ssl.SSLContexts;
import org.Apache.http.conn.ssl.TrustStrategy;
import org.Apache.http.conn.ssl.X509HostnameVerifier;
import org.Apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.Apache.http.impl.nio.client.HttpAsyncClients;
import org.Apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager;
import org.Apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
import org.Apache.http.impl.nio.reactor.IOReactorConfig;
import org.Apache.http.nio.conn.NoopIOSessionStrategy;
import org.Apache.http.nio.conn.SchemeIOSessionStrategy;
import org.Apache.http.nio.conn.ssl.SSLIOSessionStrategy;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import Java.io.IOException;
import Java.security.cert.CertificateException;
import Java.security.cert.X509Certificate;

public class Test
{
    private static final DynamicIntProperty MAX_TOTAL_CONNECTIONS = DynamicPropertyFactory.getInstance().getIntProperty("X.total.connections", 40);
    private static final DynamicIntProperty ROUTE_CONNECTIONS = DynamicPropertyFactory.getInstance().getIntProperty("X.total.connections", 40);
    private static final DynamicIntProperty CONNECT_TIMEOUT = DynamicPropertyFactory.getInstance().getIntProperty("X.connect.timeout", 60000);
    private static final DynamicIntProperty SOCKET_TIMEOUT = DynamicPropertyFactory.getInstance().getIntProperty("X.socket.timeout", -1);
    private static final DynamicIntProperty CONNECTION_REQUEST_TIMEOUT = DynamicPropertyFactory.getInstance().getIntProperty("X.connectionrequest.timeout", 60000);
    private static final DynamicBooleanProperty STALE_CONNECTION_CHECK = DynamicPropertyFactory.getInstance().getBooleanProperty("X.checkconnection", true);

    public static void main(String[] args) throws Exception
    {

        SSLContext sslcontext = SSLContexts.custom()
                .useTLS()
                .loadTrustMaterial(null, new TrustStrategy()
                {
                    @Override
                    public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException
                    {
                        return true;
                    }
                })
                .build();
        SSLIOSessionStrategy sslSessionStrategy = new SSLIOSessionStrategy(sslcontext, new AllowAll());

        Registry<SchemeIOSessionStrategy> sessionStrategyRegistry = RegistryBuilder.<SchemeIOSessionStrategy>create()
                .register("http", NoopIOSessionStrategy.INSTANCE)
                .register("https", sslSessionStrategy)
                .build();

        DefaultConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(IOReactorConfig.DEFAULT);
        PoolingNHttpClientConnectionManager connectionManager = new PoolingNHttpClientConnectionManager(ioReactor, sessionStrategyRegistry);
        connectionManager.setMaxTotal(MAX_TOTAL_CONNECTIONS.get());
        connectionManager.setDefaultMaxPerRoute(ROUTE_CONNECTIONS.get());

        RequestConfig requestConfig = RequestConfig.custom()
                .setSocketTimeout(SOCKET_TIMEOUT.get())
                .setConnectTimeout(CONNECT_TIMEOUT.get())
                .setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT.get())
                .setStaleConnectionCheckEnabled(STALE_CONNECTION_CHECK.get())
                .build();

        CloseableHttpAsyncClient httpClient = HttpAsyncClients.custom()
                .setSSLStrategy(sslSessionStrategy)
                .setConnectionManager(connectionManager)
                .setDefaultRequestConfig(requestConfig)
                .build();

        httpClient.start();

        // use httpClient...
    }

    private static class AllowAll implements X509HostnameVerifier
    {
        @Override
        public void verify(String s, SSLSocket sslSocket) throws IOException
        {}

        @Override
        public void verify(String s, X509Certificate x509Certificate) throws SSLException {}

        @Override
        public void verify(String s, String[] strings, String[] strings2) throws SSLException
        {}

        @Override
        public boolean verify(String s, SSLSession sslSession)
        {
            return true;
        }
    }
}
5
Jonas Bergström

내 Apache 2.4 인스턴스 (Comodo 와일드 카드 인증서 사용)에서이 오류의 원인은 SHA-1 서명 된 루트 인증서에 대한 불완전한 경로였습니다. 발급 된 인증서에 체인이 여러 개 있으며 SHA-1 루트 인증서로 연결되는 체인에 중간 인증서 가 누락되었습니다 . 최신 브라우저는이를 처리하는 방법을 알고 있지만 Java 7은 기본적으로이 코드를 처리하지 않습니다 (코드에서이를 수행 할 수있는 몇 가지 복잡한 방법이 있지만). 결과는 자체 서명 된 인증서의 경우와 동일한 오류 메시지입니다.

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)
    ... 22 more

이 경우 중간 인증서 누락으로 인해 "요청한 대상에 대한 유효한 인증서 경로를 찾을 수 없습니다"라는 메시지가 생성됩니다. 서버에 대해 SSL Labs 테스트를 사용하여 누락 된 인증서를 확인할 수 있습니다. 해당 인증서를 찾으면 다운로드하고 (서버가 사용자의 제어하에있는 경우) 인증서를 인증서 번들에 추가합니다. 또는 누락 된 인증서를 로컬로 가져올 수 있습니다. 서버에서이 문제를 해결하는 것이이 문제에 대한보다 일반적인 해결책입니다.

5
vallismortis

데비안과 사전 패키지 된 자바를 좋아하는 사람들을 위해 :

Sudo mkdir /usr/share/ca-certificates/test/  # don't mess with other certs
Sudo cp ~/tmp/test.loc.crt /usr/share/ca-certificates/test/
Sudo dpkg-reconfigure --force ca-certificates  # check your cert in curses GUI!
Sudo update-ca-certificates --fresh --verbose

다음과 같은 이유로 /etc/default/cacerts를 확인하는 것을 잊지 마십시오.

# enable/disable updates of the keystore /etc/ssl/certs/Java/cacerts
cacerts_updates=yes

Cert를 제거하려면 다음을 수행하십시오.

Sudo rm /usr/share/ca-certificates/test/test.loc.crt
Sudo rm /etc/ssl/certs/Java/cacerts
Sudo update-ca-certificates --fresh --verbose
4
gavenkoa

Windows의 경우에만 다음 단계를 수행하십시오.

  1. Chrome에서 설정으로 이동합니다.
  2. 설정에서 고급 설정 표시를 클릭합니다.
  3. HTTPS/SSL에서 인증서 관리를 클릭하십시오.
  4. 인증서 내보내기.
  5. Windows 검색 (키보드의 Windows 키 누르기)에서는 Java를 입력하십시오.
  6. Java 구성 (Java 구성) 옵션을 선택합니다. Java 제어판을 엽니 다.
  7. Java 제어판에서 보안 탭을 선택하십시오.
  8. 인증서 관리를 선택하십시오.
  9. 가져 오기를 클릭하십시오.
  10. (사용자) 탭에서 선택하고 인증서 유형을 (신뢰할 수있는 인증서)
  11. 가져 오기 버튼을 클릭하고 다운로드 한 인증서를 찾아 가져옵니다.
4
Praveen

SHA2를 사용하여 서명 한 Java 7에서 GoDaddy 인증서를 사용하면이 문제가 발생할 수도 있습니다.

Chrome과 다른 모든 브라우저는 안전하지 않기 때문에 SHA1을 사용하여 서명 한 SSL 인증서를 사용하기 시작합니다.

문제에 대한 자세한 정보 는 여기에서 찾을 수 있습니다 . 필요한 경우 서버에서 해결하는 방법도 있습니다.

2
Brad Parks

AVG 버전 18.1.3044 (Windows 10 포함)는 내 로컬 Spring 응용 프로그램과 간섭합니다.

해결책 : "웹 및 전자 메일"이라는 AVG 섹션에 입력하고 "전자 메일 보호"를 비활성화하십시오. AVG 사이트가 안전하지 않은 경우 인증서를 차단합니다.

2
Insoft

업데이트 : 재부팅이 우연히 만난 것을 (나는 희망했다!). 문제의 진정한 원인은 다음과 같습니다. Gradle이 특정 키 저장소를 사용하도록 지시되면 해당 키 저장소에는 모든 공식 루트 인증서가 포함되어야합니다. 그렇지 않으면 일반 리포지토리의 라이브러리에 액세스 할 수 없습니다. 내가해야 할 일은 이것이었다.

자체 서명 인증서 가져 오기 :

keytool -import -trustcacerts -alias myselfsignedcert -file /Users/me/Desktop/selfsignedcert.crt -keystore ./privateKeystore.jks

공식 루트 인증서를 추가하십시오.

keytool -importkeystore -srckeystore <Java-home>/lib/security/cacerts -destkeystore ./privateKeystore.jks

어쩌면 Gradle 데몬도 방해가 될 것입니다. 일이 황량 해 보이기 시작하면 ./gradlew --status에서 발견되는 모든 실행중인 데몬을 죽일만한 가치가 있습니다.

원저 :

아무도 이것을 믿을 수는 없습니다. 그래도 모든 것이 실패하면, 시도해보십시오. Mac의 재부팅 후 문제가 사라졌습니다. Grrr.

배경 : ./gradlew jar는 계속 "요청한 대상에 대한 유효한 인증 경로를 찾을 수 없습니다"

PrivateKeystore.jks에서 가져온 브라우저에서 저장 한 자체 서명 인증서가 붙어 있습니다. 그런 다음 Gradle에게 privateKeystore.jks를 사용하도록 지시했습니다.

org.gradle.jvmargs=-Djavax.net.debug=SSL -Djavax.net.ssl.trustStore="/Users/me/IntelliJ/myproject/privateKeystore.jks"  -Djavax.net.ssl.trustStorePassword=changeit

언급했듯이 이것은 재부팅 후에 만 ​​작동합니다.

2
StaticNoiseLog

나는 인증서 오류와 같은 문제가 있었고 SNI 때문에 있었고, 내가 사용했던 http 클라이언트에는 SNI가 구현되지 않았다. 그래서 버전 업데이트가 그 일을 해냈습니다.

   <dependency>
        <groupId>org.Apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.3.6</version>
    </dependency>
1
Radu Toader

두 가지 옵션이 있습니다. 소프트웨어가 실행될 각 jvm에 대해 자체 서명 된 인증서를 Java의 키 저장소로 가져 오거나 유효성 검사를하지 않는 SSL을 시도하십시오.

jdbc:postgresql://myserver.com:5432/mydatabasename?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory
1
Pradip Das

필자의 경우 키 스토어와 트러스트 스토어 모두 동일한 인증서를 가지고 있으므로 트러스트 스토어를 제거하면 도움이되었습니다. 때로는 인증서 사본이 여러 개인 경우 인증서 체인이 문제가 될 수 있습니다.

0
Smart Coder

https://176.66.3.69:6443/ 에 유효한 인증서가 있는지 확인하십시오. 먼저 브라우저를 통해 확인할 수 있습니다 https not secure 브라우저에서 작동하면 Java에서 작동합니다.

나를 위해 일하는

0
Amr Ibrahim

이것은 나의 문제점을 해결했다,

우리는 인증서를 로컬 Java로 가져와야한다. 그렇지 않으면 우리는 아래 예외를 얻을 수 있습니다.

 javax.net.ssl.SSLHandshakeException : Sun.security.validator.ValidatorException : PKIX 경로 구축 실패 : Sun.security.provider.certpath.SunCertPathBuilderException : 요청한 대상에 대한 유효한 인증 경로를 찾을 수 없습니다. 
 Sun.security.ssl.Alert.getSSLException (Alerts.Java:192) 
 Sun.security.ssl.SSLSocketImpl.fatal (SSLSocketImpl.Java:1949) 
 Sun.security.ssl에서 .Handshaker.fatalSE (Handshaker.Java:302) 

SSLPOKE 는 로컬 시스템에서 https 연결을 테스트 할 수있는 도구입니다.

연결을 테스트하는 명령 :

"%Java_HOME%/bin/Java" SSLPoke <hostname> 443
 Sun.security.validator.ValidatorException : PKIX path building failed : 
 Sun.security.provider.certpath.SunCertPathBuilderException : 요청한 대상에 대한 유효한 인증 경로를 찾을 수 없습니다. 
 Sun. security.validator.PKIXValidator.doBuild (PKIXValidator.Java:387) 
 Sun.security.validator.Validator에서의 Sun.security.validator.PKIXValidator.engineValidate (PKIXValidator.Java:292) 
에서의 설명입니다. sun.security.ssl.X509TrustManagerImpl.validate (X509TrustManagerImpl.Java:324) 
에서 validate (Validator.Java:260) 
 Sun.security.ssl.X509TrustManagerImpl.checkTrusted (X509TrustManagerImpl.Java : 229) 
 Sun.security.ssl.XXXXX.serverCertificate (ClientHandshaker.Java:1496) 
에서 Sun.security.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.Java:124) 
 Sun.security.ssl.ClientHandshaker.processMessage (ClientHandshaker.Java:216) 
 Sun.security에서. ssl.Handshaker.processLoop (Handshaker.Java:1026) 
 Sun.security.ssl.Handshaker.process_record (Handshaker.Java:961) 
 Sun.security.ssl.SSLSocketImpl.readRecord에서 SunSecurity.ssl.SSLSocketImpl.performInitialHandshake (SSLSocketImpl.Java:1375) 
 Sun.security.ssl.SSLSocketImpl.writeRecord (SSLSocketImpl.Java:747)에서. 
 Sun.security.ssl.AppOutputStream.write (AppOutputStream.Java:123) 
 Sun.security.ssl.AppOutputStream.write (AppOutputStream.Java:138) 
 at에서. SSLPoke.main (SSLPoke.Java:31) 
 원인 : Sun.security.provider.certpath.SunCertPathBuilderException : 요청한 대상 
에 대한 유효한 인증 경로를 찾을 수 없습니다. java.security.provider.certpath.SunCertPathBuilder.build (SunCertPathBuilder.Java:121) 
 Jav에서 a.security.cert.CertPathBuilder.build (CertPathBuilder.Java:280) 
 Sun.security.validator.PKIXValidator.doBuild (PKIXValidator.Java:382) 
 ... 15 more 
keytool -import -alias brinternal -keystore "%Java_HOME%/jre/lib/security/cacerts" -file <cert path>

그러면 "Enter keystore password :"라고 프롬프트됩니다. changeit가 기본 암호입니다. 마지막으로 "Trust this certificate? [no] :"라는 프롬프트에서 "yes"를 제공하여 인증서를 키 스토어에 추가합니다.

증명 :

C:\tools>"%Java_HOME%/bin/Java" SSLPoke <hostname> 443
Successfully connected    
0
Naveen

먼저 ssl 인증서를 다운로드 한 다음 Java bin 경로로 이동하여 콘솔에서 아래 명령을 실행하십시오.

C:\Java\JDK1.8.0_66-X64\bin>keytool -printcert -file C:\Users\lova\openapi.cer -keystore openapistore
0
Lova Chittumuri

이것이 문제를 해결할 수 있었던 방법입니다 : http://code.naishe.in/2011/07/looks-like-article-no-more-unable-to.html

0
Bogdan Ustyak

제 경우에는 Java 1.6으로 MacOSs High Sierra를 사용하고 있습니다. cacert 파일은 Gabe Martin-Dempesy의 대답에서 위에 언급 된 것과 다른 위치에 있습니다. cacert 파일은 이미 다른 위치 (/ Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacerts)에 이미 링크되어 있습니다.

파이어 폭스를 사용하여 해당 웹 사이트의 인증서를 "exportedCertFile.crt"라는 로컬 파일로 내 보냈습니다. 거기에서 keytool을 사용하여 인증서를 cacert 파일로 옮겼습니다. 이 문제가 해결되었습니다.

bash-3.2# cd /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/
bash-3.2# keytool -importcert -file ~/exportedCertFile.crt -alias example -keystore cacerts -storepass changeit
0
Alan Curtis