自己署名ルート証明書を利用する簡易なCA(認証局)です。 個人のテスト用、あるいは互いに信頼がおくことができる小さい範囲での利用を想定しています。
通常の認証局では、CA証明書(ルート証明書)が各OSやブラウザにインストールされており、認証局で発行された証明書は信頼できるものとして利用することができます。
一方、自己署名認証局で発行される証明書を利用する場合、作成したルート証明書をOSやブラウザにインストールする必要があります。 一般に、信頼できない機関が発行したルート証明書をインストールする行為は、セキュリティリスクを高める行為です。 自分で作成したルート証明書を自己責任で自分が管理する環境にインストールする場合は、そこまでセキュリティリスクを高めるものとは思えません。 また、あなた(ルート証明書発行者)が信頼にたる人物であることを知っている範囲の方に、ルート証明書をインストールしてもらう行為は、あなたが責任をとれる場合には問題が起こることもないだろうと思います。
証明書の運用に必要な知識があることを前提としております。
利用者自身が責任を取ることができる範囲内でご利用ください。
自己責任でご利用ください。
※ サーバ側に保存した内容は、ユーザからの求めがあってもお渡しすることはできません。法的機関の求めがない限り第三者にお渡しすることはありません。
サーバには各秘密鍵の情報も保存されます。管理には最大限の注意を払いますが、万が一漏洩した場合でも当方では一切責任を負わないものとします。
所定の data を下記のような形で POST することで、証明書が作成されます。
curl -s -X POST -H 'Content-Type: application/json' -d '{ data... }' https://privateca.techjunk.net/privateca
以下に具体例を記載します。
ルート証明書を作成します。
作成した内容は画面に表示されるとともに、サーバ側にも保存されます。
次回以降の操作には、(1) data で指定した casbj の内容と、(2) response で得られた passphrase の内容が必要です。
{ "command": "newca", "casbj": {CA のサブジェクト} }
curl -s -X POST -H "Content-Type: application/json" -d '{"command":"newca","casbj":{"O":"Test Account","CN":"Root CA"}}' https://privateca.techjunk.net/privateca > newca.json
実行結果に含まれている情報を保存するため、必要に応じてファイルにリダイレクトしてください。
{ "message": { "cacrt": "ルートCA証明書の内容", "cakey": "ルートCA秘密鍵の内容", "passphrase": "ルートCA秘密鍵パスフレーズ", "response": 保存結果ステータスコード(正常時=200) } }実行結果を newca.json にリダイレクトした場合の、値の取り出し方。
jq -r '.message.passphrase' newca.json | less
jq -r '.message.cacrt' newca.json | tee cacrt.pem | less openssl x509 -in cacrt.pem -noout -subject -issuer -dates -modulus
jq -r '.message.cakey' newca.json | tee cakey.pem | less openssl rsa -in cakey.pem -noout -modulus chmod 600 cakey.pem cacrt.json
中間CAを作成します。
中間CAの無効化、証明書の作成、無効化の操作には、CA証明書作成で得られた(1)、(2) の他に、(3) data で指定した incasbj の内容が必要です。
{ "command": "newinca", "casbj": {(1) casbj の内容}, "incasbj": {中間CA のサブジェクト}, "keyword": "(2) passphrase の内容" }
subject "/O=Test Account/CN=IN CA 1" の中間CAを作成する
curl -s -X POST -H "Content-Type: application/json" -d '{"command":"newinca","casbj":{"O":"Test Account","CN":"Root CA"},"incasbj":{"O":"Test Account", "CN":"IN CA 1"}, "keyword":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}' https://privateca.techjunk.net/privateca
{ "message": { "cacrt": "ルートCA証明書の内容", "incacrt": "中間CA証明書の内容", "incakey": "中間CA秘密鍵の内容", "passphrase": "中間CA秘密鍵パスフレーズ", "response": 保存結果ステータスコード(正常時=200) } }
jq -r '.message.passphrase' inca1.json | less 0f57553db03e3162223f242b1cef26b6
jq -r '.message.incacrt' inca1.json | tee inca1crt.pem | less openssl x509 -in inca1crt.pem -noout -subject -issuer -dates -modulus
jq -r '.message.incakey' inca1.json | tee inca1key.pem | less openssl rsa -in inca1key.pem -noout -modulus chmod 600 inca1key.pem inca1.json
サーバ証明書を作成します。
証明書の無効化の操作には、CA証明書作成で得られた(1)、(2) 、中間CA証明書作成で得られた (3) の他に、(4) data で指定した crtsbj の内容が必要です。
{ "command": "newcrt", "casbj": { (1) casbj の内容 }, "incasbj": { (3) incasbj の内容 }, "crtsbj": { 作成する証明書のサブジェクト }, "altnames": { "Type": "alternative names として指定する値のタイプ", "Values": [ alternative names の値のリスト ] }, "pkcs12": false "keyword": "(2) passphrase の内容" }
subject "/O=Test Account/CN=example.com"
alternative name "DNS:www.example.com, DNS:www.example.co.jp"
の証明書(pem)を作成する。
curl -X POST -H "Content-Type: application/json" -d '{"command":"newcrt","casbj":{"O":"Test Account","CN":"Root CA"},"incasbj":{"O":"Test Account", "CN":"IN CA 1"},"crtsbj":{"O":"Test Account","CN":"example.com"},"altnames":{"Type":"dns", "Values":["www.example.com","www.example.co.jp"]},"pkcs12":false, "keyword":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}' https://privateca.techjunk.net/privateca
{ "message": { "incacrt": "中間CA証明書の内容", "crt": "証明書の内容(p12の時はbase64エンコードした内容)", "key": "秘密鍵の内容", "passphrase": "秘密鍵パスフレーズ", "response": 保存結果ステータスコード(正常時=200) } }
jq -r '.message.passphrase' crt1-1.json | less 7ec89fae46406986213683b2b081a491
jq -r '.message.crt' crt1-1.json | tee crt1-1.pem | less openssl x509 -in crt1-1.pem -noout -subject -issuer -dates -modulus
jq -r '.message.key' crt1-1.json | tee key1-1.pem | less openssl rsa -in key1-1.pem -noout -modulus chmod 600 key1-1.pem crt1-1.json
subject /O=Test Account/CN=example.org alternative name [ipv4address] 192.168.1.1 [ipv4address] 192.168.2.1 pkcs12 形式
subject "/O=Test Account/CN=example.org"
alternative names "ipv4address:192.168.1.1, ipv4address:192.168.2.1"
の証明書(pkcs12)を作成する。
curl -X POST -H "Content-Type: application/json" -d '{"command":"newcrt","casbj":{"O":"Test Account","CN":"Root CA"},"incasbj":{"O":"Test Account", "CN":"IN CA 1"},"crtsbj":{"O":"Test Account","CN":"example.org"},"altnames":{"Type":"ipv4address", "Values":["192.168.1.1","192.168.2.1"]},"pkcs12":true, "keyword":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}' https://privateca.techjunk.net/privateca
jq -r '.message.passphrase' crt1-2.json | less 79282924876c4a768263ee7105d0e4dc
jq -r '.message.p12base64' crt1-2.json | base64 -d > crt1-2.p12 openssl pkcs12 -in crt1-2.p12 | less chmod 600 crt1-2.p12 crt1-2.json
証明書を失効し、CRLを発行します。
{ "command": "revokecrt", "casbj": { (1) casbj の内容 }, "incasbj": { (3) incasbj の内容 }, "crtsbj": { (4) crtsbj の内容 }, "keyword": "(2) passphrase の内容" }
subject "/O=Test Account/CN=example.org" の証明書を失効する。
curl -s -X POST -H "Content-Type: application/json" -d '{"command":"revokecrt","casbj":{"O":"Test Account","CN":"Root CA"},"incasbj":{"O":"Test Account", "CN":"IN CA 1"},"crtsbj":{"O":"Test Account","CN":"example.org"},"keyword":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}' https://privateca.techjunk.net/privateca
{ "message": { "crl": "証明書失効リストの内容", "response": 保存結果ステータスコード(正常時=200) } }
jq -r '.message.crl' revoke1-2.json | tee revoke1-2.crl | less openssl crl -in revoke1-2.crl -text -noout | less
中間CA証明書を失効し、CRLを発行します。
{ "command": "revokeinca", "casbj": { (1) casbj の内容 }, "incasbj": { (3) incasbj の内容 }, "keyword": "(2) passphrase の内容" }
subject "/O=Test Account/CN=IN CA 1" の中間CA証明書を失効する
curl -s -X POST -H "Content-Type: application/json" -d '{"command":"revokeinca","casbj":{"O":"Test Account","CN":"Root CA"},"incasbj":{"O":"Test Account", "CN":"IN CA 1"}, "keyword":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}' https://privateca.techjunk.net/privateca
{ "message": { "incacrl": "証明書失効リストの内容", "response": 保存結果ステータスコード(正常時=200) } }
jq -r '.message.incacrl' revoke1.json | tee revoke1.crl | less openssl crl -in revoke1.crl -text -noout | less
サーバで保存されている情報を削除します。
{ "command": "revokeca", "casbj": { (1) casbj の内容 }, "keyword": "(2) passphrase の内容" }
subject "/O=Test Account/CN=Root CA" のCA証明書に関する全ての情報をサーバ側から削除する。
curl -X POST -H "Content-Type: application/json" -d '{"command":"revokeca","casbj":{"O":"Test Account","CN":"Root CA"}, "keyword":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}' https://privateca.techjunk.net/privateca
{ "message": { "comment": "Thank you for using our service", "response": 削除結果ステータスコード(正常時=200) } }
$ cat cacrt.pem inca1crt.pem > concatca.pem $ openssl verify -purpose sslserver -CAfile concatca.pem crt1-1.pem
$ openssl s_server -CAfile inca1crt.pem -cert crt1-1.pem -key key1-1.pem
$ openssl s_client -connect localhost:4433 -CAfile cacrt.pem
$ cat cacrt.pem inca1crt.pem > concatca.pem $ openssl verify -purpose sslclient -CAfile concatca.pem crt1-2.pem
$ openssl s_server -CAfile concatca.pem -cert crt1-1.pem -key key1-1.pem -Verify 1
$ openssl pkcs12 -in crt1-2.p12 -out crt1-2.pem -clcerts -nokeys $ openssl pkcs12 -in crt1-2.p12 -out key1-2.pem -nocerts $ openssl s_client -connect localhost:4433 -CAfile cacrt.pem -cert crt1-2.pem -key key1-2.pem
$ cat cacrt.pem inca1crt.pem revoke1-2.crl > concatca.pem $ openssl s_server -CAfile concatca.pem -cert crt1-1.pem -key key1-1.pem -Verify 1 -crl_check_all
$ openssl s_client -connect localhost:4433 -CAfile cacrt.pem -cert crt1-2.pem -key key1-2.pem