programing

javax.net.ssl 해결.SSLHandshakeException: sun.security.validator.검증자예외: PKIX 경로 구축에 실패했습니다. 오류?

prostudy 2022. 7. 27. 21:32
반응형

javax.net.ssl 해결.SSLHandshakeException: sun.security.validator.검증자예외: PKIX 경로 구축에 실패했습니다. 오류?

편집 : 블로그에서 보다 알기 쉽게 질문을 형식화하고 답변을 수락했습니다.

여기 오리지널 호가 있습니다.

다음 오류가 발생하였습니다.

sun.security.validator 。(예외: 경로 PKIX: PKIX:
sun.security.certpath path 。SunCertPathBuilder 유효한 수 : " " " " " " " " " " " " " " " " " " 。

원인 javax.net.ssl.SSLHandshakeException: sun.security.validator.검증자예외: PKIX 경로를 빌드하지 못했습니다. sun.security.provider.certpath.SunCertPathBuilder예외: 요청된 대상에 대한 올바른 인증 경로를 찾을 수 없습니다.

Tomcat 6는 Tomcat 6입니다.2개의 HTTPS 웹 어플리케이션이 다른 Tomcats에 다른 포트와 같은 머신에 설치되어 있다.App1(어플 8443) App2(어플 443)입니다.App1 App2 。App1 App2 app app 、 App2 app app app 。이것은 매우 일반적인 에러이기 때문에, 다양한 포럼이나 사이트에서 많은 해결 방법을 찾을 수 있었습니다.i i음음 i i i i i i i 。server.xml 캣톰톰 of of of of of:

keystoreFile="c:/.keystore" 
keystorePass="changeit"

모든 사이트에서 app2에서 제공한 인증서가 app1 jvm의 신뢰할 수 있는 저장소에 없는 것과 동일한 이유를 설명합니다.IE 브라우저에서도 같은 URL을 입력하려고 하면 동작합니다(warming에서는 이 웹 사이트의 보안 증명서에 문제가 있습니다).여기에서는, 이 Web 사이트에 계속 접속합니다).그러나 Java 클라이언트(내 경우)에 의해 동일한 URL이 히트하면 위와 같은 오류가 발생합니다.트러스트 스토어에 넣기 위해서, 다음의 3개의 옵션을 시험해 보았습니다.

옵션 1

System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

옵션 2

환경변수의 아래 설정

CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value

옵션 3

환경변수의 아래 설정

JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value

결과

하지만 아무 것도 효과가 없었어.

Apache HttpClient를 사용한 비활성 SSL 증명서 처리 방법에서 제안된 Java 접근 방식을 실행한 것이 마지막으로 성공한 것은 무엇입니까?Pascal Thivent가 InstallCert 프로그램을 실행합니다.

그러나 이 방법은 devbox 셋업에서는 괜찮지만 실제 환경에서는 사용할 수 없습니다.

「 」에서 값을 , 하지 않는 일까.왜 같은 값을 언급했는데도 말이죠.server.xml및 내 한 값 설정

System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

App1 프로그램에 있습니다.

상세한 것에 대하여는, 다음의 방법으로 접속합니다.

URL url = new URL(urlStr);

URLConnection conn = url.openConnection();

