URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

OpenSSLで自己認証局

 最近は、WEBブラウザでアクセスする管理ツールでもHTTPSで使用するのが一般的になっています。ですが、デフォルトの証明書だと警告とかエラーになることが多々あったりするので、とりあえず内部で使うものやテストでは自己認証を、外部に公開するものについてはちゃんとした認証局から証明書を購入するのが一般的かと思います(まあ、エラーを気にせず使うことも多いか…)。

 そんなわけで、OpenSSLの使用機会が多くなったのでメモ

1. OpenSSLの設定ファイルを一部修正

# cd /etc/pki/tls
# cp -p openssl.cnf openssl.cnf.org (デフォルトのファイルをコピーしておく)
# vi ./openssl.cnf
---
以下のセクションのパラメータを設定
[ CA_default ]
default_md = sha256 (SHA-2への移行対応)

[ req ]
default_bits = 2048 (キー長が2048でない場合は修正)
default_md = sha256 (SHA-2への移行対応)

[ req_distinguished_name ]
countryName_default = JP (とりあえず既定値を日本にしておく)

[ usr_cert ]
basicConstraints=CA:TRUE (CA証明書の発行)
nsCertType = server (サーバ証明書の作成)

[ v3_ca ]
nsCertType = sslCA, emailCA

2. CAスクリプトの修正 (あまりよくないかもしれませんが、必要に応じて)

# cd ./misc
# cp -p CA CA.org
# vi CA
---
以下の有効期間を任意の日数に変更
if [ -z "$DAYS" ] ; then DAYS="-days 365" ; fi # 1 year
CADAYS="-days 1095" # 3 years

3. デフォルトのファイルセットを待避して空ディレクトリを作成

# cd ../../
# mv CA CA.org
# mkdir CA

4. CA作成スクリプトを実行

