かえでBlog

色々なことを徒然と……

【OpenSSL】ルートCA、中間CAの構築

   

opensslにてCA認証局の構築メモ

Opensslのインストール・CA下回り設定

Opensslがないと何もできないのでyumからインストール

yum install openssl

 

openssl.cnfの設定

vim /etc/pki/tls/openssl.cnf

 

42行目あたりdirを修正

・
・
・
[ CA_default ]

#dir             = /etc/pki/CA           # Where everything is kept
dir             = /etc/pki/KaedeRootCA           # 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.
#unique_subject = no                    # Set to 'no' to allow creation of
・
・
・

 

dirで指定したパス先に各ディレクトリを作成します。
privateは秘密鍵を置く為root以外のアクセスできないようにしたほうがいいです。

#証明書検証用ディレクトリ
mkdir -p /etc/pki/KaedeRootCA/certs

#CA秘密鍵保存ディレクトリ
mkdir -p /etc/pki/KaedeRootCA/private

#失効リスト保存ディレクトリ
mkdir -p /etc/pki/KaedeRootCA/crl

#署名された証明書保存ディレクトリ
mkdir -p /etc/pki/KaedeRootCA/newcerts

#root以外のアクセス不可
chmod 700 /etc/pki/KaedeRootCA/private

 

CAが署名する際に必要なシリアル番号ファイルを作成します。
シリアル値の初期値として01を入れます。

echo 01 > /etc/pki/KaedeRootCA/serial

 

CAのデータベースであるindex.txtを作成します。

touch /etc/pki/KaedeRootCA/index.txt

rootCA(ルート認証局)構築

自己署名がされている証明書と秘密鍵を作成します。

※Common NameはCA単位で一意でないと不具合が発生する場合があるため作成時は重複しないよう慎重に

#x509形式 RSA暗号(2048bit) 有効期間10年(3650日)で作成
openssl req -new -x509 -newkey rsa:2048  -out cacert.pem -days 3650 -keyout /etc/pki/KaedeRootCA/private/cakey.pem