if (conn instanceof HttpsURLConnection) {

  HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();
  
  conn1.setHostnameVerifier(new HostnameVerifier() {
    public boolean verify(String hostname, SSLSession session) {
      return true;
    }
  });

  reply.load(conn1.getInputStream());

App2에 대한 인증서를 다음 위치에 있는 사용된 JVM의 신뢰 저장소 파일에 추가해야 합니다.$JAVA_HOME\lib\security\cacerts.

다음 가 신뢰 할 수 .keytool -list -keystore "$JAVA_HOME/jre/lib/security/cacerts"

증명서가 누락된 경우 브라우저에서 인증서를 다운로드하고 다음 명령을 사용하여 신뢰 저장소에 추가합니다.

keytool -import -noprompt -trustcacerts -alias <AliasName> -file   <certificate> -keystore <KeystoreFile> -storepass <Password>

예:

keytool -import -noprompt -trustcacerts -alias myFancyAlias -file /path/to/my/cert/myCert.cer -keystore /path/to/my/jdk/jre/lib/security/cacerts/keystore.jks -storepass changeit

Import 후 첫 번째 명령을 다시 실행하여 증명서가 추가되었는지 확인할 수 있습니다.

여기에서 태양/오라클 정보를 찾을 수 있습니다.

javax.net.ssl.SSLHandshakeException: sun.security.validator.검증자예외: PKIX 경로를 빌드하지 못했습니다. sun.security.provider.certpath.SunCertPathBuilder예외: 요청된 대상에 대한 올바른 인증 경로를 찾을 수 없습니다.

• 오류가 발생했을 때 이 표현의 의미를 구글에서 검색하려고 했는데, 이 문제는 서버가 HTTPS SSL 인증서를 변경했을 때 발생하며 이전 버전의 Java가 루트 인증 기관(CA)을 인식하지 못합니다.

• 브라우저에서 HTTPS URL에 액세스할 수 있는 경우 Java를 업데이트하여 루트 CA를 인식할 수 있습니다.

• 브라우저에서 Java가 액세스할 수 없었던HTTPS URL로 이동합니다.HTTPS 증명서 체인(Internet Explorer에 잠금 아이콘이 있음)을 클릭하고 잠금을 클릭하여 증명서를 표시합니다.

• 인증서의 "상세" 및 "파일에 복사"로 이동합니다.Base64(.cer) 형식으로 복사합니다.데스크탑에 저장됩니다.

• 모든 경고를 무시하고 인증서를 설치합니다.

접속하려고 했던 URL의 증명서 정보를 이렇게 수집했습니다.

이제 증명서가 URL을 더 이상 인식하지 않도록 Java 버전을 확인해야 합니다.이 점에서 루트 증명서 정보는 기본적으로 JDK의 \jre\lib\security Location에 저장되어 있으며 액세스하기 위한 기본 비밀번호는: changeit입니다.

cacerts 정보를 표시하는 절차는 다음과 같습니다.

• [시작] 버튼을 클릭합니다--> [파일명을 지정하여 실행]

• cmd 라고 입력합니다.명령 프롬프트가 열립니다(관리자로서 열어야 할 수 있습니다).

<고객명>Java/jreX/bin

• 다음을 입력합니다.

keytool -list -keystore D:\Java\jdk1.5.0_12\jre\lib\security\cacerts

키 스토어에 포함된 현재 증명서 목록이 표시됩니다.다음과 같습니다.

C:\Documents and Settings\NeelanjanaG>keytool -list -keystore D:\Java\jdk1.5.0_12\jre\lib\security\cacerts

Enter keystore password:  changeit

Keystore type: jks

Keystore provider: SUN

Your keystore contains 44 entries

verisignclass3g2ca, Mar 26, 2004, trustedCertEntry,

Certificate fingerprint (MD5): A2:33:9B:4C:74:78:73:D4:6C:E7:C1:F3:8D:CB:5C:E9

entrustclientca, Jan 9, 2003, trustedCertEntry,

Certificate fingerprint (MD5): 0C:41:2F:13:5B:A0:54:F5:96:66:2D:7E:CD:0E:03:F4

thawtepersonalbasicca, Feb 13, 1999, trustedCertEntry,

Certificate fingerprint (MD5): E6:0B:D2:C9:CA:2D:88:DB:1A:71:0E:4B:78:EB:02:41

addtrustclass1ca, May 1, 2006, trustedCertEntry,

Certificate fingerprint (MD5): 1E:42:95:02:33:92:6B:B9:5F:C0:7F:DA:D6:B2:4B:FC

verisignclass2g3ca, Mar 26, 2004, trustedCertEntry,

Certificate fingerprint (MD5): F8:BE:C4:63:22:C9:A8:46:74:8B:B8:1D:1E:4A:2B:F6

• 이전에 설치한 증명서를 cacert에 포함시켜야 했습니다.

• 이를 위한 절차는 다음과 같습니다.

keytool -import -noprompt -trustcacerts -alias ALIASNAME -file FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass PASSWORD

Java 7을 사용하는 경우:

keytool -importcert -trustcacerts -alias ALIASNAME -file PATH_TO_FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass changeit

• 그런 다음 증명서 정보를 cacert 파일에 추가합니다.

위의 예외에 대해 찾은 해결책입니다!!

Tomcat 7에서의 작업 방법

Tomcat 앱에서 자체 서명된 인증서를 지원하려고 했지만 다음 스니펫이 작동하지 않았습니다.

import java.io.DataOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

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

        URL url = new URL("https:// ... .com");
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
        httpURLConnection.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(httpURLConnection.getOutputStream());

        String serializedMessage = "{}";
        wr.writeBytes(serializedMessage);
        wr.flush();
        wr.close();

        int responseCode = httpURLConnection.getResponseCode();
        System.out.println(responseCode);
    }
}

