OpenVPN에서 사용하기 위해 Easy-RSA 2에서 생성된 700개 이상의 인증서가 있습니다. 어떻게 이런 일이 발생했는지는 모르겠지만(누군가가 한 번 삭제했거나 둘 다 삭제한 것으로 의심됨 index.txt
) serial
생성된 인증서의 절반 이상이 동일한 일련 번호를 가지고 있습니다. 또한 원래 인증서에는 index.txt
이전 인증서를 제외한 모든 인증서의 절반(후반부)만 포함됩니다.
그러면 새 인증서가 완료될 수 있습니다. 하지만 에 없는 인증서를 해지하려고 하면 index.txt
오류가 발생합니다.
index.txt
스크립트를 통해 다시 만들어 보았습니다.
for cert in *.crt
do
echo "-> $cert"
enddate=`openssl x509 -enddate -noout -in $cert | sed 's/notAfter=//' | awk '\
{ year=$4-2000;
months="JanFebMarAprMayJunJulAugSepOctNovDec" ;
month=1+index(months, $1)/3 ;
day=$2;
hour=substr($3,1,2) ;
minutes=substr($3,4,2);
seconds=substr($3,7,2);
printf "%02d%02d%02d%02d%02d%02dZ", year, month, day, hour, minutes, seconds}'`
serial=`openssl x509 -serial -noout -in $cert |sed 's/serial=//'`
subject=`openssl x509 -subject -noout -in $cert |sed 's/subject= //'`
echo -e "V\t$enddate\t\t$serial\tunknown\t$subject" >>index.txt
done
인증서를 하나씩 읽고 데이터를 가져와서 새 인증서를 채웁니다 index.txt
.
그러나 위의 텍스트에 따르면 스크립트는 동일한 일련 번호를 가진 인증서로 이를 채웁니다. 따라서 새로 생성된 인증서로는 index.txt
인증서에 대한 작업(생성, 취소 등)을 수행할 수 없습니다.
문제는: index.txt
모든 인증서가 있으면 기반을 수정할 수 있습니까? 또는 어떻게든 인증서의 일련번호를 변경할 수도 있습니다(단순히 파일 헤더를 변경하는 것은 *.crt
아무 작업도 수행하지 않습니다. 쿼리할 때 일련번호는 동일하게 유지됩니다 openssl
).
그렇지 않은 경우 - 존재하지 않는 인증서만 해지하면 되는데, 근거 없이 할 index.txt
수 있나요 ?index.txt
답변1
우리는 700개 이상의 인증서를 보유하고 있습니다. 생성된 인증서의 절반 이상이 동일한 일련 번호를 가지고 있습니다. 원본 index.txt에는 이전 인증서를 제외한 모든 인증서의 절반(마지막 절반)만 포함되어 있습니다.
올바른 방향을 알려드리려고 노력하겠지만, 테스트 장비를 설정하지 않고 문제를 반복하므로 아마도 완료하지 못할 것입니다. 미리 사과드립니다.
개인 PKI에서 인증서 발급에 대한 더 높은 수준의 개요를 보려면 다음을 참조하세요.인증 기관을 통해 인증서 서명 요청에 어떻게 서명합니까?Easy-RSA가 자동으로 수행하지 않는 경우 수동으로 수행할 수 있는 방법을 설명합니다.
또 다른 중요한 서류는RFC 4158, 인터넷 X.509 공개 키 인프라: 인증 경로 구축. 이것은__이것__문서에서는 일치 항목이 무엇인지, {Issuer Distinguished Name,Serial Number}
또는 같은 튜플을 사용하여 {Subject Distinguished Name,Public Key Identifier}
두 인증서의 동등성을 비교하는 방법을 설명합니다. OpenSSL은 일치를 위해 이 문서를 사용합니다. 섹션 3.5.15도 참조하세요."엔드포인트 고유 이름(DN) 일치"섹션 3.5.12,"일치 키 식별자(KID)".
일련번호는 고유해야 합니다. 이것은 극복해야 할 문제입니다.주체 고유 이름(DN)다른 이야기입니다. 가 있으면 openssl.cnf
복제 unique_subject=yes
할 수 없습니다. 이면 unique_subject=no
DN이 반복될 수 있습니다.
내 생각엔 당신이 뭔가를 해야 할 것 같아요. 먼저 OpenSSL 유틸리티의 최신 버전을 사용하십시오. 여기서 "현대"는 이후 버전인 1.0.2 또는 1.1.0 중 하나를 나타냅니다. 이전 버전의 유틸리티에는 이름과 일련 번호가 일치하는 데 미묘한 문제가 있었습니다.
둘째, 구성 파일을 확인하고(일반적 openssl.cnf
으로 복사된 다른 파일을 사용할 수도 있음 ) 및 및 -config filename
같은 관련 설정을 기록해 둡니다 . 나는 이것이 다음 의 관련 콘텐츠 라고 생각합니다 :serial.txt
unique_subject=no
[CA_Default]
openssl.cnf
base_dir = .
certificate = $base_dir/cacert.pem # The CA certifcate
private_key = $base_dir/cakey.pem # The CA private key
new_certs_dir = $base_dir # Location for new certs after signing
database = $base_dir/index.txt # Database index file
serial = $base_dir/serial.txt # The current serial number
unique_subject = no # Allow reuse of subjects
index.txt
셋째, 모든 것, 특히 및 와 같은 중요한 것을 백업하십시오 serial.txt
.
넷째, 취소할 인증서 목록을 만듭니다. 목록에는 filename - 과 같은 항목이 포함될 수 있습니다 john-doe-vpn.pem
. 원하는 경우 해당 폴더를 해당 폴더로 이동하세요. 각각 고유한 일련 번호를 갖고 있어야 하며 동일한 게시자 이름을 가져야 합니다. OCSP 프로토콜에서는 가능하지만 openssl ca
및 기능은 ocsp
동시에 여러 게시자를 처리할 수 없습니다.
다섯째, index.txt
각 시퀀스에 대해 하나의 행이 있는 새 콘텐츠를 만듭니다. 한 가지 접근 방식은 게시한 스크립트에 표시된 대로 각 인증서 파일에서 제목, 일련 번호 및 만료 시간을 추출하는 것입니다. 하지만 대부분의 셸 작업을 인증서당 하나의 openssl과 하나의 awk로 축소할 수 있습니다.
for f in *files*; do
openssl x509 -noout -enddate -serial -subject -in $f \
| awk 'BEGIN{FS="=";OFS="\t"} /^serial/{num=$2} /^subject/{sub=$2}
/^notAfter/{split($2,a,/ /);mon=index(months,a[1])/3+1;day=a[2]...exp=sprintf(...)}
END{print "V",exp,"",num,sub}' >>index.txt
done
중복 시리즈를 미리 (신뢰할 수 있게) 제거하는 것이 어려운 경우 모든 것을 그 안에 넣은 다음 또는 유사한 명령을 사용하여 중복 항목을 삭제할 수 awk -F'\t' '!already[$4]++'
있습니다 sort -t$'\t' -k4,4 -u
.
1.0.2 이상에서 사용할 수 있는 대체 방법은 openssl ca [-config conffile] -valid certfile
이 추출 자동화를 사용하는 것이지만 1.1.0에만 문서화되어 있습니다. 그러나 -valid
매번 CA 개인 키를 로드할 필요는 없으므로 개인 키가 비밀번호로 암호화되어 있는 경우(좋은 습관입니다) 시간을 절약하기 위해 비밀번호를 계속해서 입력해야 합니다. 암호화되지 않은 임시 키와 일치하지만 위조된(자체 서명된) 인증서가 포함된 CA 키 및 인증서. -valid
중복된 시퀀스 항목은 기록되지 않으므로 제외하거나 삭제하는 것에 대해 걱정할 필요가 없습니다.
파일에 serial
값을 다음과 같이 입력하십시오.적어도이전에 발급된 인증서 중 가장 높은 값입니다. 안전하고 더 명확하게 다음 인증서로 이동하려는 경우에는 문제가 되지 10000
않습니다 . 이 시점에서 이를 설정 1000000
해야 할 수도 있습니다 .unique_subject=no
여섯째, 파일의 각 인증서(일련번호)를 index
폐기됨으로 표시합니다. 각 인증서 파일을 반복할 수 있지만 openssl ca -revoke
awk를 사용하면 더 쉽습니다. 예를 들면 다음과 같습니다.
awk -F'\t' -vOFS='\t' '{$1="R"; $3="161101000000Z"}' <index.txt >temp && mv temp index.txt
# if you want, you can add a comma and a reason, see man ca or
# online at https://www.openssl.org/docs/manmaster/man1/ca.html
# under -crl_reason. But there isn't a code for 'CA stupid', and
# in practice the reason doesn't really matter to reliers except
# you should't use hold or remove (latter noted in the man)
일곱째, 이전 인증서가 OCSP 확장을 지정하는 경우 이를 사용하여 CRL을 생성 index
하거나 OCSP 응답자를 설정하는 데 사용합니다.openssl ca -gencrl [-crldays n] [-out file]
여덟째, CRL을 배포하고/하거나 (새로운) OCSP 응답자를 실행하기 시작하면,모두영향을 받은 일련 번호가 있는 인증서는 폐기되며 올바르게 사용하고 확인하면 통신이 실패하게 됩니다. 만약에어느시스템에서 아직 사용 중인 인증서에 중복된 일련 번호가 있으므로 먼저 교체해야 합니다. 영향을 받은 인증서를 사용하는 시스템의 요청 파일(CSR)이 여전히 있는 경우 openssl ca [-config conffile] [-in reqfile | -infiles reqfile...]
새 인증서를 재발급하여 대상 시스템으로 보낸 다음 해당 시스템의 운영자에게 설치하도록 하면 됩니다. 그렇지 않은 경우 먼저 각 시스템 운영자에게 이전에 사용하고 저장한 CSR이나 생성한 새 CSR을 보내달라고 요청해야 합니다.
마지막으로, 이전 파일에서 모든 "양호한" 항목(취소하지 않은 일련번호)을 복원 index
하고 위의 #8에서 발급된 대체 인증서의 새 항목과 결합합니다. OCSP 응답자(위 참조)를 실행하는 경우 취소된 항목도 유지해야 하지만 이는 중요하지 않지만 더 쉬울 수도 있습니다. 하다아니요serial
가장 높은 이전 인증서보다 낮으면 이전 값을 다음으로 되돌립니다.또는인증서를 새로운 최고 값으로 교체하고 대신 새 값에서 계속 증가하도록 합니다.
날짜 for-loop
및 인쇄 날짜 정보:
hour=substr($3,1,2) ;
minutes=substr($3,4,2);
seconds=substr($3,7,2);
printf "%02d%02d%02d%02d%02d%02dZ", year, month, day, hour, minutes, seconds}'`
날짜도 걱정하지 마세요. 만료된 경우 PKI가 제대로 작동하면 사용할 수 없습니다. 기분이 좋아지면 인증서 및 공개 키와 연결된 개인 키를 삭제하세요.
관심 있는 것은 취소할 인증서 목록, 일련 번호 및 고유 이름뿐입니다. 여기에서 목록은 다음 인증서로 구성됩니다. (1) 만료되지 않은 인증서와 개인 키를 보유하고 있는 현재 직원(예: 직원이 퇴직하거나 계약이 종료됨) (2) 장치(예: 개인 키를 분실한 직원) 손실됨);
또 다른 옵션이 있습니다. 기존 PKI를 삭제하고 다시 시작하세요. 이 경우 (1)단계는 루트 CA와 모든 중간/하위 CA를 취소하는 것입니다. 그런 다음 개인 키를 버리십시오. (2) 단계는 새로운 루트 CA를 생성하고, 새로운 중간/하위 CA를 발급하고, 마지막으로 새로운 최종 엔터티 인증서를 발급하는 것입니다. (2)단계에서는 시그니처 파티 댄스를 선보일 수도 있습니다.
믿거나 말거나 OpenStack은 이 전략을 사용합니다(또는 사용을 고려하고 있습니다). 이는 사용자의 요구 사항을 충족할 만큼 오랫동안 보관했다가 문제가 발생하면 폐기되도록 설계된 "임시 PKI"입니다.
웃으시려면 Peter Gutman의 글을 확인해 보세요.엔지니어링 안전. 그는 PKI 및 공용 CA에 관해서는 무자비합니다.