# cd ./tls/misc
# ./CA -newca
CA certificate filename (or enter to create)
(とりあえずファイル名は空のまま[Enter])
Making CA certificate ...
Generating a 2048 bit RSA private key
....+++
......................................+++
writing new private key to '/etc/pki/CA/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) [JP]: JP (国名)
State or Province Name (full name) []:Saitama (都道府県)
Locality Name (eg, city) [Default City]:Saitama (市区町村)
Organization Name (eg, company) [Default Company Ltd]:hoge (組織)
Organizational Unit Name (eg, section) []:hogehoge (部門)
Common Name (eg, your name or your server's hostname) []:private_ca (ホスト名等)
Email Address []:(何も入力せず[Enter])

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 /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/./cakey.pem:(最初に入力したパスフレーズ)
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 18166497922828360043 (0xfc1c5d9c4f0e596b)
Validity
Not Before: Feb 24 02:37:31 2014 GMT
Not After : Feb 22 02:37:31 2024 GMT
Subject:
countryName = JP
stateOrProvinceName = Saitama
organizationName = hoge
organizationalUnitName = hogehoge
commonName = private_ca
X509v3 extensions:
X509v3 Subject Key Identifier:
9A:82:5D:A2:60:9F:8F:5B:1D:63:74:E7:D6:3E:EC:6D:9D:44:0B:AD
X509v3 Authority Key Identifier:
keyid:9A:82:5D:A2:60:9F:8F:5B:1D:63:74:E7:D6:3E:EC:6D:9D:44:0B:AD

X509v3 Basic Constraints:
CA:TRUE
Netscape Cert Type:
SSL CA, S/MIME CA
Certificate is to be certified until Feb 22 02:37:31 2024 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

5. 必要に応じてブラウザ用のCA証明書を作成

# cd ../../CA/private/
# chmod 0600 cakey.pem
# openssl x509 -inform PEM -outform DER -in ../cacert.pem -out ../cacert.der
# ls -l /etc/pki/CA
→"cacert.pem"と"cacert.der"があることを確認

6. ここからは、作成した自己認証局を使用して証明書を発行する手順
 まずは証明書要求(CSR)を作成

# cd /var/tmp (適当なディレクトリへ移動するか新規作成)
# openssl md5 * > rand.dat (乱数ファイルを作成)
# openssl genrsa -rand rand.dat -des3 2048 > key.pem (秘密鍵を作成)
48 semi-random bytes loaded
Generating RSA private key, 2048 bit long modulus
..........................................................
.........................................+++
.......................+++
e is 65537 (0x10001)
Enter pass phrase:(パスフレーズを入力)
Verifying - Enter pass phrase:(もう一回)
# openssl req -new -sha256 -key key.pem -out server.csr (CSRを作成)
Enter pass phrase for key.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) [JP]:JP (国名)
State or Province Name (full name) []:Saitama (都道府県)
Locality Name (eg, city) [Default City]:Saitama (市区町村)
Organization Name (eg, company) [Default Company Ltd]:hoge (組織)
Organizational Unit Name (eg, section) []:hogehoge (部門)
Common Name (eg, your name or your server's hostname) []:www.hoge.local (ホスト名等)
Email Address []:(何も入力せず[Enter])

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:(何も入力せず[Enter])
An optional company name []:(何も入力せず[Enter])
# ls -l
→"key.pem"と"server.csr"ができていることを確認

7. 自己認証局で署名

# cd /etc/pki/tls/misc/
# openssl ca -out /var/tmp/cert.pem -infiles /var/tmp/server.csr
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:(パスフレーズを入力)
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 18166497922828360044 (0xfc1c5d9c4f0e596c)
Validity
Not Before: Feb 24 03:42:15 2014 GMT
Not After : Feb 24 03:42:15 2015 GMT
Subject:
countryName = JP
stateOrProvinceName = Saitama
organizationName = hoge
organizationalUnitName = hogehoge
commonName = www.hoge.local
X509v3 extensions:
X509v3 Basic Constraints:
CA:TRUE
Netscape Cert Type:
SSL Server
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
BC:E4:07:6B:5A:AE:F7:46:23:48:60:2B:F5:0B:82:B9:42:AC:2F:5C
X509v3 Authority Key Identifier:
keyid:9A:82:5D:A2:60:9F:8F:5B:1D:63:74:E7:D6:3E:EC:6D:9D:44:0B:AD

Certificate is to be certified until Feb 24 03:42:15 2015 GMT (365 days)
Sign the certificate? [y/n]:y ("y"を入力)

1 out of 1 certificate requests certified, commit? [y/n]y ("y"を入力)
Write out database with 1 new entries
Data Base Updated
# ls -l /var/tmp
→"cert.pem"ができていることを確認
この"cert.pem"と"key.pem"をセットで使用する

8. 補足

◆サーバ証明書と秘密鍵を使用する時に、秘密鍵のパスフレーズをきかれないようにする
# openssl rsa -in key.pem -out key.pem.nopassword
→ここで作成された"key.pem.nopassword"を"key.pem"の代わりに使用する

◆サーバ証明書をWindows(IIS等)で使用するために変換する
# openssl pkcs12 -export -in cert.pem -inkey key.pem -out cert.p12
→ここで作成された"cert.p12"をMMCの証明書スナップインでインポートする
 (合わせて[信頼されたルート証明機関]にはCA証明書"cacert.pem"をインポート)

9. 署名時にエラーが出る場合

# openssl ca -out /var/tmp/cert.pem -infiles /var/tmp/server.csr
 ~ 省略 ~
Sign the certificate? [y/n]:y
failed to update database
TXT_DB error number 2
→このエラーが出る場合は、以前発行した証明要求の失効処理をする

# openssl ca -revoke /etc/pki/CA/newcerts/FC1C5D9C4F0E596B.pem
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:(パスフレーズを入力)
Revoking Certificate FC1C5D9C4F0E596B.
Data Base Updated