제 문제는 이렇게 해결됐습니다.

을 다운로드 ..crt

echo -n | openssl s_client -connect <your domain>:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/<your domain>.crt
  • <your domain>jossef.com)

② 을 적용합니다..crtcacerts

keytool -import -v -trustcacerts -alias <your domain> -file ~/<your domain>.crt -keystore <JAVA HOME>/jre/lib/security/cacerts -keypass changeit -storepass changeit
  • <your domain>jossef.com)
  • <JAVA HOME> directoryjava를

3) 해킹하다

iv가 iv'e에 내 Java의 기본 증명서 스토어에서는 Tomcat은 이를 무시합니다(Java의 기본 증명서 스토어를 사용하도록 설정되어 있지 않은 것 같습니다).

이것을 해킹하려면 , 코드의 어딘가에 다음을 추가합니다.

String certificatesTrustStorePath = "<JAVA HOME>/jre/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);

// ...

이 경우 웹 서버가 증명서와 중간 CA만 전송하고 루트 CA는 전송하지 않는 것이 문제였습니다.되었습니다.「 JVM 」 。-Dcom.sun.security.enableAIAcaIssuers=true

Authority Information Access "caIssuers " " 。 되어 또, 시스템 속성 「」을 하게 할 수 .com.sun.security.enableAIAcaIssuers진가를 발휘합니다.

true로 설정하면 Sun의 CertPathBuilder PKIX 구현에서는 ldap, http 또는 ftp 유형의 URI인 경우 지정된 CertStores 외에 증명서의 AIA 확장자 정보를 사용하여 발급된 CA 인증서를 찾습니다.

원천

또 다른 이유는 오래된 버전의 JDK일 수 있습니다.jdk 버전 1.8.0_60을 사용하고 있었습니다만, 최신 버전으로 업데이트 하는 것만으로 증명서의 문제가 해결되었습니다.

SSL 검증을 프로그래밍 방식으로 비활성화할 수 있습니다.개발에는 도움이 되지만 실제 환경에서는 "실제" SSL 검증을 사용하거나 자신의 신뢰할 수 있는 키를 설치 및 사용하여도 "실제" SSL 검증을 사용해야 하므로 권장되지 않습니다.

아래 코드가 유효합니다.

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

public class TrustAnyTrustManager implements X509TrustManager {

  public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  }

  public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  }

  public X509Certificate[] getAcceptedIssuers() {
    return null;
  }
}

             HttpsURLConnection conn = null;
             URL url = new URL(serviceUrl);
             conn = (HttpsURLConnection) url.openConnection();
             SSLContext sc = SSLContext.getInstance("SSL");  
             sc.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());  
                    // Create all-trusting host name verifier
             HostnameVerifier allHostsValid = new HostnameVerifier() {
               public boolean verify(String hostname, SSLSession session) {
                return true;
              }
            };
            conn.setHostnameVerifier(allHostsValid);

