socat과 함께 openssl을 사용하는 중 오류가 발생했습니다. SSL3_CHECK_CERT_AND_ALGORITHM:dh 키가 너무 작습니다.

socat과 함께 openssl을 사용하는 중 오류가 발생했습니다. SSL3_CHECK_CERT_AND_ALGORITHM:dh 키가 너무 작습니다.

질문의 짧은 버전

관련 파일이 존재한다고 가정할 때 다음 명령 시퀀스가 ​​작동하지 않는 이유는 무엇입니까?

socat tcp-listen:10001,fork exec:'/bin/cat' &
socat openssl-listen:10002,fork,reuseaddr,cert=server.pem,cafile=client.crt tcp:localhost:10001 &
socat tcp-listen:10003 openssl-connect:localhost:10002,cert=client.pem,cafile=server.crt &
socat stdout tcp:localhost:10003

질문의 긴 버전

socat다음 문서에 설명된 대로 with를 사용하려고 합니다 .openssl

상황에 따라 Debian 9에서 socat 버전 1.7.2.4+sigfix 및 OpenSSL 버전 1.1.0f를 실행하고 있습니다.

openssl나는 그것을 더 시도하기 전에 먼저 socat온전한 확인으로 그 자체를 사용했습니다. 하나의 socat인스턴스를 "에코 서버"로 시작하고 두 개의 중간 socat인스턴스(즉, 두 번째 및 세 번째 인스턴스)를 사용하여 터널을 만든 다음 네 번째 인스턴스를 "클라이언트"로 사용하여 터널을 통해 원래 프로세스로 데이터를 보냅니다. . 다음은 내가 실행한 명령의 예입니다.

socat tcp-listen:10001,fork exec:'/bin/cat' &
socat tcp-listen:10002,fork tcp:localhost:10001 &
socat tcp-listen:10003,fork tcp:localhost:10002 &
socat stdout tcp:localhost:10003

이는 예상대로 작동합니다. 터미널에 입력된 텍스트가 콘솔에 표시됩니다. 샘플 세션은 다음과 같습니다.

user@host:~$ socat tcp-listen:10001,fork exec:'/bin/cat' &
[1] 1001

user@host:~$ socat tcp-listen:10002,fork tcp:localhost:10001 &
[2] 1002

user@host:~$ socat tcp-listen:10003,fork tcp:localhost:10002 &
[3] 1003

user@host:~$ socat stdout tcp:localhost:10003
hey
hey

제정신인지 확인한 후 인증서 및 키 생성 프로세스를 계속 진행했습니다.

먼저 서버 키와 자체 서명 인증서를 생성했습니다.

openssl genrsa -out server.key 2048
openssl req -new -key server.key -x509 -days 3653 -out server.crt
cat server.key server.crt > server.pem
chmod 600 server.key server.pem

그런 다음 클라이언트 키와 자체 서명된 인증서를 생성했습니다.

openssl genrsa -out client.key 2048
openssl req -new -key client.key -x509 -days 3653 -out client.crt
cat client.key client.crt > client.pem
chmod 600 client.key client.pem

마지막으로 이전과 동일한 터널 설정을 시도했지만 OpenSSL 암호화를 사용했습니다.

socat tcp-listen:10001,fork exec:'/bin/cat' &
socat openssl-listen:10002,fork,reuseaddr,cert=server.pem,cafile=client.crt tcp:localhost:10001 &
socat tcp-listen:10003 openssl-connect:localhost:10002,cert=client.pem,cafile=server.crt &
socat stdout tcp:localhost:10003

이것은 작동하지 않는 것 같습니다. 마지막 명령을 실행한 후 다음 오류가 발생합니다.

YYYY/mm/dd HH:MM:SS socat[pid1] E SSL_connect(): error:14082174:SSL routines:SSL3_CHECK_CERT_AND_ALGORITHM:dh key too small
YYYY/mm/dd HH:MM:SS socat[pid2] E SSL_accept(): error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure

샘플 세션은 다음과 같습니다.

user@host:~$ socat tcp-listen:10001,fork exec:'/bin/cat' &
[1] 1001

user@host:~$ socat openssl-listen:10002,fork,reuseaddr,cert=server.pem,cafile=client.crt tcp:localhost:10001 &
[2] 1002

user@host:~$ socat tcp-listen:10003 openssl-connect:localhost:10002,cert=client.pem,cafile=server.crt &
[3] 1003

