치명적 경보 수신 : SSLHandshakeException을 통한 handshake_failure


134

인증 된 SSL 연결에 문제가 있습니다. 클라이언트 인증 SSL 인증서로 외부 서버에 연결하는 Struts Action을 작성했습니다. 내 작업에서 서버로 인해 다음과 같은 오류가 발생하여 일부 데이터를 은행 서버로 보내려고하지만 운이 없습니다.

error: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

서버로 데이터를 보내는 내 Action 클래스의 내 메소드

//Getting external IP from host
    URL whatismyip = new URL("http://automation.whatismyip.com/n09230945.asp");
    BufferedReader inIP = new BufferedReader(new InputStreamReader(whatismyip.openStream()));

    String IPStr = inIP.readLine(); //IP as a String

    Merchant merchant;

    System.out.println("amount: " + amount + ", currency: " + currency + ", clientIp: " + IPStr + ", description: " + description);

    try {

        merchant = new Merchant(context.getRealPath("/") + "merchant.properties");

    } catch (ConfigurationException e) {

        Logger.getLogger(HomeAction.class.getName()).log(Level.INFO, "message", e);
        System.err.println("error: " + e.getMessage());
        return ERROR;
    }

    String result = merchant.sendTransData(amount, currency, IPStr, description);

    System.out.println("result: " + result);

    return SUCCESS;

내 merchant.properties 파일 :

bank.server.url=https://-servernameandport-/
https.cipher=-cipher-

keystore.file=-key-.jks
keystore.type=JKS
keystore.password=-password-
ecomm.server.version=2.0

encoding.source=UTF-8
encoding.native=UTF-8

처음으로 이것이 인증서 문제라고 생각하여 .pfx에서 .jks로 변환했지만 변경하지 않고 동일한 오류가 발생했습니다.


서버의 SSL 인증서를 신뢰 저장소에 추가 했습니까?
happymeal

죄송합니다, 이것이 무엇을 의미하는지
모르겠습니다.

귀하의 앱이 Java 기본 신뢰 저장소를 사용한다고 가정합니다. 기본 신뢰 저장소는 <java-home> / lib / security / cacerts입니다. 브라우저로 서버의 URL을 열고 모든 SSL 인증서를 다운로드하십시오. 모든 체인 / 중간 인증을 포함합니다. 그런 다음이 인증서를 모두 신뢰 저장소에 추가하십시오.
happymeal

클라이언트 인증 인증서로 인해 브라우저에서 URL을 열 수 없습니다. 클라이언트에서 얻은 특정 매개 변수 만이 링크로 보낼 수 있습니다.
Denees

그냥 URL을여십시오. 브라우저에 나타나는 모든 오류를 무시하십시오. URL에 액세스하면 브라우저의 주소 표시 줄에 자물쇠 아이콘이 표시됩니다. 그것을 클릭하고 서버의 SSL 인증서를 다운로드하십시오.
happymeal

답변:


251

여러 가지 이유로 핸드 셰이크 실패가 발생했을 수 있습니다.

  • 클라이언트와 서버에서 호환되지 않는 암호 스위트를 사용 중입니다. 이를 위해서는 클라이언트가 서버에서 지원하는 암호 제품군을 사용 (또는 활성화)해야합니다.
  • 호환되지 않는 SSL 버전이 사용 중입니다 (서버는 TLS v1 만 허용하고 클라이언트는 SSL v3 만 사용할 수 있음). 클라이언트는 SSL / TLS 프로토콜의 호환 가능한 버전을 사용해야합니다.
  • 서버 인증서의 불완전한 신뢰 경로. 클라이언트가 서버의 인증서를 신뢰하지 않을 수 있습니다. 일반적으로 더 자세한 오류가 발생하지만 가능합니다. 일반적으로 수정은 서버의 CA 인증서를 클라이언트의 신뢰 저장소로 가져 오는 것입니다.
  • 인증서는 다른 도메인에 대해 발급됩니다. 다시 말하지만, 더 자세한 메시지가 나왔을 것입니다. 그러나 이것이 원인 인 경우 여기에 수정 사항을 설명하겠습니다. 이 경우 해결 방법은 서버가 올바른 인증서를 사용하도록 서버를 얻는 것입니다.

기본 장애를 정확히 파악할 수 없으므로 -Djavax.net.debug=allSSL 연결을 디버깅 할 수 있도록 플래그를 설정 하는 것이 좋습니다 . 디버그가 켜져 있으면 핸드 셰이크의 어떤 활동이 실패했는지를 정확히 알 수 있습니다.

최신 정보