Connection아래에서는 모든 접속에 대해 글로벌하게 SSL 검증을 덮어쓸 수도 있습니다.https://stackoverflow.com/a/19542614/32453

Apache HTTPClient를 사용하는 경우 "다르게" 비활성화해야 합니다(예: https://stackoverflow.com/a/2703233/32453

는 용 i i용었 i i i i i 。jdk1.8.0_171★★★★★★★★★★★★서 톱 솔루션( 솔루션 추가)을없었습니다여기서 top 2 솔루션(keytool을 사용한 증명서 추가 및 해킹이 있는 다른 솔루션 추가)을 시도했지만 효과가 없었습니다.

를 JDK로 했습니다.1.8.0_181마법처럼 잘 작동했어요

내 cacerts 파일은 완전히 비어 있었다.이 문제를 해결하려면 Windows 머신에서 cacerts 파일을 복사하고(Oracle Java 7을 사용), Linux 박스(OpenJDK)에 scp'd했습니다.

cd %JAVA_HOME%/jre/lib/security/
scp cacerts mylinuxmachin:/tmp

그 후 Linux 머신에서

cp /tmp/cacerts /etc/ssl/certs/java/cacerts

지금까지는 잘 되고 있어요.

Linux에서 Tomcat 7을 사용하면 효과가 있었습니다.

String certificatesTrustStorePath = "/etc/alternatives/jre/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

、 Linux 서서 。$JAVA_HOME셋업되어 있는 것은 , 통상은 「셋업」, 「셋업」입니다./etc/alternatives/jre$JAVA_HOME/jre

이 에러는 SSL을 처리하는 NGINX 리버스 프록시의 배후에 있는 프로세스에 접속하려고 할 때에도 발생했습니다.

증명서 체인 전체가 연결되어 있지 않은 증명서가 문제인 것으로 판명되었습니다.중급 자격증을 추가하자 문제가 해결되었습니다.

이게 도움이 됐으면 좋겠다.

도입 가능한 솔루션(Alpine Linux)

애플리케이션 환경에서 이 문제를 해결하기 위해 다음과 같은 Linux 터미널 명령을 준비했습니다.

cd ~

홈 디렉토리에 증명서 파일을 생성합니다.

apk add openssl

이 명령어는 alpine Linux에 openssl을 설치합니다.다른 Linux 배포에 적합한 명령을 찾을 수 있습니다.

openssl s_client -connect <host-dns-ssl-belongs> < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > public.crt

필요한 증명서 파일을 생성했다.

sudo $JAVA_HOME/bin/keytool -import -alias server_name -keystore $JAVA_HOME/lib/security/cacerts -file public.crt -storepass changeit -noprompt

생성된 파일을 'keytool' 프로그램으로 JRE에 적용.

참고: DNS를 다음으로 대체하십시오.<host-dns-ssl-belongs>

주의 2: 주의해 주십시오.-noprompt는 확인 및 확인 메시지(yes/no)를.-storepass changeit파라미터는 패스워드 프롬프트를 비활성화하여 필요한 패스워드를 제공합니다(기본값은 '변경').이러한 2개의 속성을 통해 Docker 이미지 구축 등의 애플리케이션 환경에서 이러한 스크립트를 사용할 수 있습니다.

주3 Docker를 통해 앱을 전개하는 경우 비밀 파일을 한 번 생성하여 응용 프로그램 프로젝트 파일에 넣을 수 있습니다.여러 번 생성할 필요가 없습니다.

프로그램 파일에서 모든 Java 버전을 검색하여 인증서를 추가하는 작은 win32(WinXP 32bit testet) studp cmd(커맨드라인) 스크립트를 작성했습니다.비밀번호는 기본 "변경"이거나 스크립트에서 직접 변경해야 합니다.-)

@echo off