Generating a 2048 bit RSA private key
............................+++
............+++
writing new private key to '/etc/pki/KaedeRootCA/private/cakey.pem'
Enter PEM pass phrase:#好きなパスワード
Verifying - Enter PEM pass phrase:#パスワード再入力
-----
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) [XX]:JP #国コード
State or Province Name (full name) []:Osaka #都道府県
Locality Name (eg, city) [Default City]:Osaka #市区町村
Organization Name (eg, company) [Default Company Ltd]:Kaede #会社名または組織名
Organizational Unit Name (eg, section) []:pki #部署名等
Common Name (eg, your name or your server's hostname) []:root.ca.kaede.jp #名前(ホスト名やPC名等…重複不可) 
Email Address []:#メールアドレス

 

cacert.pemとcakey.pemを作成されたか確認します。cakey.pemは秘密鍵の為root以外のアクセスを禁止にします。

  ll /etc/pki/KaedeRootCA/cacert.pem #自己署名付CA証明書
  -rw-r--r--. 1 root root 1318  7月  5 01:36 2015 /etc/pki/KaedeRootCA/cacert.pem
  
  ll /etc/pki/KaedeRootCA/private/cakey.pem #CA証明書の秘密鍵
  -rw-r--r--. 1 root root 1834  7月  5 01:36 2015 /etc/pki/KaedeRootCA/private/cakey.pem
  
  chmod 600 /etc/pki/KaedeRootCA/private/cakey.pem #rootのみアクセス許可
  ll /etc/pki/KaedeRootCA/private/cakey.pem
  -rw-------. 1 root root 1834  7月  5 01:36 2015 /etc/pki/KaedeRootCA/private/cakey.pem
  

 

CA情報の確認

openssl x509 -text -noout -in /etc/pki/KaedeRootCA/cacert.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:  xxxxxxxxxx(xxxxxxxxxxxxxxxxxx)
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=JP, ST=Osaka, L=Osaka, O=Kaede, OU=pki, CN=root.ca.kaede.jp
        Validity
            Not Before: Jul  4 16:36:02 2015 GMT
            Not After : Jul  1 16:36:02 2025 GMT
        Subject: C=JP, ST=Osaka, L=Osaka, O=Kaede, OU=pki, CN=root.ca.kaede.jp
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:
                    00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
            X509v3 Authority Key Identifier:
                keyid:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00

            X509v3 Basic Constraints:
                CA:TRUE
    Signature Algorithm: sha1WithRSAEncryption
         00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
         00:00:00:00:00:00:00:00:00:00:00:00:00:00:00

 

これでCAの構築は終了です。

cacert.pem⇒cacert.der変換

cacert.pem(ルート証明書)はWindowsのブラウザにインポートできないのでpem形式からder形式に変換します。

openssl x509 -inform pem -in /etc/pki/KaedeRootCA/cacert.pem -outform der -out /etc/pki/KaedeRootCA/cacert.der

変換後、Windows環境にcacert.derをインストールすればrootCAのインストールは完了。

root_der

↑ cacert.derをダブルクリックし、【証明書のインストール】よりインストール可
(その場合、インストール先が中間証明書になります。)

 

subCA(中間認証局)構築

openssl.cnfにて[ CA_default ]の情報を[ CA_sub01 ]にコピーする。

rootCAと同じサーバに設定する場合はopenssl.cnfに追記が必要。別サーバにする場合はrootCAの設定と同様でOK。

vim /etc/pki/tls/openssl.cnf
#37行目付近default_caの修正
#default_ca     = CA_default            # The default ca section
default_ca      = CA_sub01              # The default ca section

#[ CA_default ]と[ policy_match ]の間に作成
[ CA_default ]
・
・
・

#######################追記ここから#########################
[ CA_sub01 ]

#dirをrootCAとは違うディレクトリに作成
#dir            = /etc/pki/CA           # Where everything is kept
dir             = /etc/pki/KaedeSub01CA         # 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.
#unique_subject = no                    # Set to 'no' to allow creation of
                                        # several ctificates with same subject.
new_certs_dir   = $dir/newcerts         # default place for new certs.

certificate     = $dir/cacert.pem       # The CA certificate
serial          = $dir/serial           # The current serial number
crlnumber       = $dir/crlnumber        # the current crl number
                                        # must be commented out to leave a V1 CRL
crl             = $dir/crl.pem          # The current CRL
private_key     = $dir/private/cakey.pem# The private key
RANDFILE        = $dir/private/.rand    # private random number file

x509_extensions = usr_cert              # The extentions to add to the cert

# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt        = ca_default            # Subject Name options
cert_opt        = ca_default            # Certificate field options

# Extension copying option: use with caution.
# copy_extensions = copy

# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
# so this is commented out by default to leave a V1 CRL.
# crlnumber must also be commented out to leave a V1 CRL.
# crl_extensions        = crl_ext

default_days    = 365                   # how long to certify for
default_crl_days= 30                    # how long before next CRL
default_md      = default               # use public key default MD
preserve        = no                    # keep passed DN ordering

# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy          = policy_match
#######################追記ここまで#########################
#
# For the CA policy
[ policy_match ]
・
・
・

 

rootCAの時と同様にdirで指定したパス先に各ディレクトリ・serial・index.txtを作成します。

#証明書検証用ディレクトリ
mkdir -p /etc/pki/KaedeSub01CA/certs

#CA秘密鍵保存ディレクトリ
mkdir -p /etc/pki/KaedeSub01CA/private

#失効リスト保存ディレクトリ
mkdir -p /etc/pki/KaedeSub01CA/crl

#署名された証明書保存ディレクトリ
mkdir -p /etc/pki/KaedeSub01CA/newcerts

#root以外のアクセス不可
chmod 700 /etc/pki/KaedeSub01CA/private

#シリアルファイル作成
echo 01 > /etc/pki/KaedeSub01CA/serial

#データベース作成
touch /etc/pki/KaedeSub01CA/index.txt

 

rootCAと同様にCA証明書を作成します。
ただし、今回は証明書書名要求の為引数が少し(x509がない)変わります。
rootCA署名後のファイルをcacert.pemにする為、書名要求ファイルはcacert_req.pemで名前作成します。

openssl req -new -newkey rsa:2048  -out /etc/pki/KaedeSub01CA/cacert_req.pem -days 3650 -keyout /etc/pki/KaedeSub01CA/private/cakey.pem
Generating a 2048 bit RSA private key
............................+++
........+++
writing new private key to '/etc/pki/KaedeSub01CA/private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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) [XX]:JP
State or Province Name (full name) []:Osaka
Locality Name (eg, city) [Default City]:Osaka
Organization Name (eg, company) [Default Company Ltd]:Kaede
Organizational Unit Name (eg, section) []:pki
Common Name (eg, your name or your server's hostname) []:sub01.ca.kaede.jp
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: #そのままEnterでOK
An optional company name []:#そのままEnterでOK

<p>&nbsp;</p>
<p>出来上がったsubCA証明書をrootCAにて署名します。</p>
<p>openssl.cnfの編集</p>

#37行目付近のdefault_caをrootCA(CA_default)に変更
[ ca ]
default_ca     = CA_default            # The default ca section
#default_ca      = CA_sub01              # The default ca section

 

rootCAにて署名

#cacert_req.pemを読み込んでcacert.pemに有効期間3650日(10年)で書名します。
#-daysの値はrootCAの有効期間より長く指定してもrootCAの有効期間までになります。
openssl ca -days 3650 -out /etc/pki/KaedeSub01CA/cacert.pem -infiles /etc/pki/KaedeSub01CA/cacert_req.pem
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/KaedeRootCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Jul  4 18:02:29 2015 GMT
            Not After : Jul  1 18:02:29 2025 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Osaka
            organizationName          = Kaede
            organizationalUnitName    = pki
            commonName                = sub01.ca.kaede.jp
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
            X509v3 Authority Key Identifier:
                keyid:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00

Certificate is to be certified until Jul  1 18:02:29 2025 GMT (3650 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

 

subCAの書名確認

 openssl verify -purpose sslclient -CAfile ../KaedeRootCA/cacert.pem ./cacert.pem
 ./cacert.pem: OK #OKと出れば書名されている。
 

 

subCAのcacert.pem(中間証明書)をpem⇒der形式にエンコード

openssl x509 -inform pem -in /etc/pki/KaedeSub01CA/cacert.pem -outform der -out /etc/pki/KaedeSub01CA/cacert.der

中間証明書

中間証明書 証明のパス

rootCAに署名された中間証明書が作成できました。

 

 - サーバー , , , , , ,