コンピュータ セキュリティ 暗号化 サーバー

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

2015年7月5日

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

サーバ1つでルート証明書及び中間証明書を発行するためのメモ
細かい設定とかは省いています。

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

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

yum install openssl

openssl.cnfの設定
ルート認証局と中間認証局を1つのサーバで運用する場合はopenssl.cnfを分けたほうがいいので分けて記載します。

cp -a /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl_root.cnf #ルート証明書用にコピー
vim /etc/pki/tls/openssl_root.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 -config /etc/pki/tls/openssl_root.cnf -out /etc/pki/KaedeRootCA/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/certs/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:
98:43:c6:c6:b6:b9:ba:1a
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=JP, ST=Osaka, L=Osaka, O=Kaede, OU=pki, CN=root.ca.kaede.jp
Validity
Not Before: Jul 4 18:02:29 2015 GMT
Not After : Jul 1 18:02:29 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:dc:be:a0:73:67:57:4d:4d:64:4f:6d:18:43:55:
7c:d7:4f:80:28:09:5d:e0:e3:c9:59:61:f6:35:e1:
e4:cd:ff:15:c1:a3:72:3d:9a:34:f9:b8:b7:e1:34:
3d:cc:7a:a8:2f:e9:a7:5f:ed:94:be:0d:20:a6:7e:
70:09:b9:89:8f:bf:7e:3d:e1:3b:2c:45:f4:a1:94:
00:39:fa:60:06:e0:2c:0a:43:e6:fe:86:e6:e5:f9:
ed:ca:c2:42:28:15:af:f3:d2:bb:c4:12:4b:5f:54:
08:83:73:e1:97:65:48:b1:b7:92:6a:ee:40:46:62:
89:b2:66:91:fb:96:ce:a5:fb:35:41:37:89:83:11:
d5:b7:e4:8f:ac:ee:21:b8:0e:3f:0d:18:16:a4:cb:
44:d0:44:8d:4e:e3:95:2c:00:18:4a:ea:ed:01:ad:
63:73:66:cd:d8:54:45:8a:38:cb:94:5a:4c:3f:7a:
51:47:3e:05:65:8b:46:2e:45:70:2f:ec:36:41:48:
94:ca:f9:2b:68:f8:b2:44:d2:6c:74:6a:5e:cf:af:
68:2e:dd:7f:e4:93:cf:6d:2c:7d:ab:31:e0:84:b2:
37:44:a2:a4:b5:1c:bd:33:8f:e4:8b:f9:8b:75:2f:
30:f3:2b:8f:ac:7f:ed:5b:82:6c:7f:15:45:75:e3:
56:39
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
36:6D:9B:87:04:64:27:49:09:5C:7F:5F:C1:56:C8:36:8E:5D:D0:10
X509v3 Authority Key Identifier:
keyid:36:6D:9B:87:04:64:27:49:09:5C:7F:5F:C1:56:C8:36:8E:5D:D0:10
X509v3 Basic Constraints: 
            CA:TRUE
Signature Algorithm: sha256WithRSAEncryption
     a2:80:95:d6:23:ad:8a:e2:97:40:a4:2c:d0:18:eb:74:26:a8:
     ca:e5:cb:6c:51:17:a9:ae:a7:d8:9e:38:20:32:2f:05:6e:a1:
     bd:45:80:44:d2:77:48:dd:ea:96:f4:ac:59:6b:2a:0e:5e:38:
     75:a2:5b:1b:0e:cd:4b:6f:e1:9f:e9:87:e9:aa:33:d0:2a:68:
     5a:f0:1d:e9:4a:a0:0a:99:73:d0:cf:85:24:a3:6d:2a:aa:81:
     16:82:7f:32:3c:b6:b9:71:ac:69:5b:2d:75:09:31:c3:1e:01:
     31:6b:e0:03:8b:8e:a7:2e:8b:a3:18:32:6f:3c:73:f8:d5:c8:
     76:2d:5b:9b:f0:40:e6:6d:32:82:51:60:8e:32:29:18:b6:54:
     f3:d1:a6:47:1f:20:14:c0:7f:6f:c9:03:1a:68:78:d2:dd:0c:
     6a:56:08:37:14:1b:09:1f:bd:39:c7:85:4a:ed:6a:01:22:36:
     f6:03:20:3e:f3:03:67:59:a5:0d:63:b6:a9:52:92:6a:32:97:
     d9:ec:41:a7:cc:b9:46:7f:d9:47:85:8f:71:d5:4c:2b:6f:0b:
     07:2a:3c:5e:65:67:7a:d3:0d:76:82:c7:cd:bf:e5:2c:cc:1c:
     08:fb:17:7f:30:0f:f6:ab:7d:97:f4:73:fd:7a:4b:eb:a7:d5:
     91:5b:15:37

これでルート認証局の構築は終了です。

cacert.pem⇒cacert.der変換

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

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

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

root_der

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

subCA(中間認証局)構築

中間認証局は複数作る可能性があるならば、ルート証明書と同様にopenssl.cnfをコピーします。

cp -a /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl_root.cnf #ルート証明書用にコピー
vim /etc/pki/tls/openssl_sub01.cnf

42行目あたりdirを修正

・
・
・
[ CA_default ]

#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
・
・
・

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 -config /etc/pki/tls/openssl_sub01.cnf -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

rootCAにて署名

configにてルート証明書のconfを記載します。
subject(C(国)/S(都道府県)/L(市区町村)/O(会社名)/CN等)がどこまで一致または必須項目にするかはpolicyで設定します。
policyはconfigファイルに記載されているので必要に応じて変更してください。

中間証明書なのでextensionsを「v3_ca」に設定してます。

#cacert_req.pemを読み込んでcacert.pemに有効期間3650日(10年)で書名します。
#-daysの値はrootCAの有効期間より長く指定してもrootCAの有効期間までになります。
openssl ca -config /etc/pki/tls/openssl_root.cnf -policy policy_match -extensions v3_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 Subject Key Identifier:
B5:20:DC:8C:FA:FF:17:9E:8F:26:6A:C2:17:93:7F:8B:88:7A:94:95
X509v3 Authority Key Identifier:
keyid:36:6D:9B:87:04:64:27:49:09:5C:7F:5F:C1:56:C8:36:8E:5D:D0:10
X509v3 Basic Constraints: 
            CA:TRUE
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に署名された中間証明書が作成できました。

-コンピュータ, セキュリティ, 暗号化, サーバー
-, , , , , ,