for /F  %%d in ('dir /B %ProgramFiles%\java') do (
    %ProgramFiles%\Java\%%d\bin\keytool.exe -import -noprompt -trustcacerts -file some-exported-cert-saved-as.crt -keystore %ProgramFiles%\Java\%%d\lib\security\cacerts -storepass changeit
)

pause

안전을 위해 우리는 구현에 자기 서명 증명서를 사용하지 말아야 한다.그러나 개발의 경우 자체 서명 인증을 받은 시험 환경을 사용해야 하는 경우가 많습니다.이 문제를 코드로 프로그래밍 방식으로 수정하려고 했지만 실패했습니다.그러나 jre trust-store에 cert를 추가함으로써 나의 문제를 해결했습니다.아래 단계를 확인하십시오.

  1. 사이트 증명서를 다운로드 합니다.

  2. 증명서(예:cert_file.cer)를 $JAVA_ 디렉토리에 복사합니다.홈\Jre\Lib\보안.

  3. Administrator에서 CMD를 열고 디렉토리를 $JAVA_로 변경합니다.홈\Jre\Lib\보안.

  4. 다음 명령을 사용하여 증명서를 신뢰 스토어로 Import합니다.

keytool - import - import - ca - file cert_file.cer - keystore cacerts - storepass changeit

키툴을 인식할 수 없다고 하는 에러가 발생했을 경우는, 이것을 참조해 주세요.

다음과 같이 yes 라고 입력합니다.

이 증명서 신뢰: [Yes]

  1. 이제 코드를 실행하거나 java를 사용하여 프로그래밍 방식으로 URL에 액세스해 보십시오.

갱신하다

앱 서버가 jboss인 경우 아래에 시스템 속성을 추가해 보십시오.

System.setProperty("org.jboss.security.ignoreHttpsHost","true");

이게 도움이 됐으면 좋겠네요!

저는 이 게시물 https://stackoverflow.com/a/9619478/4507034에서 인정받은 솔루션을 사용하지 않았습니다.

대신 기계 신뢰 인증으로 인증서를 가져와 문제를 해결했습니다.

