Easy-RSA index.txt, 직렬 및 중복

Easy-RSA index.txt, 직렬 및 중복

우리는 Easy-RSA 2에서 OpenVPN 사용을 위해 생성된 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=noDN이 중복될 수 있습니다.

내 생각엔 당신이 몇 가지 일을 해야 할 것 같아요. 먼저 OpenSSL 유틸리티의 최신 버전이나 업데이트된 버전을 사용하세요. 여기서 "현대"는 최신 1.0.2 또는 1.1.0 중 하나를 의미합니다. 이전 버전의 유틸리티에는 이름과 일련 번호를 일치시키는 데 미묘한 문제가 있었습니다.

둘째, 구성 파일을 검사하고(일반적으로 openssl.cnf와 함께 복사된 다른 파일을 사용할 수 있음 ) 및 및 -config filename같은 관련 설정을 기록해 둡니다 . 나는 이것이 다음 과 관련된 내용이라고 생각합니다 .serial.txtunique_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.txtserial.txt.

넷째, 취소하려는 인증서 목록을 만듭니다. 목록에는 filenames - 와 같은 항목이 있을 수 있습니다 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 이상에서 사용할 수 있지만 1.1.0에만 문서화된 또 다른 접근 방식은 openssl ca [-config conffile] -valid certfile이 추출을 자동으로 수행하는 것입니다. 그러나 -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 확장을 지정한 경우 이를 index사용하여 CRL을 생성 하거나 이를 사용하여 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 Gutmann의 글을 확인해 보세요.엔지니어링 보안. 그는 PKI 및 공용 CA에 관해서는 무자비합니다.

관련 정보