Private CA

ご利用にあたって

自己署名ルート証明書を利用する簡易なCA(認証局)です。 個人のテスト用、あるいは互いに信頼がおくことができる小さい範囲での利用を想定しています。

通常の認証局では、CA証明書(ルート証明書)が各OSやブラウザにインストールされており、認証局で発行された証明書は信頼できるものとして利用することができます。

一方、自己署名認証局で発行される証明書を利用する場合、作成したルート証明書をOSやブラウザにインストールする必要があります。 一般に、信頼できない機関が発行したルート証明書をインストールする行為は、セキュリティリスクを高める行為です。 自分で作成したルート証明書を自己責任で自分が管理する環境にインストールする場合は、そこまでセキュリティリスクを高めるものとは思えません。 また、あなた(ルート証明書発行者)が信頼にたる人物であることを知っている範囲の方に、ルート証明書をインストールしてもらう行為は、あなたが責任をとれる場合には問題が起こることもないだろうと思います。

証明書の運用に必要な知識があることを前提としております。
利用者自身が責任を取ることができる範囲内でご利用ください。

規約

自己責任でご利用ください。

仕様

※ サーバ側に保存した内容は、ユーザからの求めがあってもお渡しすることはできません。法的機関の求めがない限り第三者にお渡しすることはありません。
サーバには各秘密鍵の情報も保存されます。管理には最大限の注意を払いますが、万が一漏洩した場合でも当方では一切責任を負わないものとします。

作成される証明書の仕様

CA証明書
Signature Algorithm: sha256WithRSAEncryption
Public-Key: RSA 4096 bit
10yrs
pem形式
中間証明書
Signature Algorithm: sha256WithRSAEncryption
Public-Key: RSA 4096 bit
5yrs
pem形式
証明書
Signature Algorithm: sha256WithRSAEncryption
Public-Key: RSA 2048 bit
1yrs
pem形式またはpkcs12形式

data の仕様

command (required)
newca | newinca | newcrt | revokecrt | revokeinca | revokeca のいずれか
newca
CA 証明書作成
newinca
中間 CA 証明書作成
newcrt
サーバ証明書またはクライアント証明書作成
revokecrt
サーバ証明書またはクライアント証明書無効化
revokeinca
中間 CA 証明書無効化
revokeca
サーバに保存している内容の削除
casbj (required)
CA 証明書のサブジェクト
incasbj (required except newca or revokeca)
中間CA 証明書のサブジェクト
crtsbj (required when newcrt or revokecrt)
証明書のサブジェクト
altnames (required whennewcrt
alternative names
Type
type of subject alternative name
dns | mail | ipv4address | ipv6address のいずれか
Values
list of subject alternative names
pkcs12 (required when newcrt / boolean)
作成する証明書を pkcs12 にするか pem 形式にするか。
pem 形式の時は false | pkcs12 形式の時は true
keyword (required except newca)
passphrase of ca private key

curl での実行例

所定の data を下記のような形で POST することで、証明書が作成されます。

curl 
  -s
  -X POST
  -H 'Content-Type: application/json'
  -d '{ data... }'
  https://privateca.techjunk.net/privateca

以下に具体例を記載します。

ルート証明書発行

ルート証明書を作成します。
作成した内容は画面に表示されるとともに、サーバ側にも保存されます。

次回以降の操作には、(1) data で指定した casbj の内容と、(2) response で得られた passphrase の内容が必要です。

data

{
  "command": "newca",
  "casbj": {CA のサブジェクト}
}

subject "/O=Test Account/CN=Root CA" の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

実行結果に含まれている情報を保存するため、必要に応じてファイルにリダイレクトしてください。

rsponse

{
  "message": {
    "cacrt": "ルートCA証明書の内容",
    "cakey": "ルートCA秘密鍵の内容",
    "passphrase": "ルートCA秘密鍵パスフレーズ",
    "response": 保存結果ステータスコード(正常時=200)
  }
}
実行結果を newca.json にリダイレクトした場合の、値の取り出し方。
passphrase
jq -r '.message.passphrase' newca.json | less
CA証明書
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の無効化、証明書の作成、無効化の操作には、CA証明書作成で得られた(1)、(2) の他に、(3) data で指定した incasbj の内容が必要です。

data

{
  "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

response

{
  "message": {
    "cacrt": "ルートCA証明書の内容",
    "incacrt": "中間CA証明書の内容",
    "incakey": "中間CA秘密鍵の内容",
    "passphrase": "中間CA秘密鍵パスフレーズ",
    "response": 保存結果ステータスコード(正常時=200)
  }
}
中間CA証明書の秘密鍵のパスフレーズ
jq -r '.message.passphrase' inca1.json | less
0f57553db03e3162223f242b1cef26b6
中間CA証明書
jq -r '.message.incacrt' inca1.json | tee inca1crt.pem | less
openssl x509 -in inca1crt.pem -noout -subject -issuer -dates -modulus
中間CA証明書の秘密鍵
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 の内容が必要です。

data

{
  "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

response

{
  "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

response

証明書の秘密鍵のパスフレーズ(p12のパスワードも同一)
jq -r '.message.passphrase' crt1-2.json | less
79282924876c4a768263ee7105d0e4dc
証明書(p12形式)
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を発行します。

data

{
  "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

response

{
  "message": {
    "crl": "証明書失効リストの内容",
    "response": 保存結果ステータスコード(正常時=200)
  }
}
証明書失効リスト(中間CAが署名)
jq -r '.message.crl' revoke1-2.json | tee revoke1-2.crl | less
openssl crl -in revoke1-2.crl -text -noout | less

中間CA証明書失効

中間CA証明書を失効し、CRLを発行します。

data

{
  "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

response

{
  "message": {
    "incacrl": "証明書失効リストの内容",
    "response": 保存結果ステータスコード(正常時=200)
  }
}
証明書失効リスト(ルートCAが署名)
jq -r '.message.incacrl' revoke1.json | tee revoke1.crl | less
openssl crl -in revoke1.crl -text -noout | less

CA証明書失効

サーバで保存されている情報を削除します。

data

{
  "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

response

{
  "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

CRLのテスト

接続テスト

サーバ起動
$ 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