«공유 암호 없음» 오류는 설정 하나만 바꾸면 될 것처럼 들리지만, 대부분의 사람이 바꾸는 설정은 틀린 것입니다. OpenVPN TLS 핸드셰이크를 수행하는 제어 채널과 터널 안에서 패킷을 나르는 데이터 채널에 별도의 정책을 두는데, 오류는 전자를 가리키는 반면 사람들은 후자를 고칩니다. 각 피어가 무엇을 허용하는지 올바른 순서로 비교하면 추측이 두세 가지 결정으로 바뀝니다: 버전, 다음으로 스위트 목록, 다음으로 자격 증명.

이 순서를 틀리면 한 번도 조회되지 않는 목록에 AES 이름을 추가하느라 한 시간을 버릴 수 있습니다.

두 개의 암호 목록, 핸드셰이크를 깨뜨리는 것은 하나뿐

제어 채널은 TLS 세션을 협상하며 그 정책은 다음으로 작성됩니다: tls-cipher TLS 1.2용, tls-ciphersuites TLS 1.3용. 데이터 채널은 별도로 다음으로 구성됩니다: data-ciphers, 여기서 불일치는 연결이 성립된 뒤 트래픽을 통과시키지 못하는 상태를 만듭니다. 둘 다 암호를 언급하는 오류를 내므로 혼동됩니다. 끝나지 않는 핸드셰이크는 제어 채널을 가리키고, 성립된 터널이 패킷을 버리면 데이터 채널을 가리킵니다.

첫 줄이 아니라 메시지 전체를 읽으세요. 버전 불일치, 빠진 스위트, 피어가 거부하는 인증서 서명 알고리즘, 호스트 이름 검증 실패는 모두 TLS 오류로 끝나며, 그중 스위트 목록과 관련된 것은 하나뿐입니다. 이런 범주를 구분하는 것이 진단의 대부분입니다.

스위트보다 먼저 버전을 비교하세요

TLS 1.2로 제한된 피어와 1.3을 요구하는 피어는 공통 버전이 없고, 어떤 암호 문자열도 그것을 잇지 못합니다. 양쪽에서 tls-version-min 과 tls-version-max 를 기록하세요. 사용 중인 빌드의 기본값이라도 좋습니다. 배포판의 OpenSSL 정책은 어떤 OpenVPN 옵션도 말하지 않은 채 하한을 올릴 수 있기 때문에, 한쪽이 어플라이언스나 서드파티 클라이언트라면 그 윈도는 펌웨어가 허용하는 범위이며, 윈도가 겹친 뒤에야 스위트 비교가 의미를 갖습니다.

그 기록에는 실제 바이너리 이름도 들어가야 합니다. 노트북의 명령줄 openvpn 이 가져온 프로필을 다루는 클라이언트와 같다는 보장은 없습니다.

TLS 1.2와 TLS 1.3 목록은 섞이지 않습니다

TLS 1.2 스위트 이름은 ECDHE-RSA-AES256-GCM-SHA384 같은 형태이며 tls-cipher 에 들어가며, OpenSSL 암호 문자열을 받습니다. TLS 1.3 스위트는 TLS_AES_256_GCM_SHA384 같은 이름이고 tls-ciphersuites 에 들어가며, 1.2 문자열에 하나를 더해도 1.3 목록은 구성되지 않고, 파서는 한 번도 일치시키지 않은 채 텍스트를 받아들일 수 있습니다. 한 버전에 맞는 필터는 다른 버전에 대해 아무 말도 하지 않습니다. 어느 목록이 어느 버전용인지 적어 두세요.

openvpn --show-tls 는 로컬 빌드가 무엇을 지원하는지 출력하며, 그것은 목록일 뿐 약속이 아닙니다. 원격 피어가 그 스위트를 허용하지 않을 수 있고 활성 프로필이 그것을 켜지 않을 수도 있으므로, 스위트를 아예 제시할 수 없는 빌드를 걸러내는 데 쓰고 그다음 구성된 목록을 비교하세요.

새 연결에서 협상을 증명하세요

성공한 핸드셰이크만이 증거가 되며, 실제 클라이언트가 실제 프로필로 수행해야 합니다. 서버의 상세 수준을 올리고 한 번 연결한 뒤, 처음 제시된 값이 이겼다고 가정하지 말고 로그에서 협상된 프로토콜 버전과 스위트를 읽으세요. 핸드셰이크가 되는 것과 데이터 채널이 실패하는 것은 다른 수리이므로, 터널을 지나는 트래픽으로 데이터 채널을 따로 확인하세요. 오래된 클라이언트 프로필은 흔한 거짓 음성이므로 설정을 바꿀 때마다 반복하세요.

승인된 공통 구성이 없다면 답은 업그레이드나 이전 계획이지 약화된 정책이 아닙니다. tls-version-min 를 낮추거나 검증을 끄거나 모든 레거시 스위트를 켜는 것은, 그 거부를 만들어낸 보안 요구 사항을 충족하지 않은 채 거부만 없앱니다.

변경 티켓에 협상된 버전, 스위트, 데이터 암호를 기록하세요. 다음에 TLS 오류를 만나는 사람은 포럼 게시물에서 찾은 암호 문자열이 아니라 그 기록에서 시작하게 됩니다.

관련 글