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.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
。
第四,建立要撤銷的憑證清單。該清單可能包含諸如文件名 - 之類的條目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
一個值為至少任何先前頒發的證書的最高值;如果您想跳到下一個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 擴展,則使用它來產生 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 時,他是無情的。