努力したWiki

推敲の足りないメモ書き多数

ユーザ用ツール

サイト用ツール


サイドバー

メニュー

インデックス

documents:other:other-045

opensslでオレオレ認証局を開局して証明書を発行する

2017/04/15
証明書の期限が来て作り直しした際に気づいた間違い等々を修正

2016/04/12
opensslで自己認証局を作る自分用メモ。

環境は FreeBSD 10.2 x86-64環境。pkgまたはportsからopenssl導入済みなのが前提。

証明書の中身って何?

  • 証明書は、申請者の公開鍵と認証局の電子署名のペア。
  • 電子署名は、申請者の署名要求を認証局の署名鍵で署名処理したデータ。
  • 署名要求は、申請者の秘密鍵から生成した公開鍵と申請者を識別する情報のペア。

証明書の電子署名は、認証局の証明書に含まれる検証鍵(認証局の署名鍵から生成した公開鍵)で検証できる。
認証局は、認証局の証明書を公開する。

参照サイト

電子署名は三つのフェーズからなります. 鍵生成, 署名, 検証です.
鍵生成フェーズでは署名に使う鍵と検証に使う鍵を作ります. ここでは署名に使う鍵を署名鍵, 検証に使う鍵を検証鍵と呼ぶことにします. 公開鍵/秘密鍵という言い方や, 暗号化鍵/復号鍵という言い方は避けましょう. これが混乱の元です.
署名フェーズでは署名鍵を持った署名者が文書に対して署名を行います.
検証フェーズでは検証者が検証鍵, 文書, 署名の3つに対して検証を行います.

なお, 公開鍵暗号方式を利用した署名と言った場合には, 鍵生成が暗号方式の鍵生成と共通であることが多いです. 署名方式の署名鍵と暗号方式の復号鍵が対応し, 署名方式の検証鍵と暗号方式の暗号化鍵が対応します.

186 @ hatenablog 暗号と署名の話より引用

開局の準備

生成するファイル

ファイル 説明
/etc/ssl/CA/private/cacert.key オレオレ認証局の署名鍵。流出したら駄目なやつ。
/etc/ssl/CA/cacert.cert オレオレ認証局の証明書。
/etc/ssl/CA/cacert.pem オレオレ認証局の署名鍵と証明書の結合ファイル。流出したら駄目なやつ。
/etc/ssl/CA/cacert.der オレオレ認証局の証明書を配布したい時の形式。
ブラウザにルートCA証明書として入れておきたい時などに。
とりあえず保持ファイル 説明
/etc/ssl/CA/private/cacert.withpass.key オレオレ認証局の署名鍵パスフレーズ付き。流出したら駄目なやつ。
使用後は消すファイル 説明
/etc/ssl/CA/cacert.csr オレオレ認証局の署名要求。

ディレクトリと初期ファイル作成

認証局 CA を開局するので /etc/ssl 以下に CA ディレクトリを作りそこに初期フォルダ、ファイルを配置。

root@hiroko:/etc/ssl # mkdir CA
root@hiroko:/etc/ssl/CA # cd CA
root@hiroko:/etc/ssl/CA # mkdir certs
root@hiroko:/etc/ssl/CA # mkdir crl        ←失効した証明書のリストがここに。
root@hiroko:/etc/ssl/CA # mkdir newcerts   ←署名した証明書のコピーが入る。証明書の失効処理でこれを使う。
root@hiroko:/etc/ssl/CA # mkdir private    ←ここの認証局の署名鍵をしまっておくよ!
root@hiroko:/etc/ssl/CA # touch index.txt
root@hiroko:/etc/ssl/CA # echo 01 > serial
root@hiroko:/etc/ssl/CA #

次に /etc/ssl/openssl.cnf を編集。編集個所は以下。適宜自分の環境様にカスタマイズする。

セクション キー 値(変更後)
[ CA_default ] dir /etc/ssl/CA
private_key $dir/private/cacert.key
[ req ] default_bits 2048
[ req_distinguished_name ] countryName_default JP
stateOrProvinceName_default hgotoh
localityName hgotoh
0.organizationName_default noname
organizationalUnitName_default noname
  ####################################################################
  [ CA_default ]

! dir           = /etc/ssl/CA           # Where everything is kept
  certs         = $dir/certs            # Where the issued certs are kept
  crl_dir               = $dir/crl              # Where the issued crl are kept
  database      = $dir/index.txt        # database index file.

:
:

! private_key   = $dir/private/cacert.key # The private key

  ####################################################################
  [ req ]
! default_bits          = 2048
  default_keyfile       = privkey.pem

:
:

  [ req_distinguished_name ]
  countryName                   = Country Name (2 letter code)
