Easy-RSA index.txt、シリアル番号、コピー

Easy-RSA index.txt、シリアル番号、コピー

OpenVPNで使用するためにEasy-RSA 2で生成された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=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.txt第三に、すべて、特におよびなどの重要なものをバックアップしますserial.txt

第四に、キャンセルする証明書のリストを作成します。リストにはfilename -などの項目を含めることができますjohn-doe-vpn.pem。必要に応じて、そのフォルダをそのフォルダに移動します。それぞれ一意のシリアル番号を持っている必要があり、同じ出版社名を持つ必要があります。 OCSPプロトコルでは可能ですが、openssl ca機能はocsp同時に複数のパブリッシャを処理できません。

第五に、シーケンスごとindex.txtに1行の新しいコンテンツを作成します。 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以降で利用可能な代替方法は、openssl ca [-config conffile] -valid certfileこの抽出自動化を使用することですが、1.1.0にのみ文書化されています。ただし-valid、毎回CA秘密鍵をロードする必要はないので、秘密鍵がパスワードで暗号化されている場合(良い習慣です)、時間を節約するためにパスワードを入力し続ける必要があります。暗号化されていない一時キーと一致するが偽造(自己署名)証明書を含むCAキーと証明書。-valid重複したシーケンス項目は記録されないため、除外または削除することを心配する必要はありません。

ファイルにserial値を次のように入力します。少なくとも以前に発行された証明書の最も高い値。安全で明確に次の証明書に移動したい場合は問題あり10000ません。この時点でこれを設定する必要が1000000あるかもしれません。unique_subject=no

6番目に、ファイルの各証明書(シリアル番号)をindex破棄済みとしてマークします。各証明書ファイルを繰り返すことができますが、openssl ca -revokeawkを使用する方が簡単です。たとえば、次のようになります。

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拡張を指定した場合は、それを使用してCRLを生成しindexたり、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)失効していない証明書と秘密鍵を保持している現在の従業員(従業員が退職または契約を終了する)。


別のオプションがあります。既存のPKIを削除して再起動してください。この場合(1)ステップは、ルートCAとすべての中間/サブCAをキャンセルすることです。その後、秘密鍵を捨てます。 (2)ステップは、新しいルートCAを作成し、新しい中間/サブCAを発行し、最後に新しい最終エンティティ証明書を発行することです。 (2)段階ではシグネチャーパーティーダンスを披露することもできます。

信じるか、OpenStackはこの戦略を使用します(または使用を検討しています)。これは、ユーザーの要件を満たすのに十分長く保管され、問題が発生した場合に廃棄されるように設計された「一時PKI」です。

笑うには、Peter Gutmanの投稿をチェックしてください。エンジニアリング安全。彼はPKIと公共CAに関しては無慈悲です。

おすすめ記事