순서:

  1. URL url url((( ( : : )https://localhost:8443/yourpath증증기기기기기않않않않않않않)
  2. 상기의 설명에 따라서, 증명서를 export 합니다.
  3. 열려 있는 : Windows 를 엽니다.Manage computer certificates
  4. ★★★★★★★★★★★★★★★로 이동Trusted Root Certification Authorities->Certificates
  5. 서 Import ★★ Import :your_certification_name.cer

이 장소는 악명 높은 PKIX 오류 메시지의 다른 가능한 원인을 문서화하는 데 있어 다른 장소와 마찬가지로 좋은 장소인 것 같습니다.keystore와 truststore의 콘텐츠와 다양한 Java 설치 설정을 너무 오래 본 후, 나는 나의 문제가 ...라는 것을 깨달았다.오타

오타가 난 것은 키스토어도 트러스트 스토어로 사용하고 있었다는 것을 의미합니다.회사 루트 CA는 키스토어에서 스탠드아론 증명서로 정의되지 않고 증명서 체인의 일부로서만 정의되어 있으며, 다른 곳에서도 정의되지 않았기 때문에 PKIX 오류가 계속 발생하였습니다.

릴리스 실패(이것은 prod config, 다른 곳에서는 OK)와 헤드의 스크래치를 2일간 실시한 결과, 오타가 발견되어 모두 정상입니다.

이게 도움이 됐으면 좋겠네요.

MacOS X의 경우, 아래 명령어는 'importcert' 옵션에서 이중 하이픈을 사용해야 했던 것과 똑같습니다.

sudo keytool -–importcert -file /PathTo/YourCertFileDownloadedFromBrowserLockIcon.crt -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/jre/lib/security/cacerts -alias "Cert" -storepass changeit

저도 이 문제가 있어요.

SSL 증명서를 .keystore에 추가하여 거의 모든 것을 시도했지만 Java1_6_x에서는 동작하지 않았습니다.Java의 새로운 버전인 Java1_8_x를 JVM으로 사용하면 도움이 됩니다.

저는 자바로 파일을 다운로드해야 하는 QEMU 환경을 가지고 있기 때문에 동참하고 싶습니다. 보니 '아주머니'가/etc/ssl/certs/java/cacerts에서는 QEMU와 하고 있습니다./etc/ssl/certs/java/cacerts호스트 환경에서 사용할 수 있습니다.호스트 환경은 회사 프록시의 배후에 있으므로 Java cacerts는 맞춤형 버전입니다.

QEMU 환경을 사용하고 있는 경우는, 호스트 시스템이 최초로 파일에 액세스 할 수 있는 것을 확인해 주세요.예를 들어 먼저 호스트 시스템에서 이 스크립트를 사용해 볼 수 있습니다.스크립트가 호스트 머신에서는 정상적으로 동작하지만 QEMU에서는 동작하지 않는 경우는, 저와 같은 문제가 발생하고 있습니다.

이 문제를 해결하기 위해 QEMU에서 원래 파일을 백업하고 호스트 환경의 파일을 QEMU chroot 감옥으로 복사해야 했습니다.그러면 Java는 정상적으로 QEMU에서 파일을 다운로드할 수 있습니다.

더 나은 솔루션은 이 시스템을 탑재하는 것입니다./etcQEMU를 사용하다그래서 저는 이 못생겼지만 쉬운 방법을 사용하기로 했습니다.

내 의견:제 경우 cacerts는 폴더가 아니라 파일이며, 두 개의 경로에 존재합니다.파일을 검출한 후.jks 파일을 그 파일에 복사하면 오류가 사라집니다.

# locate cacerts    
/usr/java/jdk1.8.0_221-amd64/jre/lib/security/cacerts
/usr/java/jre1.8.0_221-amd64/lib/security/cacerts

백업 후 .jks를 복사합니다.

cp /path_of_jks_file/file.jks /usr/java/jdk1.8.0_221-amd64/jre/lib/security/cacerts
cp /path_of_jks_file/file.jks /usr/java/jre1.8.0_221-amd64/lib/security/cacerts

주의: Genexus 프로젝트에서 이 오류를 해결하는 기본 트릭입니다.단, file.jks는 Tomcat의 server.xml 파일에도 있습니다.

플래터를 사용하고 있는데 갑자기 에러가 발생했어요.,이 그 안에 .android/build.gradle다음과 같이 합니다.

  classpath 'com.android.tools.build:gradle:4.1.0'
  classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

등급 파일이 인터넷에서 다운로드된다는 인증이 필요합니다.단, 이러한 증명서를 다운로드하기 위해 gradle을 차단하고 있는 것이 있는 경우는, 통상, 이 내용이 표시됩니다.

인증서를 내보내고 수동으로 추가하려고 했지만, 작동하지 않는 것 같습니다.머리를 수없이 긁힌 후 네트워크 기본 설정에서 프록시를 비활성화하는 것이 제게 효과가 있었습니다.Charles Proxy를 비활성화하는 것이 그것을 고칠 것이라고 언급되어 있었지만, 그 순간 나는 Charles가 무엇이고 어떤 Proxy인지 알 수 없었다.그리고 제 경우 Charles 프록시가 없어서 Mac의 네트워크 기본 설정에서 프록시를 찾았습니다(Windows의 네트워크 설정 어딘가에 있습니다).프록시 내에서 Socks를 활성화했습니다.그걸 무효로 하고 다시 그라들과 TA-DAH를 다시 만들었어요!!!그것은 부드럽게 작동했다.

몇 가지 기억해야 할 것이 있습니다.네트워크 기본 설정 탭을 닫지 않고 프록시를 사용하지 않도록 설정한 후 바로 프로젝트를 빌드하면 프록시 사용 안 함이 작동하지 않고 동일한 오류가 표시됩니다.또, 프로젝트를 이미 빌드 해 놓고 프록시를 무효로 한 후에 다시 실행하고 있는 경우는, 같은 에러가 표시될 가능성이 있습니다(IDE 캐시가 원인일 가능성이 있습니다).기능: Mac을 재부팅하고 브라우저에서 몇 가지 탭을 열어(몇 가지 네트워크 콜의 경우), 네트워크 프리퍼런스를 시스템 프리퍼런스>> wifi에서 체크하고 프록시를 비활성화한 후 시스템 프리퍼런스 앱을 닫고 프로젝트를 구축합니다.

Ubuntu 서버에서 실행되고 있는 Tomcat의 경우 어떤 Java가 사용되고 있는지 확인하려면 "ps -ef | grep tomcat" 명령을 사용합니다.

샘플:

/home/mcp01$ **ps -ef |grep tomcat**
tomcat7  28477     1  0 10:59 ?        00:00:18 **/usr/local/java/jdk1.7.0_15/bin/java** -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -Djava.awt.headless=true -Xmx512m -XX:+UseConcMarkSweepGC -Djava.net.preferIPv4Stack=true -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/share/tomcat7/endorsed -classpath /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/var/lib/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp org.apache.catalina.startup.Bootstrap start
1005     28567 28131  0 11:34 pts/1    00:00:00 grep --color=auto tomcat

다음으로 cd /usr/local/java/jdk1.7.0_15/jre/lib/security로 이동합니다.

기본 cacerts 파일은 여기에 있습니다.신뢰할 수 없는 증명서를 삽입합니다.

  • JVM 위치를 확인합니다.시스템에 6개의 JRE가 있을 수 있습니다.Tomcat에서 실제로 사용하는 것은 무엇입니까?Tomcat에서 실행 중인 코드 내 임의의 위치에 println("system.getProperty("java.home"))을 입력합니다.이 장소에 주의해 주세요.<자바>로.home>/lib/security/cacerts 파일은 Tomcat에서 사용되는 증명서입니다.
  • 장애가 발생하고 있는 루트 증명서를 찾습니다.이 문제는 -Djavax.net.debug=all을 사용하여 SSL 디버깅을 켜면 확인할 수 있습니다.콘솔 SSL 로그에서 앱과 메모를 실행하여 장애가 발생한 CA를 기록합니다.해당 URL을 사용할 수 있습니다.저 같은 경우에는 실제로 콜을 대행하고 CA 증명서를 반환하고 있었기 때문에 프록시 zscaler가 실패한 것을 알고 놀랐습니다.
  • 브라우저에서 URL을 붙여넣습니다.증명서가 다운로드 됩니다.
  • keytool Import를 사용하여 이 증명서를 cacert로 Import합니다.

AWS EC2에서 실행 중인 앱 서버에서 REST 호출을 하다가 이 문제가 발생했습니다.다음 절차로 문제를 해결했습니다.

  1. -vs curl https://your_rest_path
  2. echo | openssl s_client - connect your_domain : 443
  3. sudo apt-get install ca-cates

curl -vs https://your_rest_path가 작동합니다!

Apache Tomcat/7.0.67 및 Java JVM 버전 1.8.0_66-b18에서도 동일한 문제가 발생합니다.Java를 JRE 1.8.0_241로 업그레이드하여 문제가 해결된 것 같습니다.

JDK 11을 사용하는 경우 폴더에 JRE가 없습니다.증명서의 위치는 jdk-11.0.11/lib/security/cacerts입니다.

OkHttp Client에서는 이 솔루션이 효과가 있었습니다.도서관을 이용하는 사람에게 도움이 될 수도 있어요

try {

            String proxyHost = "proxy_host";
            String proxyUsername = "proxy_username";
            String proxyPassword = "proxy_password";

            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, "port goes here"));

            // Create a trust manager that does not validate certificate chains
            TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    @Override
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return new java.security.cert.X509Certificate[]{};
                    }
                    @Override
                    public void checkClientTrusted(
                            java.security.cert.X509Certificate[] certs, String authType) {
                    }
                    @Override
                    public void checkServerTrusted(
                            java.security.cert.X509Certificate[] certs, String authType) {
                    }
                }
            };

            // Install the all-trusting trust manager
            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
            // Create an ssl socket factory with our all-trusting manager
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            OkHttpClient client = new OkHttpClient().newBuilder()
                    .sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0])
                    .hostnameVerifier((hostname, session) -> true)
                    .connectTimeout(timeout, TimeUnit.SECONDS)
                    .proxy(proxy)
                    .proxyAuthenticator((route, response) -> {
                        String credential = Credentials.basic(proxyUsername, proxyPassword);
                        return response.request().newBuilder()
                                .header("Proxy-Authorization", credential)
                                .build();
                    })
                    .build();

            MediaType mediaType = MediaType.parse("application/json");
            RequestBody requestBody = RequestBody.create(payload, mediaType);

            Request request = new Request.Builder()
                    .url(url)
                    .header("Authorization", "authorization data goes here")
                    .method(requestMethod, requestBody)
                    .build();

            Response response = client.newCall(request).execute();

            resBody = response.body().string();

            int responseCode = response.code();

        } catch (Exception ex) {
        }