! countryName_default           = JP
  countryName_min                       = 2
  countryName_max                       = 2

  stateOrProvinceName           = State or Province Name (full name)
! stateOrProvinceName_default   = hgotoh

! localityName                  = hgotoh

  0.organizationName            = Organization Name (eg, company)
! 0.organizationName_default    = noname

  organizationalUnitName                = Organizational Unit Name (eg, section)
! organizationalUnitName_default        = noname

署名鍵を作る

認証局の署名鍵 /etc/ssl/CA/private/cacert.key を作成する。

root@hiroko:/etc/ssl/ # cd CA
root@hiroko:/etc/ssl/CA # openssl genrsa -aes256 -out private/cacert.key  2048
Generating RSA private key, 2048 bit long modulus
................................................................................................................................................+++
..................................+++
e is 65537 (0x10001)
Enter pass phrase for private/cacert.key:              ←パスフレーズ入力
Verifying - Enter pass phrase for private/cacert.key:              ←再度パスフレーズ入力
root@hiroko:/etc/ssl/CA #

署名要求を作る

認証局の署名要求 /etc/ssl/CA/cacert.csr を作成する。

root@hiroko:/etc/ssl/CA # openssl req -new -key private/cacert.key -out cacert.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]:              ←そのまま改行
State or Province Name (full name) [hgotoh]:              ←そのまま改行
hgotoh []:              ←そのまま改行
Organization Name (eg, company) [noname]:              ←そのまま改行
Organizational Unit Name (eg, section) [noname]:              ←そのまま改行
Common Name (e.g. server FQDN or YOUR name) []:ca.hgotoh.jp     ←Common Nameは必須。ここでは認証局サーバのFQDN ca.hgotoh.jp を指定。
Email Address []:caadmin@hgotoh.jp              ←メールアドレス

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:              ←そのまま改行。入力しない。
An optional company name []:              ←そのまま改行。入力しない。
root@hiroko:/etc/ssl/CA #

自分で署名して証明書を作る

自分の署名要求に対して自分の署名鍵で電子署名を実施し証明書 /etc/ssl/CA/cacert.cert を作る。この例だと10年(3650日)有効な証明書が出来上がる。

root@hiroko:/etc/ssl/CA # openssl x509 -in cacert.csr -days 3650 -req -signkey private/cacert.key -out cacert.cert
Signature ok
subject=/C=JP/ST=hgotoh/O=noname/OU=noname/CN=ca.hgotoh.jp/emailAddress=caadmin@hgotoh.jp
Getting Private key
root@hiroko:/etc/ssl/CA #

※自分の署名要求 cacert.csr に対して自分の署名鍵 cacert.key で署名を行っている。本来は外部の認証局に署名要求を送って、その認証局の署名鍵で署名するのね。

必要なら署名鍵と証明書の結合ファイル /etc/ssl/CA/cacert.pem を作成。

root@hiroko:/etc/ssl/CA # mv private/cacert.key private/cacert.withpass.key
root@hiroko:/etc/ssl/CA # openssl rsa -in private/cacert.withpass.key -out private/cacert.key
Enter pass phrase for private/cacert.withpass.key:              ←パスフレーズ入力
writing RSA key
root@hiroko:/etc/ssl/CA # cat private/cacert.key cacert.cert > cacert.pem
root@hiroko:/etc/ssl/CA #

必要なら認証局の証明書を配布するために /etc/ssl/CA/cacert.der を作成。

root@hiroko:/etc/ssl/CA # openssl x509 -inform pem -in cacert.pem -outform der -out cacert.der
root@hiroko:/etc/ssl/CA #

or

root@hiroko:/etc/ssl/CA # openssl x509 -inform pem -in cacert.cert -outform der -out cacert.der
root@hiroko:/etc/ssl/CA #

どちらでも同じファイルが作成される。 証明書発行する用意ができ、開局できる。

サーバ証明書発行

メールサーバ mail.hgotoh.jp の証明書を発行してみる。

ファイル 説明
imapserver.key サーバの秘密鍵。流出したら駄目な奴。
imapserver.cert オレオレ認証局の電子署名入りサーバ証明書。
imapserver.pem サーバ秘密鍵とサーバ証明書の結合ファイル。流出しちゃダメなやつ。
とりあえず保持ファイル 説明
imapserver.withpass.key サーバの秘密鍵パスフレーズ付き。流出したら駄目な奴。
使用後は消しとけファイル 説明
imapserver.csr サーバの署名要求。

署名要求のCommon Nameで指定したFQDNと、実際にこのサーバ証明書を使うサーバのURLが不一致だったりするとエラーになっちゃう。
サーバ証明書はそのサーバでしか使えないものなので、よそのサーバに持って行ったら駄目よ。

