発行処理は entry 22: invalid expiry date で停止しますが、目の前の要求そのものはまったく正常です。不平を言っているのは CA データベースのパーサーであり、CSR でも、最終的に証明書を提示する VPN クライアントでもありません。この区別が以後のすべてを決めます — 壊れているのはレコードなので、修復の対象は CA の状態であり、要求やピアの設定ではありません。番号付きのエントリは index.txt の一行だと捉えれば、問題は検証可能な答えを持つ有限のデータ上の問いに縮みます。

エラーをデータベースへの苦情として読む

どの openssl ca 呼び出しも、何かに署名する前に自分のテキストデータベースを走査します。各行は状態文字、失効タイムスタンプ、任意の失効取消タイムスタンプ、十六進のシリアル番号、ファイル名、サブジェクトを持ちます。一つのフィールドが解析できないと、コマンドは行番号を報告して停止し、残りのレコードを推測しません。

この停止は保護的であり、細かすぎるわけではありません。読めないレコードがあると、ツールは要求されたサブジェクトが既にあるのか、シリアル番号が発行済みなのか、次の CRL に何を含めるべきかを判断できません。壊れた行を飛ばして進めば、まさにその静かな不整合が数か月後に、たいていは誰も説明できない失効の最中に表面化します。メッセージをデータへの苦情として読めば、調査は CA ディレクトリの内側にとどまります。

何かに触れる前に CA の状態をコピーする

データベースファイルだけでなく、CA ディレクトリ全体のスナップショットを取ります。インデックス、その属性ファイル、シリアル番号と CRL 番号のファイル、秘密鍵、発行済み証明書はどれも後続の作業に関わるので、一つだけ戻して他を落とす修復は二次障害を生みます。用意されているなら CA 自身のバックアップ手順を使い、作業の間は定期発行を止めます。

失敗したコマンドが実際に読み込んだ OpenSSL のビルドと設定ファイルを記録します。インストールは複数の CA ディレクトリを抱えることが多く、エラーは選択した設定が指すデータベースに対してのみ意味を持ちます。

エントリを見つけて日付フィールドをデコードする

報告された行番号は先頭のレコードから数えるので、上に空行やコメント行がないと確認できれば sed -n '22p' index.txt が問題のエントリに当たります。その行は、タブや行末の空白はよくあるうえ普通のエディタ画面では見えないため、区切り文字が見える形で出力してください。

失効フィールドは年によって幅が変わるタイムスタンプです。2049 年までの値は UTCTime で YYMMDDHHMMSSZ の形に書き、それ以降の値は 四桁の年を持つ GeneralizedTime に切り替わります。二つの形式を混ぜたレコードや、パーサーが 四桁を期待する位置に二桁の年を持つレコードは、まさにこの点で失敗します。中断された書き込みが残した切り詰められたフィールドも同じです。

レコードは別の CA のファイルではなく、それが参照する証明書と比べます。署名済み証明書は有効期間が何を言うべきかの権威であり、解析可能なオブジェクトとしてすでに存在します。

署名済み証明書に照らしてレコードを修復する

実際の日付は次で読み取ります: openssl x509 -in issued.pem -noout -dates -serial -subject。次に notAfter を、あなたのビルドがその年に書き込むタイムスタンプ幅に変換し、一文字も変える前にシリアル番号がこれから編集するエントリと一致することを確認します。

壊れたフィールドだけを編集し、状態文字とシリアル番号は残し、行の残りはそのままにします。どの署名済み証明書とも突き合わせられない場合は、はぐれたエントリとして扱い、行を手で削除するのではなく CA 自身の失効手順で引退させます。

年についての推測に合わせて日付を切り詰めて修復してはいけません。二文字の切り詰めはビルド間で持ち運べず、データベースが将来の重複サブジェクト検査や CRL 検査に報告する有効期間を静かに変えてしまいます。元の値が復元できない場合は、新しいシリアル番号で再発行し、古いものをなぜ捨てたかを書き留めます。監査証跡は修復の一部であり、その周りの書類仕事ではありません。

離れる前に発行と CRL 生成を検証する

同じ設定で発行を一度実行し、行番号の苦情なしに完了することを確認します。次に openssl ca -gencrl -config openssl.cnf で CRL を生成し、壊れたレコードは署名時ではなくたいていそこで表面化するため、それが解析できることを確かめます。

新しい証明書は次で確認します: openssl x509 -noout -dates -serial そして CA が今書いた行と比べます。状態文字と失効日が証明書と一致することを確かめ、さらに openssl verify -CAfile ca.pem issued.pem がエラーなく戻ることを確かめます。そのうえで定期発行を戻し、二本目の不正な行はすぐに名乗りを上げるので、最初の実行を監視します。

関連記事