opensslでオレオレ認証局(プライベートCA)で自己署名クライアント証明書を対話入力無しで一括作成したい

仕事でプライベート環境で使用するクライアント証明書を大量に発行する必要があり、調べたので誰かの役に立てば。

 opensslはデフォルトが対話式の入力を受け付けるようになってるのですが、一度に大量に発行するときは一々やってられません。

 最初は面倒だからネットで探せるかなと思っていたもののすぐに見つけらなかったのでopensslの公式ドキュメントみながらシェルスクリプトを書きました。単に自分の検索能力が低いだけかも。

 以下認証局構築済み、クライアント証明書発行用にopenssl.cnfが設定されているものとします(RSAのビット数とか署名のハッシュ関数についても)。変数部分は適当です。

 

クライアント証明書の秘密鍵&署名要求作成

/usr/bin/openssl req -config ./openssl.cnf -new -keyout newkey.pem -out newreq.pem -days 365 -passout pass:${CERTPASS} \
-subj "/C=${C:-}/ST=${ST:-}/L=${L:-}/O=${O:-}/OU=${OU:-}/CN=${CN:-}" || exit 1

-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にする必要があります。しないとエラーが出ます。

  

署名要求に対して署名する 

/usr/bin/openssl ca -batch -key ${CAPASS} -config ./openssl.cnf -policy policy_anything -out newcert.pem -infiles newreq.pem || exit 1

-batchオプションで署名しますかの対話入力をスキップ。-key ${CAPASS}で認証局秘密鍵パスフレーズをプリセット。

 

デバイス配布用にpkcs12(p12)形式にまとめる

/bin/cat newkey.pem newcert.pem | /usr/bin/openssl pkcs12 -passin pass:${CERTPASS} -passout pass:${EXPOPASS} -export -out newcert.p12 || exit 1

-passin pass:${CERTPASS}で証明書の秘密鍵パスフレーズを、-passout pass:${EXPOPASS}でデバイスインストール時のパスフレーズを入力することで対話をスキップ。

 

一括発行は適当に証明書情報とパスフレーズCSVつくって一行づつ変数に入れてループまわして発行みたいな感じです。

https://github.com/maro9/client-certificate/blob/master/issueCerts.sh

 

LDAPと連携でもいけると思います