サーバの秘密鍵と署名要求を作る

サーバ mail.hgotoh.jp の秘密鍵 imapserver.key を作る。

root@amane:/etc/ssl/imap # openssl genrsa -aes256 -out imapserver.key 2048
Generating RSA private key, 2048 bit long modulus
.......................................+++
......................+++
e is 65537 (0x10001)
Enter pass phrase for imapserver.key:              ←パスフレーズ入力
Verifying - Enter pass phrase for imapserver.key:              ←パスフレーズ入力
root@amane:/etc/ssl/imap #

サーバ mail.hgotoh.jp のサーバ証明書の署名要求 imapserver.csr を作る。

root@amane:/etc/ssl/imap # openssl req -new -key imapserver.key -out imapserver.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]:              ←認証局のものに合わせる
State or Province Name (full name) [hgotoh]:              ←認証局のものに合わせる
hgotoh []:              ←認証局のものに合わせる
Organization Name (eg, company) [noname]:              ←認証局のものに合わせる
Organizational Unit Name (eg, section) [noname]:              ←認証局のものに合わせる
Common Name (e.g. server FQDN or YOUR name) []:mail.hgotoh.jp   ←Common Nameは必須。証明書を配置するサーバのFQDN mail.hgotoh.jp を指定。
Email Address []:imapadmin@hgotoh.jp              ←メールアドレス

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:              ←そのまま改行。入力しない。
An optional company name []:              ←そのまま改行。入力しない。
root@amane:/etc/ssl/imap #

認証局で署名する

認証局に送られてきたサーバの署名要求 /etc/ssl/tmp/imapserver.csr を処理してサーバ証明書 /etc/ssl/tmp/imapserver.cert を作る。 特に指定しないとデフォルトの1年が有効期間となる。

root@hiroko:/etc/ssl/ # openssl ca -config /etc/ssl/openssl.cnf -policy policy_anything -in /etc/ssl/tmp/imapserver.csr -out /etc/ssl/tmp/imapserver.cert
Using configuration from /etc/ssl/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 4 (0x4)
        Validity
            Not Before: Apr 10 20:17:27 2016 GMT
            Not After : Apr 10 20:17:27 2017 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = hgotoh
            organizationName          = noname
            organizationalUnitName    = noname
            commonName                = mail.hgotoh.jp
            emailAddress              = imapadmin@hgotoh.jp
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
            X509v3 Authority Key Identifier:
                DirName:/C=JP/ST=hgotoh/O=noname/OU=noname/CN=ca.hgotoh.jp/emailAddress=caadmin@hgotoh.jp
                serial:xx:xx:xx:xx:xx:xx:xx:xx

Certificate is to be certified until Apr 10 20:17:27 2017 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
root@hiroko:/etc/ssl/ #

出来上がったサーバ証明書 /etc/ssl/tmp/imapserver.cert をサーバに送る。

認証局で署名された証明書をサーバに配置する

必要ならパスフレーズを消したサーバの秘密鍵 imapserver.key とサーバ証明書 imapserver.cert の結合ファイル imapserver.pem を作成。

root@amane:/etc/ssl/imap # mv imapserver.key imapserver.withpass.key
root@amane:/etc/ssl/imap # openssl rsa -in imapserver.withpass.key -out imapserver.key
Enter pass phrase for imapserver.withpass.key:              ←パスフレーズ入力
writing RSA key
root@amane:/etc/ssl/imap # cat imapserver.key imapserver.cert > imapserver.pem
root@amane:/etc/ssl/imap #

サーバの秘密鍵は流出しちゃいけないものなので、imapserver.key、imapserver.pem は配布しちゃだめよ。
imapserver.pem については、証明書と秘密鍵を一つにまとめた形式を入力とするサーバプログラムがあってそれのために作成する。たとえば apache、courier-imap、とか。

クライアント証明書発行

メールサーバアクセスで使うクライアント証明書を発行する。

ファイル 説明
imapclient.key クライアントの秘密鍵。流出注意なやつ。
imapclient.cert オレオレ認証局の電子署名入りクライアント証明書。
imapclient.pem クライアント証明書と認証局証明書の結合ファイル。流出注意な奴。
imapclient.p12 imapclient.pemをPKCS12形式にしたもの。流出注意な奴。
とりあえず保持ファイル 説明
imapclient.withpass.key クライアントの秘密鍵パスフレーズ付き。流出注意な奴。
使用後は消しとけファイル 説明
imapclient.csr クライアントの署名要求。

クライアントの秘密鍵は流出しちゃいけない。 同じ証明書をサブPCでも使いたい、とかになるとimapclient.pemをPKCS12形式で持ち出す事になる。もちろんサブPC外に流出したらアウトなのでよく考えて。

