일련번호도, 키도, 심지어 전체 주체까지 다른 두 클라이언트 인증서가, 서버가 그중 어느 것도 보지 않기 때문에, 여전히 하나의 정책 파일로 귀결될 수 있습니다. 서버는 인증서에서 이름을 읽고 그에 맞는 클라이언트 설정 파일을 엽니다. 두 인증서가 같은 이름을 가지면, 두 번째는 접속하는 순간 첫 번째의 정책을 물려받습니다.

충돌은 등록 시에 생기고 접속 시에야 드러나는데, 보통 한 장치가 다른 기계에 속한 주소나 경로 집합을 받을 때 나타납니다. 이를 막으려면 서버가 어떤 필드를 매핑하는지 합의한 뒤, 무엇이든 서명되기 전에 그 값을 예약해야 합니다.

인증서 도구는 X.509 내부의 고유성과 OpenVPN 정책 이름의 고유성이 서로 다른 시스템이 강제하는 서로 다른 요구 사항이기 때문에 경고하지 않습니다.

서버가 찾는 것은 이름이지 지문이 아니다

일반적인 인증서 기반 매핑에서 서버는 제시된 인증서에서 일반 이름을 가져와 클라이언트 설정 디렉터리에서 그 이름의 파일을 찾습니다. 그 파일은 고정 주소를 고정하고, 경로를 푸시하며, 클라이언트별 방화벽 표시를 적용할 수 있습니다. 조회는 파일 이름과의 문자열 일치이므로 대소문자, 공백, 구두점이 모두 중요합니다.

일부 배포는 인증된 사용자 이름이 일반 이름을 대신하도록 매핑을 의도적으로 바꾸며, 그때는 사용자 이름이 고유해야 합니다. 어느 쪽이든 정책을 선택하는 값이 바로 예약하는 값입니다. 무엇이든 발급하기 전에 어느 쪽인지 정해야 하며, 충돌 후의 추측은 질문보다 비쌉니다.

두 기관이 같은 이름에서 만나는 곳

하나 이상의 발급 기관에서 인증서를 받아들이는 조직은 하나의 이름 공간에 쓰는 두 개의 독립적인 등록 절차를 운영합니다. 각 기관의 고유성 규칙은 그 기관 내부에서 적용되므로, 둘 다 같은 일반 이름에 정당하게 발급할 수 있고 어느 쪽도 이상을 알아차리지 못합니다.

일련번호는 도움이 되지 않습니다. X.509는 일련번호가 발급자의 범위 안에서 고유할 것을 요구하는데, 이는 그 기관의 장부상 성질이지 장치의 전역 신원이 아닙니다. 주체 검사도 일반 이름 검사와 다른 시험으로서 두 인증서가 CN을 공유하면서도 조직 단위가 달라 서로 다른 주체를 가질 수 있습니다. 이런 성질이 모두 성립해도 서버는 두 인증서를 하나의 파일 이름에 매핑합니다.

OpenSSL CA 문서는 자체 데이터베이스의 판단을 좌우하는 unique_subject 설정을 다루며, 정직한 출발점은 특정 EasyRSA나 OpenSSL 기본값이 적용된다고 가정하는 대신 발급 구성을 읽는 것입니다.

서명 전에 실효 이름을 예약하십시오

장치를 승인된 기록에, 그다음 정확한 정책 파일 이름에 매핑하는 대장을 유지하여 이름이 한 번만 할당되고 할당된 채로 남게 하십시오. 예약은 원자적이어야 하며, 실제로는 할당한 뒤 서명하는 단계를 감싸는 데이터베이스 제약이나 잠금을 뜻하고, 두 사람이 편집하는 스프레드시트가 아닙니다.

그다음 검사를 발급의 일부로 만드십시오: 요청된 이름이 이미 있으면 서명을 거부하고, 다른 기관이 예약한 이름도 똑같이 점유된 것으로 보이므로 그 검사에 서버가 신뢰하는 모든 기관을 포함하십시오. 명확한 이유가 있는 거부는 다른 사람의 고정 주소를 계속 받는 장치에 관한 티켓보다 쌉니다.

갱신은 의도적으로 이름을 재사용한다

기존 장치에 대한 재발급은 같은 정책 이름 아래 새로운 일련번호를 만들어야 하며, 그것은 충돌이 아니라 정당한 재사용입니다. 미리 정해야 할 것은 옛 인증서와 새 인증서가 동시에 유효할 수 있는지, 그리고 옛 자격 증명을 어떻게 퇴역시키는지라는 겹침입니다.

이 문제를 풀려고 duplicate-cn에 손을 뻗지 마십시오. 그 서버 옵션은 같은 이름을 제시하는 동시 연결을 통제할 뿐이며 등록을 잠그지 않고, 그것을 켠다고 해서 하나의 공유 고정 주소가 동시에 두 기계에 안전해지지도 않습니다. 폐기는 보통 발급자와 일련번호로 인증서를 식별하므로, 서버가 올바른 폐기 데이터를 받아 시행하는 한 옛 자격 증명의 퇴역이 그 대체물을 무효화할 필요는 없습니다.

기계에 있는 도구로 매핑을 확인하십시오

장치에 새 자격 증명을 넘기기 전에 서버가 읽을 방식 그대로 인증서에서 이름을 읽고, 선택될 것으로 기대하는 정책 파일과 비교하십시오.

openssl x509 -in device42.crt -noout -subject -nameopt sep_multiline
ls -l /etc/openvpn/ccd/device42
grep -n "duplicate-cn" /etc/openvpn/server.conf

첫 번째 명령은 주체 필드를 따로 출력하므로 잘못 들어간 조직 단위나 두 배가 된 공백이 즉시 보입니다. 두 번째는 바로 그 이름으로 정책 파일이 있음을 확인하고, 세 번째는 서버가 한 이름에 여러 세션을 허용하도록 설정되었는지 보여 줍니다. 실수가 아직 사건이 아니라 서명 하나의 값어치일 때, 등록 단계를 떠나기 전에 셋 모두를 새 인증서에 실행하십시오. 출력을 티켓과 함께 보관하여 다음 사람이 서버가 실제로 받은 이름을 볼 수 있게 하십시오.

실제 연결로 마무리하고, 할당된 주소와 푸시된 경로를 쓰려고 했던 내용이 아니라 정책 파일과 비교하십시오. 두 장치가 같은 고정 주소를 보고한다면, 대장에는 어떤 인증서 검사로도 드러나지 않을 충돌이 있습니다.

관련 글