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
を入力します。すべてがOKのようです。
しかし、上のテキストによると、スクリプトは同じシリアル番号を持つ証明書でそれを満たします。したがって、この新しく作成されたindex.txt
では、証明書を使用して何もできません(作成、取り消しなど)。
問題は、すべての証明書がある場合にindex.txt
ベースを修復する可能性はありますか?または、多分、どういうわけか証明書のシリアル番号を変更します(*.crt
ファイルの先頭を変更するだけでは何も行われません-openssl
からクエリを実行してもシリアルは古いままです)
そうでない場合-index.txt
にない証明書のみを取り消す必要があります。index.txt
ベースなしでこれを実行できますか?
700を超える証明書があります...生成された証明書の半分以上が同一のシリアル番号を持っています...元のindex.txtには、前の証明書を除くすべての証明書の半分(後半)しか含まれていません。
私はあなたを正しい方向に向けさせるつもりですが、テストリグをセットアップして問題を再現しなかったので、最後までたどり着けないでしょう。事前にお詫び申し上げます。
プライベートPKIでの証明書発行のより高いレベルの概要が必要な場合は、 証明機関に証明書署名要求に署名する方法を教えてください。 次の場合に手動で行う方法を説明しますEasy-RSAはあなたのためにそれをしていませんでした。
別の重要なドキュメントは、 RFC 4158、Internet X.509 Public Key Infrastructure:Certification Path Building です。これは、__ the __ドキュメントで、一致とは何か、および{Issuer Distinguished Name,Serial Number}
や{Subject Distinguished Name,Public Key Identifier}
などのタプルの使用方法を説明しています2つの証明書の同等性を比較します。 OpenSSLは照合にこのドキュメントを使用します。セクション3.5.15、「エンドポイント識別名(DN)マッチング」およびセクション3.5.12、「マッチングキー識別子(KID)」。
シリアル番号は一意であると想定されています。これが克服すべき問題です。 Subject Distinguished Names(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
3番目に、すべてをバックアップします。特に、index.txt
やserial.txt
などの重要なものをバックアップします。
4番目に、取り消す証明書のリストを作成します。リストには、ファイル名-john-doe-vpn.pem
などのエントリが含まれる場合があります。必要に応じて、それらを独自のフォルダに移動します。できれば、それぞれに固有のシリアル番号が必要であり、それらはすべて同じ発行者名を持つ必要があります。 openssl ca
およびocsp
関数は、一度に複数の発行者を処理できませんが、OCSPではプロトコルは処理できます。
5番目に、シリアルごとに1行を含む新しい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に、このindex
からopenssl ca -gencrl [-crldays n] [-out file]
を使用してCRLを生成するか、古い証明書(のいずれか)がOCSP拡張を指定している場合は、それを使用してOCSPレスポンダーを設定します。
第8に、CRLを配布したり、(または)OCSPレスポンダーの実行を開始したりすると、影響を受けるシリアルを含むall証明書がすべて無効になり、使用すると通信が失敗します(そして適切にオンになっています)。システムがまだ使用している証明書に複製されたシリアルのanyが含まれている場合、それらを最初に置き換える必要があります。影響を受ける証明書を使用しているシステムからの要求ファイル(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)デバイスを紛失した従業員(つまり、秘密鍵が公開されている)。等.
もう1つのオプション...既存のPKIを地面に焼き付けてやり直します。この場合、ステップ(1)はルートCAとすべての中間/下位CAを取り消すことです。次に、秘密鍵を破棄します。手順(2)は、新しいルートCAを作成し、新しい中間/下位CAを発行し、最後に新しいエンドエンティティ証明書を発行します。ステップ(2)では、署名パーティーダンスを行うこともできます。
信じられないかもしれませんが、OpenStackはこの戦略を使用しています(または使用を検討していた)。その種類の「一時的なPKI」は、ニーズを満たすのに十分な長さを維持することを意味します。そして、物事がうまくいかない場合は破棄されます。
笑うなら、Peter Gutmannの Engineering Security をチェックしてみてください。 PKIとパブリックCAに関しては彼は冷酷です。