오류가 발생합니다 : SSL3_GET_RECORD : 암호 해독에 실패했거나 기록이 잘못되었습니다


7

내 서버 (내가 실행중인 서버 Apache/2.4.27)가 있는데 오늘은 (Brave 및 Chrome과 다른 컴퓨터에서) 내 웹 사이트에서이 오류가 발생한다는 것을 깨달았습니다.

This site can’t provide a secure connection

mywebsite.com sent an invalid response.
ERR_SSL_PROTOCOL_ERROR

이상한 점은 웹 사이트를 5 번 클릭 할 때마다이 오류가 발생한다는 것입니다.

내 conf 파일에서 :

SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/mywebsite/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mywebsite/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateChainFile /etc/letsencrypt/live/mywebsite/chain.pem
SSLCompression off

에서 options-ssl-apache.conf;

SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite          EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLHonorCipherOrder     on
SSLCompression          off

나는 웹 사이트에서 로그 파일을 확인했지만 아무것도 여기에 없습니다. /var/log/apache2/error.log

이 오류의 원인, 더 많은 정보를 찾을 수 있거나 더 나은 곳을 찾을 수있는 아이디어를 찾으려고 노력하고 있습니다.이 문제를 해결하는 방법은 무엇입니까?

편집하다:

시도 openssl s_client -connect mywebsite.com:443하면 반환됩니다.

나는 사용하고있다 : OpenSSL 1.1.0f

CONNECTED(00000003)

...

3073276480:error:1408F119:SSL routines:ssl3_get_record:decryption failed or bad record mac:../ssl/record/ssl3_record.c:469:

다른 편집 :

@quadruplebucky가 제안한 것처럼 options-ssl-apache.conf를 다음과 같이 변경했습니다.

SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite           HIGH:MEDIUM:!aNULL:!MD5:!SSLv3:!SSLv2:!TLSv1
SSLHonorCipherOrder     on
SSLCompression          off

#SSLSessionTickets       off

또한 SSLProtocol all -SSLv2 -SSLv3virtualhost conf 파일 에 추가하려고했지만 동시에 여기에서 몇 가지 사항을 변경했습니다./etc/apache2/mods-available/ssl.conf

#SSLCipherSuite HIGH:!aNULL
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SSLv3:!SSLv2:!TLSv1

SSLHonorCipherOrder on

#   The protocols to enable.
#   Available values: all, SSLv3, TLSv1, TLSv1.1, TLSv1.2
#   SSL v2  is no longer supported
SSLProtocol all -SSLv2 -SSLv3

편집하다:

LogLevel을 변경하면 Info다음을 반환합니다.

[Sat Jul 08 13:34:53.374307 2017] [ssl:info] [pid 8710] [client] AH02008: SSL library error 1 in handshake (server mywebsite:443)
[Sat Jul 08 13:34:53.374717 2017] [ssl:info] [pid 8710] SSL Library Error: error:140940F4:SSL routines:ssl3_read_bytes:unexpected message
[Sat Jul 08 13:34:53.374750 2017] [ssl:info] [pid 8710] [client] AH01998: Connection closed to child 1 with abortive shutdown (server mywebsite:443)

편집하다:

옵션 -crlf로 실행하면 다음과 같이됩니다.

openssl s_client -crlf -connect mywebsite:443

오류가 없습니까?

LogLevel을 디버그로 변경하면 오류가 발생하기 전에 한 가지 더 있습니다.

[Tue Jul 11 23:00:38.641568 2017] [core:debug] [pid 26561] protocol.c(1273): [client 188.64.25.162:23165] AH00566: request failed: malformed request line
[Tue Jul 11 23:00:38.641634 2017] [headers:debug] [pid 26561] mod_headers.c(900): AH01503: headers: ap_headers_error_filter()

따라서이 후 동일한 오류가 발생합니다.

SSL Library Error: error:140940F4:SSL routines:ssl3_read_bytes:unexpected message

openssl version
OpenSSL 1.1.0f  25 May 2017