현재 사용 가능한 세부 사항을 기반으로, 문제점은 서버에 발행 된 인증서와 루트 CA 사이의 불완전한 인증서 신뢰 경로로 인한 것으로 보입니다. 대부분의 경우 루트 CA의 인증서가 신뢰 저장소에 없기 때문에 인증서 신뢰 경로가 존재하지 않기 때문입니다. 인증서는 본질적으로 클라이언트에 의해 신뢰되지 않습니다. 브라우저는 경고를 표시하여 사용자가이를 무시할 수 있지만 SSL 클라이언트 ( HttpsURLConnection 클래스 또는 Apache HttpComponents Client 와 같은 HTTP 클라이언트 라이브러리와 같은)의 경우도 마찬가지 입니다.

이러한 클라이언트 클래스 / 라이브러리 대부분은 인증서 유효성 검증을 위해 JVM이 사용하는 신뢰 저장소에 의존합니다. 대부분의 경우 이것은 cacertsJRE_HOME / lib / security 디렉토리 의 파일입니다. JVM 시스템 특성을 사용하여 신뢰 저장소의 위치를 ​​지정한 경우 javax.net.ssl.trustStore해당 경로의 저장소는 일반적으로 클라이언트 라이브러리가 사용하는 위치입니다. 확실치 않은 경우 Merchant클래스를 살펴보고 연결에 사용중인 클래스 / 라이브러리를 찾으십시오 .

CA를 발급하는 서버의 인증서를이 신뢰 저장소에 추가하면 문제를 해결해야합니다. 이 목적으로 도구얻는 것에 대한 관련 질문에 대한대답을 참조 할 수 있지만 Java keytool 유틸리티 는이 목적으로 충분합니다.

경고 : 신뢰 저장소는 기본적으로 신뢰하는 모든 CA의 목록입니다. 신뢰할 수없는 CA에 속하지 않는 인증서를 넣은 경우 개인 키를 사용할 수 있으면 해당 엔터티에서 발급 한 인증서가있는 사이트에 대한 SSL / TLS 연결을 해독 할 수 있습니다.

업데이트 # 2 : JSSE 추적의 출력 이해

JVM이 사용하는 키 저장소 및 신뢰 저장소는 일반적으로 다음과 같이 다소 처음에 나열됩니다.

keyStore is : 
keyStore type is : jks
keyStore provider is : 
init keystore
init keymanager of type SunX509
trustStore is: C:\Java\jdk1.6.0_21\jre\lib\security\cacerts
trustStore type is : jks
trustStore provider is : 

잘못된 신뢰 저장소를 사용하는 경우 서버 인증서를 올바른 인증서로 다시 가져 오거나 나열된 인증서를 사용하도록 서버를 다시 구성해야합니다 (여러 JVM이있는 경우 권장되지 않음). 필요).

신뢰 인증서 목록에 필요한 인증서가 포함되어 있는지 확인하려면 다음과 같이 시작하는 섹션이 있습니다.

adding as trusted cert:
  Subject: CN=blah, O=blah, C=blah
  Issuer:  CN=biggerblah, O=biggerblah, C=biggerblah
  Algorithm: RSA; Serial number: yadda
  Valid from SomeDate until SomeDate

서버의 CA가 주체인지 확인해야합니다.

핸드 셰이크 프로세스에는 몇 가지 중요한 항목이 있습니다 (세부 사항을 이해하려면 SSL을 알아야합니다). 그러나 현재 문제점을 디버깅하기 위해 handshake_failure가 일반적으로 ServerHello에보고되어 있으면 충분합니다.

1. ClientHello

연결이 초기화 될 때 일련의 항목이보고됩니다. SSL / TLS 연결 설정에서 클라이언트가 보낸 첫 번째 메시지는 일반적으로 로그에 다음과 같이보고되는 ClientHello 메시지입니다.

*** ClientHello, TLSv1
RandomCookie:  GMT: 1291302508 bytes = { some byte array }
Session ID:  {}
Cipher Suites: [SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_DES_CBC_SHA, SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA]
Compression Methods:  { 0 }
***

사용 된 암호 제품군에 유의하십시오. 이 동의해야 할 수 있습니다 동일한 규칙이 은행의 라이브러리에 의해 사용될 수를 들어, merchant.properties 파일의 항목으로. 사용 된 규칙이 다르면 암호 스위트가 호환되지 않는 경우 ServerHello가 상태를 표시하므로 걱정할 필요가 없습니다.

2. ServerHello

서버는 ServerHello로 응답하여 연결 설정을 진행할 수 있는지 여부를 나타냅니다. 로그의 항목은 일반적으로 다음 유형입니다.

*** ServerHello, TLSv1
RandomCookie:  GMT: 1291302499 bytes = { some byte array}
Cipher Suite: SSL_RSA_WITH_RC4_128_SHA
Compression Method: 0
***

선택한 암호 스위트에 유의하십시오. 이것은 서버와 클라이언트 모두에서 사용할 수있는 최상의 제품군입니다. 오류가있는 경우 일반적으로 암호 스위트가 지정되지 않습니다. 서버의 인증서 (및 선택적으로 전체 체인)는 서버에 의해 전송되며 다음 항목에서 찾을 수 있습니다.

