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
証明書を 1 つずつ読み取り、データを取得して新しい証明書を入力します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}
て2つの証明書の等価性を比較する方法を説明するドキュメント。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
3 番目に、すべてをバックアップします。特に、やなどの重要なものをバックアップしますserial.txt
。
4 番目に、取り消す証明書のリストを作成します。リストには、ファイル名 - のようなエントリが含まれる場合がありますjohn-doe-vpn.pem
。必要に応じて、それらを独自のフォルダーに移動します。それぞれに一意のシリアル番号が付けられ、発行者名がすべて同じである必要があります。 およびopenssl ca
関数ocsp
は、一度に複数の発行者を処理できませんが、OCSP プロトコルでは処理できます。
5 番目に、各シリアルの行を含む新しいを作成しますindex.txt
。1 つの方法は、投稿したスクリプトのように、各証明書ファイルからサブジェクト、シリアル、有効期限を抽出することですが、シェルの作業のほとんどを証明書ごとに 1 つの openssl と 1 つの 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
。
6 番目に、ファイル内の各証明書 (シリアル) を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)
7 番目に、古い証明書のいずれかが OCSP 拡張を指定している場合は、これをindex
使用してCRL を生成し、それを使用して OCSP レスポンダーを設定します。openssl ca -gencrl [-crldays n] [-out file]
8番目に、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」です。
笑いたいなら、ピーター・ガットマンのエンジニアリングセキュリティ彼は、PKI とパブリック CA に関しては容赦ない人物です。