opensslでオレオレ認証局(プライベートCA)で自己署名クライアント証明書を対話入力無しで一括作成したい
仕事でプライベート環境で使用するクライアント証明書を大量に発行する必要があり、調べたので誰かの役に立てば。
opensslはデフォルトが対話式の入力を受け付けるようになってるのですが、一度に大量に発行するときは一々やってられません。
最初は面倒だからネットで探せるかなと思っていたもののすぐに見つけらなかったのでopensslの公式ドキュメントみながらシェルスクリプトを書きました。単に自分の検索能力が低いだけかも。
以下認証局構築済み、クライアント証明書発行用にopenssl.cnfが設定されているものとします(RSAのビット数とか署名のハッシュ関数についても)。変数部分は適当です。
クライアント証明書の秘密鍵&署名要求作成
-passout pass:${CERTPASS}でクライアント証明書の秘密鍵のパスフレーズ、-subjで証明書情報を与えます。:-の後ろには変数が空だったときに入れたいデフォルト値を入れてやります。例えばC=${C:-JP}とか。-daysも適当に。
はじめはopenssl.cnfの[req]にno prompt入れてやろうとしたけど、-subjオプションでやったほうが楽なことに気づく。ちなみにno promptにした場合、openssl.cnfの[req_distinguished_name]ブロックはC,ST,L,O,OU,CNにする必要があります。しないとエラーが出ます。
署名要求に対して署名する
-batchオプションで署名しますかの対話入力をスキップ。-key ${CAPASS}で認証局の秘密鍵のパスフレーズをプリセット。
デバイス配布用にpkcs12(p12)形式にまとめる
-passin pass:${CERTPASS}で証明書の秘密鍵パスフレーズを、-passout pass:${EXPOPASS}でデバイスインストール時のパスフレーズを入力することで対話をスキップ。
一括発行は適当に証明書情報とパスフレーズのCSVつくって一行づつ変数に入れてループまわして発行みたいな感じです。
https://github.com/maro9/client-certificate/blob/master/issueCerts.sh
LDAPと連携でもいけると思います