user@host:~$ socat stdout tcp:localhost:10003
2018/08/22 23:43:30 socat[1005] E SSL_accept(): error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
2018/08/22 23:43:30 socat[1003] E SSL_connect(): error:14082174:SSL routines:SSL3_CHECK_CERT_AND_ALGORITHM:dh key too small
[3]+  Exit 1                  socat tcp-listen:10003 openssl-connect:localhost:10002,cert=client.pem,cafile=server.crt

사용자 제안 따르기데이브 톰슨_085openssl s_client다음 명령을 사용해 보았습니다 .

openssl s_client -cipher 'DHE:!EXPORT:!LOW' -connect localhost:10002

이로 인해 다음이 포함된 오류 출력이 생성되었습니다.

socat[pid] E SSL_accept(): error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small:../ssl/statem/statem_clnt.c:1460:

답변1

첫째, 확실합니까?소캇OpenSSL 1.1.0을 사용하시나요? 업스트림(socat.org) 1.7.2.4 소스(2014년에 출시됨)는 API에 상당한 변경이 적용된 OpenSSL 1.1.0(2016년 출시)과 호환되지 않습니다. 확인하다 ldd $(which socat). 귀하의 socat 및 OpenSSL(둘 다)이 표준 저장소, 다른 빌더/패키저에서 나오나요, 아니면 소스에서 빌드됩니까?

어쨌든, 1.7.2.4(업스트림) 소스는 기본적으로 512비트 DH 매개변수로 설정되어 있지만 "새로운 기능"에서는 그렇게 말하지 않고 "sig" 패치가 무엇이든 변경되지 않을 것이라고 가정합니다. 이는 실제로 너무 작습니다. Logjam 이전에도 취약한 것으로 알려졌으며 1.0.1n 또는 1.0.2b 이상(둘 다 2015-06에 출시됨)의 모든 libssl 클라이언트에서 허용되지 않습니다.어느1.1.0, 2016년 8월에 처음 출시됨).

AFAICS 귀하의 선택은 다음과 같습니다:

  • socat를 1.7.3.0 이상으로 업그레이드하세요(업스트림에는 1024비트가 있음). 3.1+ 2048비트가 더 좋습니다.

  • 최소 1024비트인 곳에서 DH 매개변수를 생성하거나 가져옵니다. (귀하의 클라이언트를 포함하여 대부분의 클라이언트에는 2048이 더 좋습니다.)일부클라이언트에 문제(예: 오래된 Java 버전)가 발생하여 서버 cert파일에 추가될 수 있습니다.

    openssl dhparam $n >file1024 또는 2048을 사용하여 DH 매개변수를 생성할 수 있습니다 $n.너무 느리다면당신은 할 수에 추가하세요 -dsaparam.

  • 위와 동일하지만 매개변수를 서버에 구성된 별도의 파일에 넣습니다.맨페이지이 옵션은 그렇다고 말하지만 dhparams=<file>코드에서는 그렇다고 말하고 dh=테스트를 통해 후자가 확인됩니다.

  • DHE를 사용하는 암호화 제품군에 동의하지 않도록 서버나 클라이언트 또는 둘의 조합을 구성하십시오. 여기서는 귀하의 서버가 잘못된 서버이므로 개인적으로 서버를 구성하겠습니다. 다시 매뉴얼 페이지에는 다음과 같이 나와 있지만 cipher현실은 ciphers. 1.7.2.4에는 "tmp_ecdh" 매개변수 세트가 없고 (AFAICT) 1.1.0에서 작동하지 않기 때문에 ECDHE를 지원하지 않습니다. 이는 DHE 없이는 연결이 완벽한 전달 보안을 가질 수 없음을 의미합니다. 이러한 제한을 받아들일 수 있다면 ,ciphers='DEFAULT:!DHE'서버에서 이를 사용하는 것이 간단한 해결책입니다.

    (1.7.3.0 이상에서는 "tmp_ecdh"를 설정하고 기본적으로 DH-1024 이상이 없더라도 ECDHE를 지원합니다. ECDHE 제품군이 DHE보다 우수하므로 ECDHE가 선택되고 ECDHE가 선택되므로 여기서 문제가 방지됩니다. DHE 매개변수는 사용되지 않으며 관련이 없습니다.

관련 정보