그것은 가능하지 않아야 어떤 원인 '나쁜 해독 또는 Mac'(경보 20)에 엔드 포인트 설정 오류입니다. 방화벽, IDS, IPS, DLP 또는 '스마트'라우터와 같이이 클라이언트와이 서버 사이 에 네트워크에 어떤 것이 있습니까? 서버 자체 또는 서버와 동일한 세그먼트에있는 머신에서 연결하여 (데이터에 의존하고 따라서 거의 임의적이기 때문에) 반복적으로 테스트 할 수 있습니까?
dave_thompson_085

* .443 가상 호스트 (필요한 경우 전체 가상 호스트)의 관련 내용과 "apachectl -S"의 출력도 보여 주므로 구성 오류를 무시할 수 있습니다.
ezra-s

SSL v3에 대한 오류 메시지 불만, 그러나 귀하의 구성에서는 비활성화되어 있습니다 ...
alexus

OpenSSL 1.1.0f를 사용한다고 말합니다. 그에 모두 서버와 위의 s_client가 명령을 발행 한 시스템에서? 서버가 어떤 플랫폼에서 실행되고 있습니까? 특정 암호 그룹에서 오류가 발생하는지 확인하고 싶을 수 있습니다. 예를 들어 s_client 명령 끝에 "-cipher AES128-SHA"를 추가하면 어떻게됩니까?
매트 카스 웰

ninjaed : @alexus : 함수파일 이름 및 일부 리터럴 ssl3*SSL3*OpenSSL은 프로토콜 간의 기술적 유사성 때문에 TLS (1.0 ~ 1.2)에도 사용됩니다. user134969 : '길이가 너무 짧음'도 구성으로 인해 발생 하지 않아야합니다. 반복 가능한 경우 동일한 이벤트 에 대해 (서버에서 수행하지 않은 경우 s_client -debug일반 RSA와 함께 -cipher)와 wireshark 캡처 를 시도 하여 실제 와이어 데이터를보고 프로그램이 보는 것과 비교하십시오.
dave_thompson_085

답변:


8

서버가 SSLv3 또는 TLSv1을 협상하는 경우 해당 오류를 알 수 없습니다 ( 유닉스 및 Linux 에서이 질문을 보고 아파치 의 모든 곳 에서 비활성화했는지 확인하십시오 ...) --- 1.1.0f GitHub의 소스 코드는 의도적으로 두 가지를 흐리게합니다 ...

   if (enc_err < 0) {
    /*
     * A separate 'decryption_failed' alert was introduced with TLS 1.0,
     * SSL 3.0 only has 'bad_record_mac'.  But unless a decryption
     * failure is directly visible from the ciphertext anyway, we should
     * not reveal which kind of error occurred -- this might become
     * visible to an attacker (e.g. via a logfile)
     */
    al = SSL_AD_BAD_RECORD_MAC;
    SSLerr(SSL_F_SSL3_GET_RECORD,
           SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC);
    goto f_err;
}

따라서 암호 제품군을 재정렬 할 수 있습니다.

SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SSLv3:!SSLv2:!TLSv1

POODLE 취약점에 대한 askubuntu의이 게시물 에는 SSL 검사 및 배관에 대한 훌륭한 리소스 목록이 있습니다.

Mozilla 구성 생성기훌륭한 공공 서비스입니다.

"5 번 클릭 할 때마다이 오류가 발생합니다"라는 설명은 약간 이상합니다. 클릭 또는 5 번째 줄마다 로그에서 잘못된 요청 을 의미 합니까? 아파치 싱글 스레드 (-X 플래그)를 시작하고 그것이 같은 일을하는지 또는 어쩌면 설정인지 확인하십시오 SSLSessionTickets off.

여기서 생각하는 것은 스레딩과 세션 / 캐시 일관성 / 일관성을 문제의 원인으로 제거하는 것입니다. 아파치 단일 스레드 실행 (-X 플래그로 시작)은이를 수행하는 한 가지 방법이며 다른 방법은 MaxClients=1(적어도 MPM 모델을 사용하여) 설정하는 것입니다. 세션 티켓은 과거에 TLSv1.2에서 문제의 원인이되었으며 기본적으로 활성화되어 있습니다. 이는 기본 이유입니다 SSLSessionTickets off(세션 쿠키가 아닌 SSL "Server Hello"메시지의 일부 임). '5 번째 클릭마다'오류가 여전히 귀찮습니다. 대부분의 브라우저가 하나의 요청으로 4 개의 리소스 요청을 파이프 라인으로 연결하고 새로운 연결 (새로운 SSL 핸드 셰이크 등)을 여는 것을 알 수는 없지만 알아 차릴 수는 없습니다. 다섯 번째로 ... 패킷 캡처 없이는 실제로 무슨 일이 일어나고 있는지 말하기 어렵습니다.

