CentOSのopenssl-perlというパッケージは、opensslコマンドをラップしたCA.plというperlスクリプトが含まれています。このCA.plを使用すると簡単にCAを作成できます。
今回はこのCA.plを修正してRootCA、中間CAからなる階層CAを作成し、サーバ証明書を発行してみます。
環境
今回作成する階層CAのイメージはこんな感じです。
環境は以下のもので行いました。
・CentOS5.1 x86 64bit
インストールしたパッケージは以下のものです。
・openssl
・openssl-perl
作業用ディレクトリ作成
CAsというディレクトリを作成し、このディレクトリの下にCAを作成します。
# mkdir CAs
# cd CAs
Perlスクリプトの修正
まずはCA.plをコピーしてきましょう。
RootCAを作成するPerlスクリプトは「RootCA.pl」という名前、中間CAを作成するPerlスクリプトは「SubCA.pl」という名前にします。
# cp /etc/pki/tls/misc/CA.pl RootCA.pl
# cp /etc/pki/tls/misc/CA.pl SubCA.pl
「RootCA.pl」を適当なエディタで下記の場所を変更してください。
$CATOP="../../CA";"RootCA";
$SSLEAY CONFIG=$ENV{"SSLEAY CONFIG"};"-config openssl-rootca.cnf";
「SubCA.pl」も同様に下記の場所を変更してください。
$CATOP="../../CA";$CATOP="SubCA";
$SSLEAY CONFIG=$ENV{"SSLEAY CONFIG"};"-config openssl-subca.cnf";
openssl設定ファイルの修正
openssl設定ファイルもコピーしてきましょう。CAの設定はこの設定ファイルで行います。
RootCAの設定ファイルを「openssl-rootca.cnf」という名前、中間CAの設定ファイルを「openssl-subca.cnf」という名前にします。
# cp /etc/pki/tls/openssl.cnf openssl-rootca.cnf
# cp /etc/pki/tls/openssl.cnf openssl-subca.cnf
「openssl-rootca.cnf」を適当なエディタで下記の場所を変更してください。
dir =../../CARootCA
「openssl-subca.cnf」も同様に下記の場所を変更してください。
dir =../../CASubCA
RootCA作成
以上でスクリプトの修正は終了です。
それでは、RootCAを作成しましょう。
# ./RootCA.pl -newca
CA certificate filename (or enter to create)<Enter」を入力>
Making CA certificate ...
Generating a 1024 bit RSA private key
......................................++++++
.++++++
writing new private key to 'RootCA/private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:<RooCA秘密鍵のパスフレーズを入力>
-----
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) [GB]:JP
State or Province Name (full name) [Berkshire]:Tokyo
Locality Name (eg, city) [Newbury]:Shibuya-ku
Organization Name (eg, company) [My Company Ltd]:HDE
Organizational Unit Name (eg, section) []:Test
Common Name (eg, your name or your server's hostname) []:HDE Root CA
Email Address []:.
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:<Enter」を入力>
An optional company name []:<Enter」を入力>
Using configuration from openssl-rootca.cnf
Enter pass phrase for RootCA/private/cakey.pem:<RooCA秘密鍵のパスフレーズを入力>
Check that the request matches the signature
Signature ok
<省略>
中間CA作成
このまま、中間CAも作成しましょう。
# ./SubCA.pl -newca
CA certificate filename (or enter to create)<Enter」を入力>
Making CA certificate ...
Generating a 1024 bit RSA private key
....................................++++++
.......................++++++
writing new private key to 'SubCA/private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:<中間CA秘密鍵のパスフレーズを入力>
-----
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) [GB]:JP
State or Province Name (full name) [Berkshire]:Tokyo
Locality Name (eg, city) [Newbury]:Shibuya-ku
Organization Name (eg, company) [My Company Ltd]:HDE
Organizational Unit Name (eg, section) []:Test
Common Name (eg, your name or your server's hostname) []:HDE Subordinate CA
Email Address []:.
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:<Enter」を入力>
An optional company name []:<Enter」を入力>
Using configuration from openssl-subca.cnf
Enter pass phrase for SubCA/private/cakey.pem:<中間CA秘密鍵のパスフレーズを入力>
Check that the request matches the signature
Signature ok
<省略>
「RootCA」と「SubCA」というディレクトリが作成されました。このディレクトリがCAです。
# ls -F
RootCA/ RootCA.pl* SubCA/ SubCA.pl* openssl-rootca.cnf openssl-subca.cnf
RootCAから中間CA証明書を発行
RootCA.plと同じディレクトリに中間CAの証明書発行要求(CSR)を「newreq.pem」という名前で配置します。
# cp SubCA/careq.pem newreq.pem
RootCAから中間CAへ証明書を発行しましょう。
# ./RootCA.pl -signCA
Using configuration from openssl-rootca.cnf
Enter pass phrase for RootCA/private/cakey.pem:<RootCA秘密鍵のパスフレーズを入力>
Check that the request matches the signature
Signature ok
<省略>
Certificate is to be certified until Jul 24 03:09:01 2009 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
Signed CA certificate is in newcert.pem
「newcert.pem」というファイルがRootCAから発行された中間CA証明書です。
# ls
RootCA RootCA.pl SubCA SubCA.pl newcert.pem newreq.pem openssl-rootca.cnf openssl-subca.cnf
サーバ秘密鍵の作成
先ほど使用した中間CAのCSRを削除し、発行した証明書とSubCAの証明書を置き換えます。
# rm newreq.pem
# cd SubCA
# mv cacert.pem cacert-oreore.pem
# mv ../newcert.pem cacert.pem
サーバの秘密鍵を作成します。
# cd ..
# ./SubCA.pl -newreq-nodes
Generating a 1024 bit RSA private key
....................++++++
...........................++++++
writing new private key to 'newkey.pem'
-----
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) [GB]:JP
State or Province Name (full name) [Berkshire]:Tokyo
Locality Name (eg, city) [Newbury]:Shibuya-ku
Organization Name (eg, company) [My Company Ltd]:HDE
Organizational Unit Name (eg, section) []:Test
Common Name (eg, your name or your server's hostname) []:hoge.hde.co.jp
Email Address []:.
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:<Enter」を入力>
An optional company name []:<Enter」を入力>
Request is in newreq.pem, private key is in newkey.pem
「newkey.pem」というファイルがサーバ秘密鍵、「nwereq.pem」というファイルがサーバのCSRです。
# ls
RootCA RootCA.pl SubCA SubCA.pl newkey.pem newreq.pem openssl-rootca.cnf openssl-subca.cnf openssl-subca.cnf
中間CAからサーバ証明書を発行
これでサーバ証明書を発行できます。
サーバ証明書を発行します。
# ./SubCA.pl -sign
Using configuration from openssl-subca.cnf
Enter pass phrase for SubCA/private/cakey.pem:<中間CA秘密鍵のパスフレーズを入力>
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number:
92:cf:31:13:5d:15:66:c4
Validity
Not Before: Jul 24 03:22:05 2008 GMT
Not After : Jul 24 03:22:05 2009 GMT
Subject:
countryName = JP
stateOrProvinceName = Tokyo
localityName = Shibuya-ku
organizationName = HDE
organizationalUnitName = Test
commonName = hayashi2-copy.prd.local.hde.co.jp
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Subject Key Identifier:
3A:2D:07:37:4E:5D:4F:52:A4:84:BC:D0:24:09:D1:3A:D2:1C:6E:8E
X509v3 Authority Key Identifier:
keyid:77:F4:0A:48:AF:0C:C0:38:81:A9:CA:C7:7F:0B:E7:CF:4E:28:B8:01
Certificate is to be certified until Jul 24 03:22:05 2009 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
Signed certificate is in newcert.pem
「newcert.pem」というファイルが中間CAから発行されたサーバ証明書です。
# ls
RootCA RootCA.pl SubCA SubCA.pl newcert.pem newkey.pem newreq.pem openssl-rootca.cnf openssl-subca.cnf openssl-subca.cnf
作成したRootCA、中間CA、サーバ証明書の確認
せっかくですから、作成したRootCA、中間CA、サーバ証明書を確認してみましょう。
CAのディレクトリ構成は以下のようになります。
# tree RootCA SubCA
RootCA
|-- cacert.pem CA証明書
|-- careq.pem 証明書署名要求(CSR)
|-- certs
|-- crl 発行した証明書失効リスト(CRL)
|-- crlnumber 次回発行するCRLのシリアル番号
|-- index.txt 発行した証明書のリスト
|-- index.txt.attr
|-- index.txt.old
|-- newcerts 発行した証明書
| `-- DEA9F4DF7B24ED52.pem RootCA自己署名証明書
| `-- DEA9F4DF7B24ED53.pem 中間CA証明書
|-- private
| `-- cakey.pem CA秘密鍵
`-- serial 次回発行する証明書のシリアル番号
SubCA
|-- cacert-oreore.pem
|-- cacert.pem
|-- careq.pem
|-- certs
|-- crl
|-- crlnumber
|-- index.txt
|-- index.txt.attr
|-- index.txt.attr.old
|-- index.txt.old
|-- newcerts 発行した証明書
| |-- ACCD6C4F29A9BBF8.pem 中間CA自己署名証明書
| `-- ACCD6C4F29A9BBF9.pem サーバ証明書
|-- private
| `-- cakey.pem
|-- serial
`-- serial.old
8 directories, 25 files
サーバに設置した証明書をみてみます。
# openssl s_client -connect hoge.hde.co.jp:443 -showcerts -CAfile RootCA/cacert.pem < /dev/null
CONNECTED(00000003)
depth=2 /C=JP/ST=Tokyo/O=HDE/OU=Test/CN=HDE Root CA
verify return:1
depth=1 /C=JP/ST=Tokyo/L=Shibuya-ku/O=HDE/OU=Test/CN=HDE Subordinate CA
verify return:1
depth=0 /C=JP/ST=Tokyo/L=Shibuya-ku/O=HDE/OU=Test/CN=hoge.hde.co.jp
verify return:1
---
Certificate chain
0 s:/C=JP/ST=Tokyo/L=Shibuya-ku/O=HDE/OU=Test/CN=hoge.hde.co.jp
i:/C=JP/ST=Tokyo/L=Shibuya-ku/O=HDE/OU=Test/CN=HDE Subordinate CA
-----BEGIN CERTIFICATE-----
MIICzTCCAjagAwIBAgIJAKzNbE8pqbv5MA0GCSqGSIb3DQEBBQUAMGwxCzAJBgNV
BAYTAkpQMQ4wDAYDVQQIEwVUb2t5bzETMBEGA1UEBxMKU2hpYnV5YS1rdTEMMAoG
A1UEChMDSERFMQ0wCwYDVQQLEwRUZXN0MRswGQYDVQQDExJIREUgU3Vib3JkaW5h
dGUgQ0EwHhcNMDgwODIxMDgxNjQxWhcNMDkwODIxMDgxNjQxWjBoMQswCQYDVQQG
EwJKUDEOMAwGA1UECBMFVG9reW8xEzARBgNVBAcTClNoaWJ1eWEta3UxDDAKBgNV
BAoTA0hERTENMAsGA1UECxMEVGVzdDEXMBUGA1UEAxMOaG9nZS5oZGUuY28uanAw
gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMGRMhjqeZEbxKMBor1RKYmu1E99
SWOd+TB2oLeUdLfz1W0NADLn07m0S96g8lirX2PA3s3leu7ou9m0Ihgoqih4VHHy
bGyjwJPhHh6doDhz6VEc5slKZwS3VoKu82LoCpwJ4d9fvuVdMK66z1Y8zB6+8oKf
YYoD56p3eBMLMmkFAgMBAAGjezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8W
HU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBTwRIEiqvwl
cjUqybKm/GEFfsNsMzAfBgNVHSMEGDAWgBTnFpKkPDEGMjTD2B7uPlDX/OmTizAN
BgkqhkiG9w0BAQUFAAOBgQAfxTbo10Ux/8kIHZ/RO5rs3Nb/UwPLAnwd3hzN01Fd
zkrLCI5vgYKV7XBldQh61XXiUuYm5Zai6zpe4exPGyDft/6Pwf2+Q7ZlINFJCOPn
i/Kw/2mFO5sckdwIzot1X5deFbMB3G04ct0SBM+8yphZEOdf/rLjiDJr9mxIeN1Z
vw==
-----END CERTIFICATE-----
1 s:/C=JP/ST=Tokyo/L=Shibuya-ku/O=HDE/OU=Test/CN=HDE Subordinate CA
i:/C=JP/ST=Tokyo/O=HDE/OU=Test/CN=HDE Root CA
-----BEGIN CERTIFICATE-----
MIIC7jCCAlegAwIBAgIJAN6p9N97JO1TMA0GCSqGSIb3DQEBBQUAMFAxCzAJBgNV
BAYTAkpQMQ4wDAYDVQQIEwVUb2t5bzEMMAoGA1UEChMDSERFMQ0wCwYDVQQLEwRU
ZXN0MRQwEgYDVQQDEwtIREUgUm9vdCBDQTAeFw0wODA4MjEwNzMxMjVaFw0wOTA4
MjEwNzMxMjVaMGwxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIEwVUb2t5bzETMBEGA1UE
BxMKU2hpYnV5YS1rdTEMMAoGA1UEChMDSERFMQ0wCwYDVQQLEwRUZXN0MRswGQYD
VQQDExJIREUgU3Vib3JkaW5hdGUgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ
AoGBANODS53bPlNqyphi1uR7cWnS3Em5apWYIejBhnKElq9Kz7b+peMiLV+zWJPP
gAGiwm4fXfSBQle5BgVkLA23npXXYDV9Iue/kjp4ejenFjeHmfOXdR+mi4uGjg0D
Ts9bu+U4S3IrRsRkcxPIhp9IWboA+h4xq6SjMYMn+9OYy2/fAgMBAAGjgbMwgbAw
HQYDVR0OBBYEFOcWkqQ8MQYyNMPYHu4+UNf86ZOLMIGABgNVHSMEeTB3gBRX6or5
ghATOr0c1k/VMRfsQri2T6FUpFIwUDELMAkGA1UEBhMCSlAxDjAMBgNVBAgTBVRv
a3lvMQwwCgYDVQQKEwNIREUxDTALBgNVBAsTBFRlc3QxFDASBgNVBAMTC0hERSBS
b290IENBggkA3qn033sk7VIwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOB
gQA5g5VGYO2IwnrGrZzWMWNwjCeQKWwoZdE9a/o+VhgaWVgUFtewmInUk4ZJWVvk
nYEUQMX1Elv6PoJPNbCImCd9o+2K/nWWZXufoxfRThxV+BlH9f3ERBJEcyy2orjz
akbmJYBU8hxbbMr4oZqdBHJZGjTw+bcg5tV2v5NBxPvHMg==
-----END CERTIFICATE-----
---
Server certificate
subject=/C=JP/ST=Tokyo/L=Shibuya-ku/O=HDE/OU=Test/CN=hoge.hde.co.jp
issuer=/C=JP/ST=Tokyo/L=Shibuya-ku/O=HDE/OU=Test/CN=HDE Subordinate CA
---
No client certificate CA names sent
---
SSL handshake has read 2042 bytes and written 331 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 1024 bit
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : DHE-RSA-AES256-SHA
Session-ID: 883533E6EFEDD68672CB9AF93BDA3731260A0B0036083482E7CF9C76ACC6E4B5
Session-ID-ctx:
Master-Key: 0F00D8FB6783D9AED87F2A164C1F6AF5FC37DBDF093663CC0D162869B3642231DB8B59FD80DCFA7D4FDD022B9DB0A772
Key-Arg : None
Krb5 Principal: None
Start Time: 1219310060
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
DONE
以上で終了です。
お疲れ様でした。
Leave a comment