Qualys SSL Labs 를 통해 jroh.kr의 SSL상태를 점검하던 중, 아래와 같이 디피-헬만 키교환 알고리즘을 이용한 부분에 경고가 있음을 발견하였다.

그럼 여기서 Diffi Hellman 이라는 알고리즘은 무엇이며, 왜 1024bit 가 문제가 되고 어떻게 조치해야 되는지 알아보도록 하자. 공부는 이렇게 혼자 질문하고 혼자 대답하고 혼자 노는게 ㅡ.,ㅡ 최고. 쉽게쉽게 설명해 보도록 하자.

 

1. Diffi-Hellman key exchange 란?

디피-헬만 키 교환이란 암호 키를 교환하는 방법이다. RSA와 마찬가지로 공통의 비밀키를 공유하기 위하여 만들어진 암호학적 통신 방법이다. RSA는 알다시피 암호화된 통신에서 공유될 비밀키를 공개키로 암호화하여 A와 B가 서로 공유하는 방법이다. 뭐가 어찌되었든 간에 비밀키가 암호화되어 통신망에서 지나간다는 것이 문제이며, 이는 중간자 공격 (Man in the middle attack) 을 통하여 비밀키가 누출된 위험성을 가지고 있음을 말한다. 그렇다면 비밀키 공유시 중간자가 알아볼 수 없는 형태의 값만 공유하고 특정연산을 이용하여 최종적으로 비밀키를 공유 할 수 있다면 어떨까?

Diffie-Hellman 키 교환 알고리즘은 위에서 말한 문제를 해결 할 수 있는 방법을 제시한다. 노씨와 이씨가 인터넷에서 서로 암호화된 통신을 하려고 한다고 하자. 그런데 김씨가 몰래 중간자로써 비밀키 교환을 훔쳐보려 한다고 가정하면.

  1. 노씨가 소수 P, 그리고 정수 G를 선택해 이씨에게 보낸다. 김씨도 훔쳐보고 알 수 있다.
  2. 노씨는 정수 a를 선택한다. 현재상태에서 노씨만 알고 이씨와 김씨도 모른다.
  3. 이씨도 정수 b를 선택한다. 현재상태에서 이씨만 알고 노씨와 김씨도 모른다.
  4. 노씨는 일정한 값 A를 계산한다. (G의 a승을 P로 나눈 나머지)
  5. 이씨는 일정한 값 B를 계산한다. (G의 b승을 P로 나눈 나머지)
  6. 노씨는 계산된 값 A를 이씨에게 전송한다. 김씨도 훔쳐보고 알 수 있다.
  7. 이씨는 계산된 값 B를 노씨에게 전송한다. 김씨도 훔쳐보고 알 수 있다.
  8. 노씨는 수신받은 B값을 이용하여 일정한 값을 만든다 (B의 a승을 P로 나눈 나머지)
  9. 이씨는 수신받은 A값을 이용하여 일정한 값을 를 만든다 (A의 b승을 P로 나눈 나머지)
  10. 노씨와 이씨는 계산후의 공통의 키값을 얻게 된다. 이게 암호키고 김씨가 중간에 본 혼합값으로는 키를 알 수 없다. 

와 같은 방법으로 비밀스럽게 비밀키를 공유 할 수 있다.

실제 Diffie Hellman 알고리즘이 이루어지는 원리를 확인해 보면 위와 같은 로직을 거치면 된다고 보면 되겠다. 여기서 중요한 것은 이산대수, 즉 소수 P와 정수G를 잘 골라야 안전한데 이제까지 충분히 안전하다고 판단되었던 값이 1024bit 였던 것이다. (정확한 디피 헬만 키 교환 방법은 위키피디아를 참고하자)

 

2. Diffi-Hellman 1024bit가 안전하지 않은 이유?

Logjam 취약점 문제 때문이다.

1990년대 초, Netscape 사가 SSL을 처음 개발했을 때 미정부는 암호화 알고리즘을 엄격히 제한했다. 해외로 수출되는 암호화 알고리즘은 의도적으로 약하게 만들어졌으며, 키의 길이가 512bit로 제한되었다. 또한 수출용 암호시스템을 이용한 모든 통신에는 NSA가 접근 할 수 있었고, 이는 NSA가 마스터 키를 가지고 있었다고 봐도 무방하다. 