サブPC用にクライアント証明書を作ればサブPCから流出があってもサブPCの範囲で影響はクローズするから、可能ならクライアント毎に作った方がいいかもね。

クライアント証明書って具体的に何さ?

クライアント証明書はもう少し突っ込むと、ユーザ証明書とかコンピュータ証明書とかに分かれる。 ここで説明するクライアント証明書を Thunderbirdの証明書マネージャからインポートしてみると、

  • あなたの証明書
  • 認証局証明書

にインポートがされている。 imapclient.cert が‟あなたの証明書”で有効になっているみたい。 cacert.cert が‟認証局証明書”で有効になっているみたい。

…ユーザ証明書ってことでいいのかな?

クライアントの秘密鍵と署名要求を作る

クライアント h.kuma の秘密鍵 imapclient.key を作る。

$ openssl genrsa -aes256 -out imapclient.key 2048
Generating RSA private key, 2048 bit long modulus
.............................+++
.........................................................+++
e is 65537 (0x10001)
Enter pass phrase for imapclient.key:              ←パスフレーズ入力
Verifying - Enter pass phrase for imapclient.key:              ←パスフレーズ入力
$

クライアント h.kuma の署名要求 imapclient.csr を作る。

$ openssl req -new -key imapclient.key -out imapclient.csr
Enter pass phrase for imapclient.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP              ←認証局のものに合わせる
State or Province Name (full name) [Some-State]:hgotoh              ←認証局のものに合わせる
Locality Name (eg, city) []:hgotoh              ←認証局のものに合わせる
Organization Name (eg, company) [Internet Widgits Pty Ltd]:noname              ←認証局のものに合わせる
Organizational Unit Name (eg, section) []:noname              ←認証局のものに合わせる
Common Name (e.g. server FQDN or YOUR name) []:h.kuma              ←Common Nameは必須。ここでは自分の名前を指定。
Email Address []:h.kuma@hgotoh.jp              ←メールアドレス


Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:              ←そのまま改行。入力しない。
An optional company name []:              ←そのまま改行。入力しない。
$

認証局で署名する

認証局に送られてきたクライアント h.kuma の署名要求 /etc/ssl/tmp/imapclient.csr を処理してクライアント証明書 /etc/ssl/tmp/imapclient.cert を作る。 特に指定しないとデフォルトの1年が有効期間となる。

root@hiroko:/etc/ssl # openssl ca -config /etc/ssl/openssl.cnf -policy policy_anything -in /etc/ssl/tmp/imapclient.csr -out /etc/ssl/tmp/imapclient.cert
Using configuration from /etc/ssl/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 5 (0x5)
        Validity
            Not Before: Apr 10 19:35:39 2016 GMT
            Not After : Apr 10 19:35:39 2017 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = hgotoh
            organizationName          = noname
            organizationalUnitName    = noname
            commonName                = h.kuma
            emailAddress              = h.kuma@hgotoh.jp
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
            X509v3 Authority Key Identifier:
                DirName:/C=JP/ST=hgotoh/O=noname/OU=noname/CN=ca.hgotoh.jp/emailAddress=caadmin@hgotoh.jp
                serial:xx:xx:xx:xx:xx:xx:xx:xx

Certificate is to be certified until Apr 10 19:35:39 2017 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
root@hiroko:/etc/ssl #

出来上がったクライアント証明書 /etc/ssl/tmp/imapclient.cert をクライアントに送る。

認証局で署名された証明書を配布可能にする

必要ならパスフレーズを消したクライアントの秘密鍵 imapclient.key を作る。

$ mv imapclient.key imapclient.withpass.key
$ openssl rsa -in imapclient.withpass.key -out imapclient.key
Enter pass phrase for imapclient.withpass.key:              ←パスフレーズ入力
writing RSA key
$

必要ならクライアントの秘密鍵 imapclient.key と クライアント証明書 imapclient.cert の結合ファイル imapclient.pem を作る。

$ cat imapclient.key imapclient.cert > imapclient.pem     ←imapclient.certは認証局証明書!
$

必要ならPKCS12形式の配布ファイル imapclient.p12 を作成する。

$ openssl pkcs12 -export -in imapclient.pem -out imapclient.p12 -name "kuma's key"
Enter Export Password:              ←配布時に問われる"kuma's key"に対するパスワードを入力。パスフレーズじゃないよ。
Verifying - Enter Export Password:              ←配布時に問われる"kuma's key"に対するパスワードを入力。パスフレーズじゃないよ。
$

imapclient.p12 はメールクライアントなどに証明書をインポートする際使用する。

documents/other/other-045.txt · 最終更新: 2017/04/15 02:51 by k896951