오류가 발생합니다 : SSL3_GET_RECORD : 암호 해독에 실패했거나 기록이 잘못되었습니다 오늘은 (Brave 및 Chrome과 다른 컴퓨터에서)

내 서버 (내가 실행중인 서버 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



답변

서버가 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 재 포장 (기본적으로 읽기 / 쓰기 중 키 재협상) 과 같은 끔찍한 것처럼 보입니다 . 성능을 저하시키지 않는 적절한 해결 방법을 찾고 있습니다. 재미있는 것들!


답변

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

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

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

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

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

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


답변

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

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


답변

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

둘째, 당신이 따르는 “암호 목록”에서 프로토콜을 금지하는 조언은 프로토콜을 금지하지 않기 때문에 매우 나쁜 생각입니다. 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


답변