Logjam 취약점의 경우, TLS프로토콜의 취약점을 이용하여 Diffi-Hellman의 키를 의도적으로 수출용 512bit 로 다운그레이드 시킬 수 있는 취약점이다. 이를 이용하여 암호화된 통신을 해독하여 도감청이 가능하게 되는 것이다. 

그렇다면 어떻게 Diffie Hellman의 키를 찾거나 유추 할 수 있다는 것일까? 그것은 특정 소수의 수학적 특성을 이용한 방법으로 가능한데 아래와 같이 특정 소수를 이용하면 지수와 나머지값을 구할 수 있다. 

위 예제에서는 특수한 소수 7을 사용하였으며 이를 통해 지수와 나머지값을 찾는 방법을 나타내고 있다. 특수한 소수를 사용하는 경우 log를 이용하여 512bit 까지는 Diffie Hellman 의 키를 유추해 도감청이 가능했던 것으로 보인다. 참조 기사에서는 약 3000개의 CPU를 이용하여 이와같은 소수를 찾아 낼 수 있었다고 하며, 1024bit 까지는 NSA에서 풀어낼 수 있을 것이라 추정하고 있다.

여담으로 왠지 이런건 인도사람들이 잘할꺼 같다.

 

 

3. Diffie-Hellman 취약성의 해결 방법은?

첫째, OpenSSL 버젼을 아래와 같이 업데이트 하여 해결 할 수 있다.

이와같은 취약성을 패치하기 위하여 OpenSSL은 아래와 같이 패치를 진행하였으며 OpenSSL 1.0.2b 이상 1.0.1n 이상이면 관련 취약점을 회피 할 수 있다. 

  • OpenSSL 1.0.2 : 패치된 버전 1.0.2b이상 
  • OpenSSL 1.0.1 : 패치된 버전 1.0.1n이상 

OpenSSL 1.0.1과 1.0.2대의 버전별 해결책을 보면. 

  • 1.0.1과 1.0.2 : DH 파라미터가 768비트보다 짧다면 handshake를 거부하도록 TLS클라이언트에 대한 보호 기능을 추가했다. 
  • 1.0.2b이상, 1.0.1n이상 : 위 제한을 1024비트까지 증가했다. 
  • 1.0.1m이상, 1.0.2a이상 : EXPORT cipher suite(즉, 수출등급 암호)를 기본적으로 disable했다. 

둘째, Diffie-Hellman 수출용 Cipher Suite를 사용하지 않는다.  (OpenSSL 패치에 포함되어 있는 내용이지만)

셋째, ECDHE (Elliptic-Curve Hellman) 을 사용한다. 

타원-곡선형 디피-헬만(ECDH) 키 교환 방식은 실현 가능하다고 알려진 모든 암호 해독학적 공격을 우회할 수 있다고 한다. 현대의 웹 브라우저들은 기존의 디피-헬만 방식보다 ECDHE방식을 선호하고 있다.

넷째,  Diffie-hellman의 키값을 2048bit 이상으로 생성하고, 새롭고 고유한 방법으로 Diffie Hellman  그룹을 생성하여 적용한다.

 

4. Diffie-Hellman 을 2048bit 로 생성/적용 해 보자

아래와 같이 openssl  명령을 이용하여 새로운 Diffie Hellman 그룹의 키를 생성하도록 하자.

root@server:/test# openssl dhparam -out dhparams.pem 2048
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
......................................................................
.................+..................+.................................
....................................+................................+
...............................................+......................
......................................................................
......................................................................
......................................................................
.+...............................................+....................

생성한 값은 dhparams.pem 에 저장된다. Nginx 의 경우는 컨피그 파일에 아래와 같이 dh_param에 대한 옵션값을 추가 또는 수정해 준다.

ssl_dhparam /nginx_path/dhparams.pem;

그 다음 nginx를 재시작 해 주자.

그리고 다시 ssllab에서 테스트를 하면 아래와 같이 Diffie Hellman의 1024bit 취약성이 해결되어 등급이 상승됨을 확인 할 수 있다 🙂

만약 아파치나 다른 종류의 웹서버 등을 사용하고 있다면 하기의 링크를 참조하기 바란다.

https://weakdh.org/sysadmin.html

 

정말 힘들게 여기까지 왔지만 -_-) 결론은 간단하게 말해서 Diffie Hellman 키는 새로운 그룹으로 생성해서 2048bit로 쓰면 된다라는 말이다. 감사합니다~~

 

참고문건