암호 원을 오류의 원인으로 제거 한 것처럼 보입니다 (실수하지 않으면 훨씬 더 제한적인 암호 사양에서 오류 조건을 복제 할 수 있습니다). SSL을 재협상하여 오류를 유발할 수 있는지 알고 싶을 것입니다. (킥을 위해) : openssl s_client -connect server:443'R'을 입력하십시오.
세션 캐싱이 -reconnects_client 옵션 과 함께 작동하는지 확인하십시오 .
뭔가 는 SSL 요청에 대한 수신 상황에 대해 다른이어야하며 (짧은 익명 처리에 힘들 수 있습니다 와이어를 통해 무슨 일이 일어나고 있는지의 바이트 단위 검사의) 밖으로 심각를에 있음을 그림에 가장 좋은 방법을 보인다 듣고있는 것의 크기, 즉 청취자의 수를 제한하십시오.

다른 디버깅 도구는 내가 해보고 싶었어요 (질문의 게시 패킷 캡처를 가정 할 ....)
- ssltap (에 libnss3-tools에 우분투)
- cipherscan
- sslscan

업데이트 ssltap
통해이 문제를 해결 하는 것은 OpenSSL 버그 # 3712 재 포장 (기본적으로 읽기 / 쓰기 중 키 재협상) 과 같은 끔찍한 것처럼 보입니다 . 성능을 저하시키지 않는 적절한 해결 방법을 찾고 있습니다. 재미있는 것들!


1
또한 더 명확한 SSLCipherSuite 선언 (Mozilla 구성이 생성하는 줄에 따라)을 사용하고 LogLevel을 정보 또는 디버그, tcpdump / wireshark pcap 등으로 설정하고 실제로 발생하는 상황을 파악할 수 있습니다.
quadruplebucky

1
cipherscan github.com/mozilla/cipherscan 또는 sslscan github.com/rbsec/sslscan (많은 repos) 과 같은 도구를 사용 하여 회귀 전에 실제로 무슨 일이 일어나고 있는지 알아 내려고 시도하지 않겠습니까?
quadruplebucky

SSLProtocol -SSLv3연결 확실히 SSL3 아니었다. ssl3로 이름 지정된 OpenSSL 함수 (및 소스 파일)는 여전히 최대 1.2까지 모든 TLS 프로토콜의 일부입니다. SSLv3 (및 1.1.0의 TLSv1) 암호를 삭제 하면 실제로 TLS1.2 미만의 프로토콜 은 협상되지 않지만 최신 브라우저에서는 문제가되지 않습니다.
dave_thompson_085

@ user134969 : wireshark가 이러한 연결을 해독하려면 (따라서 여기서 도움이 됨) 키 교환을 일반 RSA로 제한해야합니다. 이것은 아파치 측에서 가장 쉬운 방법 SSLCiphers RSA+AES이다. (그리고 편집에서 서버의 PrivateKey 파일 / 환경 / 프로토콜 / SSL을 제공합니다.) 크롬은 일반 RSA (즉 불평하는 데 사용 하지 PFS)하지만 난 그냥 다시 테스트와 나의 지금 행복 할 것 같다.
dave_thompson_085

@quadruplebucky 시스템에서 "ssl3_record.c"의 위치는 무엇입니까?
user134969

6

나는 이것을 전에 본 적이 있으며, 실제로 전에 이것을 가지고 있었다.

내 경우의 대답은 극도로 미묘합니다.

네트워크 어댑터는 TCP Segment Offloading을 활성화 시켰는데, 이는 어떤 형태의 버그로 인해 일부 메시지의 마지막 몇 바이트를 조작 (또는 잘림, 기억할 수 없음)하여 SSL 레코드의 MAC이 실패하는 원인이되었습니다.