*** Certificate chain
chain [0] = [
[
  Version: V3
  Subject: CN=server, O=server's org, L=server's location, ST =Server's state, C=Server's country
  Signature Algorithm: SHA1withRSA, OID = some identifer

.... the rest of the certificate
***

인증서 확인에 성공하면 다음과 유사한 항목이 표시됩니다.

Found trusted certificate:
[
[
  Version: V1
  Subject: OU=Server's CA, O="Server's CA's company name", C=CA's country
  Signature Algorithm: SHA1withRSA, OID = some identifier

핸드 셰이크는 일반적으로이 단계에서 완료되기 때문에 위 단계 중 하나가 실패하여 handshake_failure가 발생합니다 (실제로는 아니지만 핸드 셰이크의 후속 단계는 일반적으로 핸드 셰이크 실패를 유발하지 않음). 어떤 단계가 실패했는지 파악하고 해당 메시지를 질문에 대한 업데이트로 게시해야합니다 (이미 메시지를 이해하고 해결하기 위해 수행 할 작업을 알고 있지 않은 경우).


가능한 경우 답변을 좀 더 구체적으로 업데이트 할 수 있도록 게시하십시오.
Vineet Reynolds 2012

1
좋아 Vineet, 나는 그것을 처리하는 방법을 알 수 없다, 나는 이미 지쳤다. openssl "openssl s_client -connect servername : 4402"로 서버 URL을 확인하는 방법을 찾았으며 찾은 내용 : img225.imageshack.us/img225/8999/screenshoturr.png
Denees

@hoss, OpenSSL이 사용하는 트러스트 저장소에 존재하지 않으며 서버에 연결할 때 서버 (클라이언트)가 사용하는 트러스트 저장소에도 존재하지 않는 엔티티가 서버 인증서를 발행 한 것처럼 보입니다. 서버. 이 경우 서버가 아닌 인증서를 발급 한 CA의 인증서를 클라이언트 (OpenSSL / 서버) 신뢰 저장소 로 가져와야합니다 .
Vineet Reynolds 2012

1
cacerts에 의존하고있을 수도 있습니다. 그러나 네트워크 디버그의 출력을 이해 한 경우에만이를 결정할 수 있습니다. 이를 확인하려면 keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts명령을 사용 하여 내용을 인쇄 해야합니다 . 그런 다음 cacerts의 인증서가 은행 인증서의 CA와 일치하는지 확인하십시오.
Vineet Reynolds 11

5
기본값은 보통 changeit입니다. 변경되지 않는 한.
Vineet Reynolds 11

20

자바 암호화 확장 기능 (JCE) 무제한 강도를 설치 ( JDK7에 대한 | JDK8에 대한 )는이 버그를 수정 할 수 있습니다. 파일의 압축을 풀고 추가 정보에 따라 설치하십시오.


16

핸드 셰이크 실패는 버그가있는 TLSv1 프로토콜 구현 일 수 있습니다.

우리의 경우 이것은 Java 7에 도움이되었습니다.

java -Dhttps.protocols=TLSv1.2,TLSv1.1,TLSv1 

jvm은이 순서대로 협상합니다. 최신 업데이트가있는 서버는 1.2를 수행하고 버그가 많은 서버는 v1로 이동하며 Java 7의 유사한 v1에서 작동합니다.


1
이것은 나를 도왔다. 내 ClientHello가 있었지만 서버가 없었습니다. 이것은 Java 7에서 나를 위해 고쳤습니다. 대단히 감사합니다.
virgo47

15

이는 클라이언트가 인증서를 제시해야 할 때도 발생할 수 있습니다. 서버가 인증서 체인을 나열하면 다음이 발생할 수 있습니다.

3. 인증 요청 서버는 클라이언트로부터 인증 요청을 발행합니다. 요청에는 서버가 수락하는 모든 인증서가 나열됩니다.

*** CertificateRequest
Cert Types: RSA
Cert Authorities:
<CN=blah, OU=blah, O=blah, L=blah, ST=blah, C=blah>
<CN=yadda, DC=yadda, DC=yadda>
<CN=moreblah, OU=moreblah, O=moreblah, C=moreblah>
<CN=moreyada, OU=moreyada, O=moreyada, C=moreyada>
... the rest of the request
*** ServerHelloDone

4. 클라이언트 인증서 체인 클라이언트가 서버로 보내는 인증서입니다.

*** Certificate chain
chain [0] = [
[
  Version: V3
  Subject: EMAILADDRESS=client's email, CN=client, OU=client's ou, O=client's Org, L=client's location, ST=client's state, C=client's Country
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5
  ... the rest of the certificate
*** ClientKeyExchange, RSA PreMasterSecret, TLSv1    
... key exchange info 

체인에 인증서가없고 서버에 인증서가 필요한 경우 여기에 핸드 셰이크 오류가 발생합니다. 인증서의 경로를 찾을 수 없기 때문일 수 있습니다.

5. 인증서 확인 클라이언트는 서버에 인증서 확인을 요청합니다.

*** CertificateVerify
... payload of verify check

이 단계는 인증서를 보내는 경우에만 발생합니다.

6. 완료 서버가 확인 응답으로 응답합니다.

*** Finished
verify_data:  { 345, ... }

내 경우에는 모든 단계가 괜찮은 것처럼 보이지만 여전히 핸드 셰이크 오류가 발생합니다.
tibi

아주 좋은 대답 ...하지만 모든 악수 실패에서 괜찮지 만 여전히 실패했습니다. 내 비슷한 질문을 볼 수 있습니까?
tibi

클라이언트 인증서를 제시하지 못하면 TLS에서 오류가 발생하지 않습니다. 서버에 클라이언트 인증서가 필요하고 인증서가 없으면 연결이 닫힙니다.
Lorne의 후작

@EJP 사실 TLS에서는 오류가 아니지만 실패한 연결은 Java 코드에서 오류로 나타납니다.
Brig

1
@Brig 그러나 경고가 아닙니다.이 답변이 말하는 것과 질문에 관한 것입니다.
Lorne의 후작

15

나는 이것이 첫 번째 질문자의 문제를 해결한다고 생각하지 않지만 Google 직원이 답을 얻기 위해 여기에 온다고 생각합니다.


릴리스 노트 페이지에서 볼 수 있듯이 업데이트 51에서 java 1.8은 기본적으로 RC4 암호를 금지했습니다.

버그 수정 : RC4 암호화 제품군 금지

RC4는 이제 손상된 암호로 간주됩니다.

RC4 암호화 제품군은 Oracle JSSE 구현의 클라이언트 및 서버 기본 가능 암호화 제품군 목록에서 제거되었습니다. 이러한 암호화 방식은 여전히 활성화 할 수 있습니다 SSLEngine.setEnabledCipherSuites()SSLSocket.setEnabledCipherSuites()방법. JDK-8077109 (공개 아님)를 참조하십시오.

서버가이 암호를 선호하거나이 암호 만 사용하면 handshake_failureon Java를 트리거 할 수 있습니다 .

RC4 암호를 사용하는 서버에 대한 연결을 테스트 할 수 있습니다 (먼저 enabled인수 없이 시도 하여 트리거가 있는지 확인한 handshake_failure후 설정) enabled.

import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.*;

import java.util.Arrays;

/** Establish a SSL connection to a host and port, writes a byte and
 * prints the response. See
 * http://confluence.atlassian.com/display/JIRA/Connecting+to+SSL+services
 */
public class SSLRC4Poke {
    public static void main(String[] args) {
        String[] cyphers;
        if (args.length < 2) {
            System.out.println("Usage: "+SSLRC4Poke.class.getName()+" <host> <port> enable");
            System.exit(1);
        }
        try {
            SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
            SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(args[0], Integer.parseInt(args[1]));
        
            cyphers = sslsocketfactory.getSupportedCipherSuites();
            if (args.length ==3){
                sslsocket.setEnabledCipherSuites(new String[]{
                    "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5",
                    "SSL_DH_anon_WITH_RC4_128_MD5",
                    "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
                    "SSL_RSA_WITH_RC4_128_MD5",
                    "SSL_RSA_WITH_RC4_128_SHA",
                    "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
                    "TLS_ECDHE_RSA_WITH_RC4_128_SHA",
                    "TLS_ECDH_ECDSA_WITH_RC4_128_SHA",
                    "TLS_ECDH_RSA_WITH_RC4_128_SHA",
                    "TLS_ECDH_anon_WITH_RC4_128_SHA",
                    "TLS_KRB5_EXPORT_WITH_RC4_40_MD5",
                    "TLS_KRB5_EXPORT_WITH_RC4_40_SHA",
                    "TLS_KRB5_WITH_RC4_128_MD5",
                    "TLS_KRB5_WITH_RC4_128_SHA"
                });     
            }

            InputStream in = sslsocket.getInputStream();
            OutputStream out = sslsocket.getOutputStream();

            // Write a test byte to get a reaction :)
            out.write(1);

            while (in.available() > 0) {
                System.out.print(in.read());
            }
            System.out.println("Successfully connected");

        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}

1- https : //www.java.com/en/download/faq/release_changes.xml


10

JDK 1.7을 사용하려고 시도하는 동안이 오류가 발생했습니다. JDK를 jdk1.8.0_66으로 업그레이드하면 모두 제대로 작동하기 시작했습니다.

따라서이 문제에 대한 가장 간단한 해결책은 JDK를 업그레이드 하면 잘 작동하기 시작할 수 있습니다.


4
좋은. 가장 간단한 해결책은 JDK를 업그레이드하는 것입니까? : D 당신은 그것이 수행되는 환경에 따라 얼마나 복잡 할 수 있는지 알고 있습니까? Amazon이 JDK 7을 실행하고 갑자기 JDK 8로 업그레이드해야한다고 가정 해 봅시다.
Arturas M

1
간단한 마이너 버전 업그레이드로이 문제가 해결되었습니다. JDK 11.0.1에서 11.0.6으로
Clint

4

내 경우에는 인증서를 가져오고 오류가 남아 있으며 System.setProperty("https.protocols", "TLSv1.2,TLSv1.1,SSLv3");연결 전에 추가 하여이 문제를 해결했습니다.


Java 1.8에서 나를 위해 일했습니다. 감사합니다 :)
Supun Amarasinghe

3

제대로 구성된 적절한 SSL / TLS 프로토콜을 사용하는 가정 당신 keyStoretrustStore하고 인증서와 함께 스스로를 문제가 존재하지 않음을 확인, 당신이해야 할 보안 알고리즘을 강화 .

Vineet의 답변 에서 언급 했듯이이 오류가 발생하는 한 가지 이유는 호환되지 않는 암호 제품군이 사용되기 때문입니다. JDK 폴더에있는 my local_policyUS_export_policyjar security파일을 JCE (Java Cryptography Extension)에 제공된 폴더로 업데이트 하여 핸드 셰이크를 성공적으로 완료 할 수있었습니다.


2

OkHttp 클라이언트에서 https 기반 URL을 얻는 것과 동일한 문제가 있습니다. Https 프로토콜 버전 및 서버 측과 클라이언트 측 사이의 Cipher 메소드 불일치인해 발생했습니다 .

1) 귀하의 웹 사이트 https 프로토콜 버전 및 암호 방법을 확인하십시오.

openssl>s_client -connect your_website.com:443 -showcerts

많은 세부 정보를 얻을 수 있으며 주요 정보는 다음과 같습니다.

SSL-Session:
    Protocol  : TLSv1
    Cipher    : RC4-SHA
2) 예를 들어 OkHttp 클라이언트의 경우 http 클라이언트를 구성하십시오 .
@Test()
public void testHttpsByOkHttp() {
    ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
            .tlsVersions(TlsVersion.TLS_1_0) //protocol version
            .cipherSuites(
                    CipherSuite.TLS_RSA_WITH_RC4_128_SHA, //cipher method
                    CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
                    CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
                    CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256)
            .build();

    OkHttpClient client = new OkHttpClient();
    client.setConnectionSpecs(Collections.singletonList(spec));
    Request request = new Request.Builder().url("https://your_website.com/").build();
    try {
        Response response = client.newCall(request).execute();
        if(response.isSuccessful()){
            logger.debug("result= {}", response.body().string());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

이것은 우리가 원하는 것을 얻을 것입니다.


2

Java 클라이언트 프로세스가 다음과 같이 구성된 경우 이러한 방식으로 실패한 HTTPS 서버를 발견했습니다.

-Djsse.enableSNIExtension=false

연결 이 완료된 handshake_failureServerHello데이터 스트림이 시작되기 전에 연결에 실패 했습니다.

문제를 식별하는 명확한 오류 메시지가 없습니다. 오류는 다음과 같습니다.

main, READ: TLSv1.2 Alert, length = 2
main, RECV TLSv1.2 ALERT:  fatal, handshake_failure
%% Invalidated:  [Session-3, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384]
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

" -Djsse.enableSNIExtension=false"옵션을 사용하거나 사용하지 않고 문제를 격리했습니다.


GDAX 샌드 박스에 연결하는 동안 동일한 오류가 발생합니다. 이에 대한 해결책은 무엇입니까?
Nitin Vavdiya

1

TLS버전이 호환되지 않는 오류였습니다.

이전에는 문제를 해결하여 TLSv1변경했습니다 TLSV1.2.


1

com.google.api http 클라이언트를 사용하고 있습니다. 내부 회사 사이트와 통신 할 때 http 대신 실수로 https를 사용할 때이 문제가 발생했습니다.

main, READ: TLSv1.2 Alert, length = 2
main, RECV TLSv1.2 ALERT:  fatal, handshake_failure
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
main, IOException in getSession():  javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
main, called close()
main, called closeInternal(true)
262 [main] DEBUG org.apache.http.impl.conn.DefaultClientConnection  - Connection shut down
main, called close()
main, called closeInternal(true)
263 [main] DEBUG org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager  - Released connection is not reusable.
263 [main] DEBUG org.apache.http.impl.conn.tsccm.ConnPoolByRoute  - Releasing connection [HttpRoute[{s}->https://<I-replaced>]][null]
263 [main] DEBUG org.apache.http.impl.conn.tsccm.ConnPoolByRoute  - Notifying no-one, there are no waiting threads
Exception in thread "main" javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
    at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:431)
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:339)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:123)
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:147)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:108)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:576)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:554)
    at com.google.api.client.http.apache.ApacheHttpRequest.execute(ApacheHttpRequest.java:67)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:960)

아뇨. 서버가 TLS를 말하지 않으면 TLS 경고를 보낼 수 없습니다.
Lorne의 후작

내 프로그램의 출력을 표시하기 위해 내 의견을 업데이트했습니다. 이건 진짜야 다운 투표를 제거하면 감사하겠습니다.
thebiggestlebowski 2016 년

실제이지만 TLS를 일반 텍스트 서버와 통신하여 발생하는 것은 아닙니다. 일반 텍스트 서버는 정의에 따라 TLS와 통신하지 않으므로 정의에 따라 TLS 경고를받을 수 없습니다. 누가 귀하의 답변을 하향 조정했는지에 대한 정보가 없습니다.
Lorne의 후작

나는 당신이 아래로 투표했다고 가정합니다-그것이 사실이 아니라면 사과드립니다. 내 오류 메시지는이 질문의 제목과 정확히 일치합니다. 이 오류 메시지가 표시되는 올바른 경로 / 테스트 사례이며 다른 사람들을 도울 수있는 솔루션이 있습니다. 각각 TLS 서버 오류 응답으로 인한 것인지 아닌지는 중요하지 않습니다. 누군가가 Google에서 여기에 착륙하고 같은 실수를하면 내 대답이 도움이 될 수 있습니다.
thebiggestlebowski 2016 년

오류 메시지에 대해 아무 말도하지 않았습니다. 'HTTP 대신 HTTPS를 잘못 사용'했기 때문에 잘못된 주장에 대해 언급하고 있습니다. 내가 말한 이유와 당신이 어떤 식 으로든 언급하지 않은 이유는 아닙니다. 일반 텍스트에는 TLS 경고가 없지만 근본적인 문제를 해결하지 않으므로 HTTP를 사용하면 분명히 사라질 것입니다.
Lorne의 후작

1

비슷한 문제가있었습니다. Apache HTTPClient 4.5.3으로 업그레이드하면 해결되었습니다.


1

어그! 이것은 단순히 Java 버전 문제로 판명되었습니다. JRE 1.6을 사용하여 핸드 셰이크 오류가 발생했으며 JRE 1.8.0_144를 사용하여 모든 것이 완벽하게 작동했습니다.


0

면책 조항 : 답변이 많은 사람들에게 도움이 될지 여부는 알 수 없습니다.

Parasoft SOATest를 사용하여 XML (SOAP) 요청을 보내는 동안이 오류가 발생했습니다.

문제는 인증서를 추가하고 인증 한 후 드롭 다운에서 잘못된 별칭선택 했다는 것입니다.


0

필자의 경우 웹 사이트는 TLSv1.2를 사용할 수 있습니다. 아파치 httpclient 4.5.6을 사용합니다.이 코드를 사용하고 jce를 설치 하여이 문제를 해결합니다 (JDK1.7).

jce

jdk7 http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

jdk 8 http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

암호:

SSLContext sslContext = SSLContext.getDefault();

  SSLConnectionSocketFactory sslConnectionFactory = new SSLConnectionSocketFactory(
      sslContext,
      new String[]{"TLSv1.2"}, // important
      null,
      NoopHostnameVerifier.INSTANCE);

  Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
      .register("https", sslConnectionFactory)
      .register("http", PlainConnectionSocketFactory.INSTANCE)
      .build();

  HttpClientConnectionManager ccm = new BasicHttpClientConnectionManager(registry);
  httpclient = HttpClientBuilder.create().
      .setSSLSocketFactory(sslConnectionFactory)
      .setConnectionManager(ccm)
      .build();

0

개발자 (항목 1) 및 시스템 관리자 (항목 2 및 3) 관점에서 문제점을 해결하려면 다음을 수행하십시오.

  1. 를 통해 Java에서 SSL 핸드 셰이크 디버그를 활성화하십시오 -Djavax.net.debug=ssl:handshake:verbose.
  2. 아래 단계를 실행할 때 암호로 관찰 되는 sudo apt install ssldump경우이 링크 를 따라 서버를 통해 소스에서 컴파일하거나 소스에서 컴파일하십시오 Unknown value.
  3. 서버에서 sudo ssldump -k <your-private-key> -i <your-network-interface>
  4. 실제 실패 원인 에 대한 로그를 확인하십시오 .

ssldump 로그의 핸드 셰이크가 작동하지 않는 예 :

New TCP connection #1: 10.1.68.86(45308) <-> 10.1.68.83(5671)
1 1  0.0111 (0.0111)  C>S  Handshake
      ClientHello
        Version 3.3
        cipher suites
        TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
        TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
        TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
        TLS_RSA_WITH_AES_256_GCM_SHA384
        TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
        TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
        TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
        TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
        TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
        TLS_RSA_WITH_AES_128_GCM_SHA256
        TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
        TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
        TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
        TLS_DHE_DSS_WITH_AES_128_GCM_SHA256
        TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
        TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
        TLS_RSA_WITH_AES_256_CBC_SHA256
        TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
        TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
        TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
        TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
        TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
        TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
        TLS_RSA_WITH_AES_256_CBC_SHA
        TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
        TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
        TLS_DHE_RSA_WITH_AES_256_CBC_SHA
        TLS_DHE_DSS_WITH_AES_256_CBC_SHA
        TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
        TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
        TLS_RSA_WITH_AES_128_CBC_SHA256
        TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
        TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
        TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
        TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
        TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
        TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
        TLS_RSA_WITH_AES_128_CBC_SHA
        TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
        TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
        TLS_DHE_RSA_WITH_AES_128_CBC_SHA
        TLS_DHE_DSS_WITH_AES_128_CBC_SHA
        TLS_EMPTY_RENEGOTIATION_INFO_SCSV
        compression methods
                  NULL
1 2  0.0122 (0.0011)  S>C  Alert
    level           fatal
    value           insufficient_security
1    0.0126 (0.0004)  S>C  TCP RST

ssldump 로그의 성공적인 핸드 셰이크 예

New TCP connection #1: 10.1.68.86(56558) <-> 10.1.68.83(8443)
1 1  0.0009 (0.0009)  C>S  Handshake
      ClientHello
        Version 3.3
        cipher suites
        TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
        TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
        TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
        Unknown value 0xcca9
        Unknown value 0xcca8
        Unknown value 0xccaa
        TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
        TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
        TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
        TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
        TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
        TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
        TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
        TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
        TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
        TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
        TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
        TLS_DHE_RSA_WITH_AES_256_CBC_SHA
        TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
        TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
        TLS_DHE_RSA_WITH_AES_128_CBC_SHA
        TLS_RSA_WITH_AES_256_GCM_SHA384
        TLS_RSA_WITH_AES_128_GCM_SHA256
        TLS_RSA_WITH_AES_256_CBC_SHA256
        TLS_RSA_WITH_AES_128_CBC_SHA256
        TLS_RSA_WITH_AES_256_CBC_SHA
        TLS_RSA_WITH_AES_128_CBC_SHA
        TLS_EMPTY_RENEGOTIATION_INFO_SCSV
        compression methods
                  NULL
1 2  0.0115 (0.0106)  S>C  Handshake
      ServerHello
        Version 3.3
        session_id[0]=

        cipherSuite         TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
        compressionMethod                   NULL
1 3  0.0115 (0.0000)  S>C  Handshake
      Certificate
1 4  0.0115 (0.0000)  S>C  Handshake
      ServerKeyExchange
Not enough data. Found 294 bytes (expecting 32767)
1 5    0.0115   (0.0000)    S>C    Handshake
        ServerHelloDone
1 6    0.0141   (0.0025)    C>S    Handshake
        ClientKeyExchange
Not enough data. Found 31 bytes (expecting 16384)
1 7    0.0141   (0.0000)    C>S    ChangeCipherSpec
1 8    0.0141   (0.0000)    C>S      Handshake
1 9    0.0149   (0.0008)    S>C    Handshake
1 10   0.0149   (0.0000)    S>C    ChangeCipherSpec
1 11   0.0149   (0.0000)    S>C      Handshake

Java 로그가 작동하지 않는 예

javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.778 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.779 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.779 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.780 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.780 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.780 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.781 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.781 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.781 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.782 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.782 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.782 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.782 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.783 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.783 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.783 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.783 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.783 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: T LS_DHE_RSA_WITH_AES_256_CBC_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 for TLS10 javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.787 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 for TLS10
javax.net.ssl|WARNING|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.818 MYT|SignatureScheme.java:282|Signature algorithm, ed25519, is not supported by the underlying providers
javax.net.ssl|WARNING|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.818 MYT|SignatureScheme.java:282|Signature algorithm, ed448, is not supported by the underlying providers
javax.net.ssl|ALL|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.822 MYT|SignatureScheme.java:358|Ignore disabled signature sheme: rsa_md5
javax.net.ssl|INFO|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.822 MYT|AlpnExtension.java:161|No available application protocols
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.823 MYT|SSLExtensions.java:256|Ignore, context unavailable extension: application_layer_protocol_negotiation
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.823 MYT|SSLExtensions.java:256|Ignore, context unavailable extension: renegotiation_info
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.825 MYT|ClientHello.java:651|Produced ClientHello handshake message (
"ClientHello": {
  "client version"      : "TLSv1.2",
  "random"              : "FB BC CD 7C 17 65 86 49 3E 1C 15 37 24 94 7D E7 60 44 1B B8 F4 18 21 D0 E1 B1 31 0D E1 80 D6 A7",
  "session id"          : "",
  "cipher suites"       : "[TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384(0xC02C), TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256(0xC02B), TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384(0xC030), TLS_RSA_WITH_AES_256_GCM_SHA384(0x009D), TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384(0xC02E), TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384(0xC032), TLS_DHE_RSA_WITH_AES_256_GCM_SHA384(0x009F), TLS_DHE_DSS_WITH_AES_256_GCM_SHA384(0x00A3), TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(0xC02F), TLS_RSA_WITH_AES_128_GCM_SHA256(0x009C), TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256(0xC02D), TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256(0xC031), TLS_DHE_RSA_WITH_AES_128_GCM_SHA256(0x009E), TLS_DHE_DSS_WITH_AES_128_GCM_SHA256(0x00A2), TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384(0xC024), TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384(0xC028), TLS_RSA_WITH_AES_256_CBC_SHA256(0x003D), TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384(0xC026), TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384(0xC02A), TLS_DHE_RSA_WITH_AES_256_CBC_SHA256(0x006B), TLS_DHE_DSS_WITH_AES_256_CBC_SHA256(0x006A), TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA(0xC00A), TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA(0xC014), TLS_RSA_WITH_AES_256_CBC_SHA(0x0035), TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA(0xC005), TLS_ECDH_RSA_WITH_AES_256_CBC_SHA(0xC00F), TLS_DHE_RSA_WITH_AES_256_CBC_SHA(0x0039), TLS_DHE_DSS_WITH_AES_256_CBC_SHA(0x0038), TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256(0xC023), TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256(0xC027), TLS_RSA_WITH_AES_128_CBC_SHA256(0x003C), TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256(0xC025), TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256(0xC029), TLS_DHE_RSA_WITH_AES_128_CBC_SHA256(0x0067), TLS_DHE_DSS_WITH_AES_128_CBC_SHA256(0x0040), TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA(0xC009), TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA(0xC013), TLS_RSA_WITH_AES_128_CBC_SHA(0x002F), TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA(0xC004), TLS_ECDH_RSA_WITH_AES_128_CBC_SHA(0xC00E), TLS_DHE_RSA_WITH_AES_128_CBC_SHA(0x0033), TLS_DHE_DSS_WITH_AES_128_CBC_SHA(0x0032), TLS_EMPTY_RENEGOTIATION_INFO_SCSV(0x00FF)]",
  "compression methods" : "00",  "extensions"          : [
    "server_name (0)": {
      type=host_name (0), value=mq.tpc-ohcis.moh.gov.my
    },
    "status_request (5)": {
      "certificate status type": ocsp
      "OCSP status request": {
        "responder_id": <empty>
        "request extensions": {
          <empty>
        }
      }
    },
    "supported_groups (10)": {
      "versions": [secp256r1, secp384r1, secp521r1, sect283k1, sect283r1, sect409k1, sect409r1, sect571k1, sect571r1, secp256k1, ffdhe2048, ffdhe3072, ffdhe4096, ffdhe6144, ffdhe8192]
    },
    "ec_point_formats (11)": {
      "formats": [uncompressed]
    },
    "signature_algorithms (13)": {
      "signature schemes": [ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, ecdsa_secp512r1_sha512, rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512, rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pkcs1_sha512, dsa_sha256, ecdsa_sha224, rsa_sha224, dsa_sha224, ecdsa_sha1, rsa_pkcs1_sha1, dsa_sha1]
    },
    "signature_algorithms_cert (50)": {
      "signature schemes": [ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, ecdsa_secp512r1_sha512, rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512, rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pkcs1_sha512, dsa_sha256, ecdsa_sha224, rsa_sha224, dsa_sha224, ecdsa_sha1, rsa_pkcs1_sha1, dsa_sha1]
    },
    "status_request_v2 (17)": {
      "cert status request": {
        "certificate status type": ocsp_multi
        "OCSP status request": {
          "responder_id": <empty>
          "request extensions": {
            <empty>
          }
        }      }
    },
    "extended_master_secret (23)": {
      <empty>
    },
    "supported_versions (43)": {
      "versions": [TLSv1.2, TLSv1.1, TLSv1]
    }
  ]
}
)
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.829 MYT|Alert.java:238|Received alert message (
"Alert": {
  "level"      : "fatal",
  "description": "insufficient_security"
}
)

0

제 경우에는 버전 1.1과 관련하여 한 가지 문제가있었습니다. 컬로 쉽게 문제를 재현하고있었습니다. 서버가 TLS1.2보다 낮은 버전을 지원하지 않았습니다.

핸드 셰이크 문제가 수신되었습니다.

curl --insecure --tlsv1.1 -i https://youhost --noproxy "*"

버전 1.2에서는 제대로 작동했습니다.

curl --insecure --tlsv1.2 -i https://youhost --noproxy "*"

서버가 Weblogic을 실행 중이며 setEnvDomain.sh에이 인수를 추가하면 TLSv1.1에서 작동합니다.

-Dweblogic.security.SSL.minimumProtocolVersion=TLSv1.1

0

이 문제는 Java 버전으로 인해 발생합니다. 1.8.0.231 JDK를 사용하고 있었고이 오류가 발생했습니다. Java 버전을 1.8.0.231에서 1.8.0.171로 낮추었습니다. 이제 제대로 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.