8192비트 키가 핸드셰이크를 멈추고, 1024비트 DH는 거부된다
반대 방향의 수정이 필요한 두 가지 크기 결함: 너무 큰 키는 상대가 시간 초과할 때까지 핸드셰이크 시간을 태우고, 작은 DH 그룹은 시작 전에 거부된다.
한 서버에서는 클라이언트가 잠시 멈췄다가 다시 연결되고, 다른 서버는 키 크기에 관한 메시지와 함께 연결을 즉시 거부한다. 서로 다른 버그처럼 보이지만 같은 버그가 반대 방향을 가리키는 것이다. 핸드셰이크 암호화에는 매개변수 크기에 따라 커지는 비용이 있고, 현대 라이브러리가 내려가지 않는 하한도 있다. 자료의 크기를 정하는 것이 체크리스트이며, 첫 항목은 두 결함 중 어느 것이 실제로 일어나고 있는지 판단하는 것이다.
무엇이든 다시 생성하기 전에 실패를 읽어라
타이밍이 대부분을 알려준다. 몇 초를 쓰고 나서 죽는 핸드셰이크는 보통 계산이 상대의 인내를 넘어섰다는 뜻이며, 하드웨어나 시간 제한에 비해 매개변수가 너무 크다는 것을 가리킨다. 키나 그룹 크기를 지목하는 즉각적인 거부는 반대 방향을 가리키며, 라이브러리가 전혀 받아들이지 않을 자료를 뜻한다.
이 둘은 반대의 수정이 필요하며, 바로 여기서 대부분의 시도가 틀어진다. 작은 그룹을 이미 거부한 클라이언트에서 8192비트 매개변수를 다시 생성하면 느린 경우는 나빠지고 빠른 경우에는 아무 효과가 없다. 파일을 건드리기 전에 어떤 증상을 보았는지 적어 두어라.
다음으로 상대에게 무엇을 요구하는지 확인한다. 큰 유한체 그룹으로 설정된 서버는 연결할 때뿐 아니라 재협상할 때마다 모든 클라이언트가 같은 CPU 시간을 쓰도록 강제한다. 문제가 시작 시점이 아니라 일정한 간격으로 나타난다면 그 간격은 어느 설정이 비싼지에 대한 강한 단서다. 재협상은 계산 전체를 반복하므로 매시간 되풀이되는 멈춤은 보통 같은 비용을 다시 치르는 것이다.
느린 경우: 하드웨어가 감당할 수 없는 자료
Diffie-Hellman과 RSA 작업은 키 크기에 따라 빠르게 늘어나며, 그 모두가 터널에 트래픽이 흐르기 전에 일어난다. 작은 라우터나 저전력 클라이언트에서는 충분히 큰 그룹이 교환을 상대의 시간 제한 너머로 밀어낼 수 있어, 연결이 다시 시도되거나 아무 오류 없이 그저 멈춘 것처럼 보인다.
해결책은 모든 상대가 지원하고 모든 장치가 편하게 계산할 수 있는 크기로 내려가는 것이다. 2048비트 RSA 키와 2048비트 그룹은 널리 호환되는 기준선으로 남는다; 더 큰 것은 모든 상대가 동의하고 CPU가 재협상마다 그 비용을 낼 수 있을 때만 도움이 된다. 그 기준선을 넘는 모든 것은 의도적인 절충이며 업그레이드가 아니다.
크기는 점수가 아니며, 비교표의 가장 큰 숫자가 자동으로 옳은 선택은 아니다. 정책이 허용하고 모든 상대가 받아들이는 가장 작은 값을 고른 뒤, 나아졌다고 가정하지 말고 핸드셰이크를 측정하라. 여전히 시간 초과하는 더 작은 그룹은 크기가 전부가 아니었음을 알려준다.
빠른 경우: 라이브러리가 거부하는 그룹
현대 OpenSSL 빌드는 가장 작은 유한체 그룹을 아예 거부하며, 높아진 보안 수준은 하한을 더 올린다. 수십 년 된 매개변수 파일을 품은 라우터 펌웨어가 흔한 원인이며, 증상은 그룹이나 키 크기를 지목하는 메시지와 함께 즉시 실패하는 연결이다. 그 실패에는 간헐적인 것이 없으며, 그래서 알아보기 쉽다.
검사를 건너뛰려고 구성을 편집하는 대신 파일을 교체하라. 현재 그룹을 생성하고 검증한 뒤 데몬이 실제로 읽는 위치에 설치하라. 클라이언트가 새 파일로 성공적으로 연결될 때까지 옛 파일을 보관하라:
openssl dhparam -out /etc/openvpn/ffdhe2048.pem 2048
openssl dhparam -in /etc/openvpn/ffdhe2048.pem -check -noout
ls -l /etc/openvpn/ffdhe2048.pem검사 명령은 파일을 검증하고 통과하면 유용한 것을 출력하지 않는다; 목록은 서비스가 읽는 파일을 교체했음을 확인하며, 옆에 있는 낡은 사본이 아니다. 구성을 그 경로로 향하게 하고 데몬을 다시 시작한 뒤, 이전에 실패하던 클라이언트가 이제 핸드셰이크를 끝내는지 확인하라.
서버가 보안 수준이나 인증서 프로필도 설정한다면, 그룹이 틀렸다고 결론짓기 전에 그것들을 읽어라. 더 엄격한 등급을 요구하는 프로필은 기본값이 받아들였을 자료를 거부할 수 있으며, 그 설정을 제거하는 것이 검사를 전역으로 끄는 것보다 좁은 변경이다.
상대와 하드웨어에 맞는 크기를 골라라
이국적인 것을 생성하기 전에 원격 쪽이 무엇을 견디는지 알아보라. 2048비트 그룹에 너무 오래된 장치는 교체해야 할 장치이며, 서버를 더 약한 그룹으로 돌리는 것은 호환성 불만을 장애로 바꿀 뿐이다. 지속되는 수정은 더 오래된 매개변수가 아니라 더 새로운 소프트웨어로 향한다. 이 분야의 모든 임시 예외는 영구 구성이 될 길을 가지고 있다.
서버 CPU가 한계라면 정책 아래로 내려가는 대신 알고리즘을 바꿔라. X25519 같은 타원 곡선 키 교환은 큰 유한체 그룹보다 훨씬 저렴하고 폭넓게 지원되므로, 성능 불만에는 더 작은 RSA 모듈러스보다 나은 답이 된다.
무엇을 고르든 실제 연결 하나로 시험하고, 결국 연결되는지뿐 아니라 핸드셰이크가 얼마나 걸리는지 보라. 열두 초에 성공하는 연결은 열다섯 초에 실패하는 연결과 같은 근본 원인을 가진다.
재구축이 뒤집지 못하도록 선택을 기록하라
매개변수 파일을 구성 관리 아래에 두고 크기, 이유, 날짜를 옆에 적어라. 자기 기본값을 조용히 생성하는 재구축된 서버는 같은 결함이 여섯 달 뒤 돌아오고 아무도 원래 결정을 설명하지 못하는 길이다.
같은 정보를 엔드포인트와 프로필 옆에 기록해, 검토가 파일 크기에서 역산하지 않게 하라. 다음 연결이 멈출 때 그 메모는 다섯 분 점검과 새 조사의 차이다. 다음 엔지니어가 빠른 경우를 위해 만든 수정으로 느린 경우를 해결하는 것도 막는다.