VMWare의 가상 머신이었습니다.

환경에서 TSO / GSO / GRO를 비활성화하고 문제가 사라지는 지 확인하려고합니다.

ethtool -K eth0 tso off gro off gso off ufo off

리턴 : udp-fragmentation-offload를 변경할 수 없음
user134969

동일한 작업을 수행하지만 'ufo off'를 생략하십시오.
Matthew Ife

1
패킷 잘림의 원인이 될 수있는 또 다른 멍청한 점은 MTU 문제 (점멸하지 말아야 할 점보 프레임) 또는 데이터를 터널로 전송하는 경우 TCP를 통한 MSS 클램핑입니다.
Matthew Ife

3

OpenSSL과 멀티 스레딩에는 이상한 점이 있습니다. 어떤 MPM을 사용하십니까? 이것이 멀티 스레딩과 관련된 경우 "작업자"및 "이벤트"가 영향을받는 동안 "프리 포크"는 안전해야합니다.

로드 프로파일이 허용하는 경우 프리 포크로 전환하여 문제가 지속되는지 확인할 수 있습니다.


그래서 최소한 멀티 스레딩은 배제됩니다 :)
Andreas Rogge

0

먼저 크롬이 업데이트되었는지 확인하십시오. 이전 버전은 특정 암호에 문제가 있습니다. 아마존과 같은 일반적인 사이트가있는 크롬 자체 에서이 문제가 발생했습니다.

둘째, 당신이 따르는 "암호 목록"에서 프로토콜을 금지하는 조언은 프로토콜을 금지하지 않기 때문에 매우 나쁜 생각입니다. SSLv3 이후 "작동하는"암호를 포함하여 대부분의 암호는 금지 할 것입니다. SSLv3 암호를 허용하고, 호환성을 위해 Mozilla SSL 구성 생성기에서 제공하는 더 일반적인 목록을 사용하십시오 (SSLv2가 더 이상 존재하지 않거나 httpd 또는 openssl에서 지원되므로 더 이상 명시 적으로 금지 할 이유가 없음). 이전 조합이 너무 엄격했을 수 있습니다. , 이거 한번 해봐:

SSLProtocol             all -SSLv3
SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS

여전히 문제가있는 경우 SSL에 대한 디버깅을 활성화하고 httpd가 무엇을 말해야하는지 확인하십시오 (1 회 시도 또는 2 회만 보내고이 로깅을 비활성화하면 너무 시끄 럽습니다).

LogLevel ssl:trace3

주석 : SSL 지시문은 2.4에서 더 이상 사용되지 않으므로 SSLCertificateChainFile을 제거 할 수도 있습니다. SSLCertificateFile 체인을 추가하고 모든 인증서를 리프에서 루트로 정렬하거나 SSLCertificateChainFile을 SSLCACertificateFile로 변경할 수도 있습니다 (주로 SSL 인증에 사용됨).

다음을 추가하여 (아직 추가하지 않은 경우) 추가해야합니다.

SSLRandomSeed startup file:/dev/urandom 2048
SSLRandomSeed connect file:/dev/urandom 2048
SSLSessionCache shmcb:/path/to/log/ssl_gcache_data(512000)

편집 : 대화가 끝나면 openssl 설치를 확인하거나 httpd가 실제로 사용하는 버전과 동일한 지 확인하십시오.

이 명령을 실행하고 그것이 무엇을 말하는지 봅시다 : openssl ciphers -v 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'

또한 openssl 버전이 올바른지 확인하려면 다음을 실행하십시오.

openssl version

아니요, 해결하지 못했습니다. 편집 내용을 확인하고 ssl : trace3를 사용할 때 로그를 게시했습니다.
user134969

사전 컴파일 된 버전 또는 수동으로 컴파일 된 버전은 무엇입니까?
ezra-s

@ user134969 명령을 추가하여 문제가있는 경우 주식 openssl에서 암호 또는 충분한 암호를 얻었는지 확인할 수 있습니다.
ezra-s
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.