SSL証明書(CSR、公開鍵、秘密鍵、中間証明書・クロスルート証明書)をまとめて管理するためのプログラムです。 以下の効能を期待して作成しています。
- 証明書リポジトリ(DB)内にSSL証明書を収容することでSSL証明書を散逸を防ぐ。そのためバックアップが容易です。
- 証明書管理手順の正規化ができる。
- CSRの作成・署名・デプロイといった手順をコマンド一発で行えるようになる。
- 中間証明書・クロスルート証明書の組み合わせを自動的に手繰ってくれる。
- 認証局より(メールで)送られてきた証明書をとりあえず放り込んでおいて、必要なものだけ取り出すことができる。
またプログラム作成にあたり以下の点に気を付けています。
- 外部モジュールへ過度に依存しない。デプロイはシンプルに。
- そのため証明書に関する主要なオペレーションは全て openssl コマンドを呼び出す形で実装。
- なるべくセキュアになるようプログラミングする。
- オブジェクティブな構造に作り替えたい。
- SSL証明書一覧
certmgr [-c config_file] list [-r][-o <ORDER[,ORDER]...>][[-o <ORDER>]...]
- SSL証明書の詳細表示
certmgr [-c config_file] info <証明書ID|コモンネーム|ファイル名>[<証明書ID|コモンネーム|ファイル名>...]
- CSR作成
certmgr [-c config_file] generate [-m][-u][-t TYPE][-s SIGN][--sans=<ドメイン>[,<ドメイン>...][--ocsp-must-staple] <サブジェクト|コモンネーム>
- SSL証明書のインポート(CSR、公開鍵、秘密鍵、中間証明書問わず)
certmgr [-c config_file] import [-m][-u] <証明書ファイル名> [<証明書ファイル名>...]
- SSL証明書のエクスポート(CSR、公開鍵、秘密鍵、中間証明書問わず)
certmrt [-c config_file] export [-a][-b <バックアップ先パス名>]
certmrt [-c config_file] export [-r][-b <ベースファイル名>][--pubout=公開鍵ファイル名][--keyout=秘密鍵ファイル名][--chainout=中間証明書ファイル名] <コモンネーム|証明書ID>
-o
- リストの順番の指定
-m
- 作成されるCSRを「マーキングします」。
-u
- 作成されるCSRを「マーキングしません」。
-t TYPE
or--type=TYPE
- CSRの鍵種別の指定(
rsa:2048
,rsa:1024
,rsa:3072
,rsa:4096
,prime256v1
,secp256r1
,secp384r1
,secp521r1
)
- CSRの鍵種別の指定(
-s SIGN
or--sign=SIGN
- CSRの署名種別の指定(
sha256
,sha
=sha1
,sha384
,sha512
)
- CSRの署名種別の指定(
--sans=ドメイン
- カンマ区切りで複数のSANs(Subject Alternative Names)を指定する。
--ocsp-must-staple
- OCSP Must-Stapleを有効にする。証明書のオンライン失効確認に失敗すると一時的に失効扱い(hard fail)となります。
-a
or--all
- 証明書リポジトリ中のすべての証明書を対象とします。出力先パス名を
-b
オプションで指定します。
- 証明書リポジトリ中のすべての証明書を対象とします。出力先パス名を
-r
or--full-chain
or--fullchain
- 公開鍵をエクスポートする際に再帰的に中間証明書をたどります(フルチェイン証明書)。
-b
or--basename
or--backup
- 各種証明書(公開鍵、秘密鍵、中間証明書)の出力ファイル名のベースを指定する(拡張子はなしで)。下記のオプションにより上書きできる。
--pubout
- 公開鍵の出力ファイル名を指定する。
--keyout
- 秘密鍵の出力ファイル名を指定する。
--chainout
- 中間証明書(クロスルート証明書を含む)の出力ファイル名を指定する。
certmgr は設定ファイルを必要とします。 以下の順序で設定ファイルを探します。
- (カレントディレクトリの).certmgrrc
- (ホームディレクトリの).certmgrrc
- /etc/certmgrrc
また、サブコマンドの前に -c 設定ファイル名
を指定することで設定ファイルの読み込みを上書きできます。
設定ファイルでは最低でも「CertRepo」の指定が必須となります。 今のところ「dbi:SQLite:」以外のデータソースには対応していません。
CertRepo: dbi:SQLite:dbname=/var/db/certmgr.sqlite
UserName:
PassWord:
DefaultMarked: yes
BaseName: %CN%
- 証明書(CSR、公開鍵、秘密鍵)一つの証明書IDでパッケージングされます。
- 中間証明書(クロスルート証明書)は「公開鍵」の一種として1つの証明書IDでそれぞれパッケージングします。
- 証明書IDの発行はCSRまたは公開鍵・中間証明書の、作成(CSRのみ)またはインポート時に行われます。
- また紐づけは証明書の中の「パブリックキー」(-----BEGIN PUBLIC KEY-----~-----END PUBLIC KEY-----)の同一性に基づいて行います。
- そのため、同一鍵のインポートは行えません(無視されます)。
- あくまでも「公開鍵」ベースなので、同一サブジェクト(ディスティングウィッシュ名)による複数の証明書の作成・インポートは可能です。
- CSR作成→新規証明書ID発行・CSRおよび秘密鍵の作成・収納→公開鍵のインポート→完了
- CSRインポート→新規証明書ID発行・CSRの収納→公開鍵のインポート→完了
- 公開鍵インポート→新規証明書ID発行・公開鍵の収納→完了
- 中間証明書インポート→新規証明書ID発行・中間証明書の収納→完了
また、CSRおよび公開鍵のインポートにおいて、公開鍵およびCSRまたは秘密鍵の追加インポートが行える。
- CSRインポート→新規証明書ID発行・CSRの収納→公開鍵・秘密鍵のインポート→完了
- 公開鍵インポート→新規証明書ID発行・公開鍵の収納→CSR・秘密鍵のインポート→完了
合わせてCSRのみインポートするだけのオペレーションも許可している。
- CSRインポート→新規証明書ID発行・CSRの収納→完了
なお秘密鍵のインポートについては、証明書ID発行に必要な情報が足りないので、証明書IDに紐づけ不能のためインポートはできません。
- Perl (動作確認は 5.26)
- App::Rad
- DBD::SQLite
- DBI
- openssl (動作確認は 1.0.2k)
- 現バージョン(0系)は証明書リポジトリの内部フォーマットの互換性を維持しません。
- 証明書一覧(certmgr list)機能はフィルタリング等を想定しておらず、使い勝手を変える可能性があります。
- 証明書チェインの検証は行っていません。
- 証明書(ID)の削除は実装していません。
- 証明書マーカーの変更は実装していません。
- CRL(OCSP)には対応していません。
- コモンネームが無いCSRおよび公開鍵はインポートできません。
- 中間証明書をインポートしていたらコモンネームが無かった場合、それはルート証明書の可能性があります。ルート証明書は本システムの管理対象外です。
- EVSSL証明書への対応は予定していません(機会がないため)。おそらくUnicode対応が必須と思われ。
- 暗号化された秘密鍵のインポートは行えません。
- 秘密鍵の保存は暗号化されません。
ここまでできてたら予想できると思いますが以下の機能を実装していきたいです。
- 内部にHSM(Hardware Security Module)を持つようなアプライアンス機器のCSR生成(外部委託)する機能。
- CSRをACME(Automatic Certificate Management Environment)で署名する機能。
- その際、チャレンジタイプ(http-01, tls-sni-01 または dns-01)に対応したデプロイ方法の自由化(外部委託)。
- 証明書のデプロイする機能(外部委託)。
- 証明書有効期限、失効等の監査および報告する機能。
- 公開鍵をインポートする際にルートCAからのチェインをたどって問題なければインポートするようにする機能。
「0.YYYYMMDD」。将来内部フォーマットの仕様および更新ルールが確定したら、バージョン1に格上げする予定(いわゆる x.y フォーマット)。
証明書のユニーク性を確認するためのSPKI(Subject Public Key Info)ハッシュ値取得方法をHPKP仕様に改めました。 この結果、既存の証明書情報の照合ができなくなっています。 一旦すべての証明書を export して、新しい証明書リポジトリに import してください。
certmgr req
を certmgr generate
に改めました。
重村法克