Easy-RSA index.txt,序號和副本

Easy-RSA index.txt,序號和副本

index.txt我們有超過 700 個serial證書,由 Easy-RSA 2 產生供 OpenVPN 使用。的序號。此外,原始證書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.cnfunique_subject=yes,那麼它們就不能重複。如果unique_subject=no,則 DN 可以重複。

我認為你需要做一些事情。首先,使用 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

第四,建立要撤銷的憑證清單。該清單可能包含諸如文件名 - 之類的條目john-doe-vpn.pem。如果您願意,請將它們移至自己的資料夾中。最好每個都應該有一個唯一的序號,而且它們必須具有相同的發行者名稱;儘管 OCSP 協定可以,但openssl ca和函數ocsp不能同時處理多個發行者。

第五,index.txt為每個序列建立一個包含一行的新內容。一種方法是從每個憑證檔案中提取主題、序號和過期時間,如您發布的腳本中所示,儘管您可以將大部分 shell 工作折疊到每個憑證一個 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一個值為至少任何先前頒發的證書的最高值;如果您想跳到下一個100001000000其他任何地方以確保安全並且可能也更清楚,那很好。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 擴展,則使用它來產生 CRLindex和/或使用它來設定 OCSP 回應程式。openssl ca -gencrl [-crldays n] [-out file]

第八,一旦您分發了 CRL 和/或開始運行(新的)OCSP 響應程序,全部受影響序號的憑證將被撤銷,如果使用(並正確檢查),將導致通訊失敗。如果任何的重複序號位於您的系統仍在使用的憑證中,必須先更換它們。如果您仍然擁有使用受影響證書的系統的請求文件 (CSR),您只需重新頒發openssl ca [-config conffile] [-in reqfile | -infiles reqfile...]新證書並將其發送到主題系統,然後讓這些系統的操作員安裝它們。否則,您需要先讓每個系統的運營商向您發送一份 CSR,該 CSR 可以是他們之前使用(並保存)的 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) 員工遺失設備(即私鑰遺失); ETC。


您還有另一個選擇...將現有的 PKI 徹底銷毀並重新開始。在這種情況下,步驟 (1) 是撤銷根 CA 和所有中間/從屬 CA。然後,扔掉私鑰。步驟 (2) 是建立新的根 CA,頒發新的中間/從屬 CA,最後頒發新的最終實體憑證。對於步驟(2),您甚至可以跳簽名派對舞蹈。

不管你相信與否,OpenStack 使用了這個策略(或正在考慮使用它)。它是一種“臨時 PKI”,旨在保留足夠長的時間來滿足您的需求;然後當出現問題時被丟棄。

如果你想笑一下,你可能想看看 Peter Gutmann 的工程安全。當涉及到 PKI 和公共 CA 時,他是無情的。

相關內容