다양한 증명서의 내용과 표준적인 openssl 절차를 통해 생성된 것을 보면 AutorityKeyIdentifier가 openssl 루트 증명서에 대해 설정되어 있는 것을 알 수 있습니다.아마도 그것을 극복할 방법이 있을 것이다...잘은 모르겠지만...

그리고 Java11과 BouncyCastle을 사용하여 루트 증명서와 키를 생성하는 작은 애플리케이션을 개발했습니다.이거는 github에 있습니다.https://github.com/kendarorg/JavaCaCertGenerator

이 도구로 생성된 루트 증명서는 AuthorityKeyIdentifier를 포함하지 않으며 키툴을 사용하여 cacert 저장소에 직접 설치할 수 있습니다.csr 및 도메인 이름을 가진 ext 파일을 작성하면 루트를 포함하는 cacert 스토어에 대해 검증됩니다.악수 예외는 없습니다!

cacert가 재귀적인 AuthorityKeyIdentifier를 허용하지 않을 수 있습니다.모르겠습니다만, 리뷰를 해 주시면 감사하겠습니다.

프록시 뒤에 있을 때 Android Studio에 문제가 있었습니다.빌드 중에 매핑 파일을 업로드하는 Crashlytics를 사용하고 있었습니다.

를 트러스트 증명서가 없습니다./Users/[username]/Documents/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/security/cacerts

다음 명령어를 사용합니다.keytool -import -trustcacerts -keystore cacerts -storepass [password] -noprompt -alias [alias] -file [my_certificate_location]

신뢰 패스워드 「」를 합니다.keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias myproxycert -file /Users/myname/Downloads/MyProxy.crt

그냥 작은 해킹이야."hudson.model" 파일의 URL을 업데이트합니다.UpdateCenter.xml"을 https에서http로 변경합니다.

<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>http://updates.jenkins.io/update-center.json</url>
  </site>
</sites>

@NDeveloper에 대한 훌륭한 답변을 기대하십시오.물론 복사 붙여넣기를 해서 값을 바꾸면

Illegal option:  ?import

하이픈을 체크했는데 그 답변에 ASC를 사용한 하이픈이 있더군요.II

– 8211

문제가 발생하는 경우 나에게 효과가 있었던 ASCII 코드가 이 코드인지 확인합니다= 45

- 45

내 코드

keytool -import -noprompt -trustcacerts -alias Certificado -file "C:\Users\JavIut\Desktop\Company\Certificados\Certificado.cer" -keystore "C:\Program Files\Java\jdk1.8.0_121\jre\lib\security\cacerts"

언급URL : https://stackoverflow.com/questions/9619030/resolving-javax-net-ssl-sslhandshakeexception-sun-security-validator-validatore

반응형