UNIXCentOSセキュリティ証明 OpenSSL

OpenSSL のインストールと証明書作成

更新日:2017年12月30日

OpenSSL とは

SSL は Secure Sockets Layer の略称で、インターネット上でサーバーとPC間で改ざん等受けず安全に接続するための暗号化通信手段(プロトコル)を指します。SSL では、サーバー側で作成した秘密鍵と、ブラウザやメールアプリケーションに組み込まれた証明機関:認証局(会社)によって証明された公開鍵をペアにして安全とする仕組みになっています。
近年では SSL を基にした TLS (Transport Layer Security)プロトコルが主流になっており、その両方を加味したオープンソースソフトウェアが OpenSSL です。
インターネットショッピングでの https 暗号化通信や、メール送受信など SSL はあらゆる箇所で個人情報などを守る手段として使用されていて、OpenSSL はその世界標準となっています。

OpenSSL インストール

OpenSSL が CentOS にあらかじめインストールされていないか確認しましょう。インストールされていなければ出力されません。

# rpm -qa | grep openssl

インストールされていなければインストールしましょう。

# yum -y install openssl

OpenSSL のバージョンを確認しましょう。

# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017

証明書作成

先にお話ししたとおり、SSL 暗号化通信するためには各サーバー毎の秘密鍵(key)ファイルとその秘密鍵の安全性を証明する公開鍵(証明書)ファイルの2ファイルが必要になります。このセットがWebサーバー・メールサーバーに設定されていない場合は「接続の安全性を確認できません。」というメッセージが表示されます。
サーバーでは、秘密鍵ファイルと、証明書を発行してもらうために必要な署名要求(CSR:Certificate Signing Request)ファイルを作ります。この署名要求(CSR)ファイルを証明機関:認証局で署名し、発行された証明書をサーバーに組み込むとWebブラウザで安全に通信することができるようになります。
ブラウザに既存の証明機関:認証局で証明してもらうには金額がかかるため、使用するPCが限定されている場合は、証明機関:認証局を自前で作成することも可能です。

設定ファイル編集

証明書を作成するにあたっては、入力する項目がたくさんあります。
作成する時に対話式でその都度入力することも可能ですが、あらかじめ設定ファイルに記述しておくと、エンターキーを入力するだけですむため便利です。

# vi /etc/pki/tls/openssl.cnf
...
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
# 国コード
countryName_default = JP
countryName_min = 2
stateOrProvinceName = State or Province Name (full name)

#stateOrProvinceName_default = Default Province
# 都道府県
stateOrProvinceName_default = Tokyo

localityName = Locality Name (eg, city)
# 市区町村
localityName_default = Shinagawa-ku

0.organizationName = Organization Name (eg, company)
# 会社名等
0.organizationName_default = KENTOKYO

organizationalUnitName = Organizational Unit Name (eg, section)
# 部署名等
organizationalUnitName_default = System
...
[ usr_cert ]
...
# Webサーバーの証明書を作成する場合は以下のコメントを外します。
nsCertType = server
# Mailサーバーの証明書を作成する場合は以下のコメントを外します。
nsCertType = client, email
...

サーバー証明書:秘密鍵と署名要求(CSR)ファイル作成

サーバー証明書を作成します、あらかじめファイルを保存するディレクトリに移動しておきます。
例では認証局に発行してもらう証明書要求ファイル newreq.pem と サーバー側で保存しておく秘密鍵ファイル newkey.pem を作成しています。
また、証明書の期限はデフォルトで1年ですが、例ではDAYS="-days 3650"で10年に設定しています。

# DAYS="-days 3650" /etc/pki/tls/misc/CA -newreq
Generating a 2048 bit RSA private key
........................................................................+++
................+++
writing new private key to 'newkey.pem'
Enter PEM pass phrase:秘密鍵のパスフレーズ(Webサーバーであれば起動時に入力する必要があります)
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]:そのままエンターキーを押します
State or Province Name (full name) [Tokyo]:そのままエンターキーを押します
Locality Name (eg, city) [Shinagawa-ku]:そのままエンターキーを押します
Organization Name (eg, company) [kentokyo.com]:そのままエンターキーを押します
Organizational Unit Name (eg, section) [System]:そのままエンターキーを押します
Common Name (eg, your name or your server's hostname) []:www.kentokyo.com # サーバー名
Email Address []:そのままエンターキーを押します

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:そのままエンターキーを押します
An optional company name []:そのままエンターキーを押します
Request is in newreq.pem, private key is in newkey.pem

証明書要求ファイル newreq と サーバー側で保存しておく秘密鍵ファイル newkey.pem が作成されました。
サーバー証明書はWebサーバー起動など使用するときに設定したパスフレーズを求められます、自動起動などでは動作が停止してしまうため、パスフレーズを秘密鍵ファイルに埋め込んでパスフレーズを要求されないようにしましょう。

# openssl rsa -in newkey.pem -out newkey.pem
Enter pass phrase for newkey.pem:秘密鍵のパスフレーズ
writing RSA key

公的な認証局に証明書を発行してもらった場合は、作成された署名要求(CSR)ファイルをシマンテックなどに送って証明書ファイル(公開鍵)を発行してもらいましょう。

各サーバーへの設定

作成されたファイルを各サーバーへ設定するにはそれぞれ Webサーバー ApacheMailサーバー Postfix を確認してください。

自己認証局

限られたPCで証明書を使用する場合は自分で認証局(自己認証局)を作成し、署名要求(CSR)ファイルに自身で署名することができ、それぞれのPCのブラウザなどにこの認証局のファイルをインストールすると暗号化通信できるようになります。

自己認証局作成

自前の認証局(CA:Certification Authority)を作成します。
CA証明書を発行させるために、先ほどの設定ファイルを編集しましょう。

# vi /etc/pki/tls/openssl.cnf
...
[ v3_ca ]
...
# 認証局タイプはSSL認証局、電子メール認証局を使用するために以下のコメントを外します。
nsCertType = sslCA, emailCA
...

認証局を作成しましょう。
また、証明書の期限はデフォルトで1年ですが、例ではDAYS="-days 3650"で10年に設定しています。

# CADAYS="-days 3650" /etc/pki/tls/misc/CA -newca
...
Enter PEM pass phrase:証明書発行(認証局起動)用のパスフレーズ
Verifying - Enter PEM pass phrase:証明書発行(認証局起動)用のパスフレーズ
...
Country Name (2 letter code) [JP]:そのままエンターキーを押します
State or Province Name (full name) [Tokyo]:そのままエンターキーを押します
Locality Name (eg, city) [Shinagawa-ku]:そのままエンターキーを押します
Organization Name (eg, company) [kentokyo.com]:そのままエンターキーを押します
Organizational Unit Name (eg, section) [System]:そのままエンターキーを押します
Common Name (eg, your name or your server's hostname) []:kentokyo.com # 認証局の名前
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:そのままエンターキーを押します
An optional company name []:そのままエンターキーを押します
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /tmp/..././cakey.pem:証明書発行(認証)用のパスフレーズ
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number:
ef:43:4a:8e:1c:83:2c:7b
Validity
Not Before: Nov 28 17:23:45 2017 GMT
Not After : Nov 27 17:23:45 2020 GMT
Subject:
countryName = JP
stateOrProvinceName = Tokyo
organizationName = kentokyo.com
organizationalUnitName = System
commonName = kentokyo.com
X509v3 extensions:
X509v3 Subject Key Identifier:
AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45
X509v3 Authority Key Identifier:
keyid:AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45

X509v3 Basic Constraints:
CA:TRUE
Netscape Cert Type:
SSL CA, S/MIME CA
Certificate is to be certified until Nov 27 17:23:45 2020 GMT (1095 days)

Write out database with 1 new entries
Data Base Updated

作成した認証局をブラウザ利用するために PC で取り込める形式に変換します。
デフォルトではCAの自己署名型証明書ファイルが/etc/pki/CA/cacert.pemに作成されています。

# openssl x509 -inform pem -outform der -in /etc/pki/CA/cacert.pem -outform PEM -out ./cacert.der

作成されたファイルを各 PC のブラウザに取り込んでおきましょう。
Internet Explorer・Google Chrome:
作成した der ファイルをPC上でダブルクリック -> 証明書のインストール -> 証明書を全て次のストアに配置する -> 参照 -> 信頼されたルート証明機関 -> 完了
FireFox:
オプション -> プライバシーとセキュリティ -> 証明書を表示 -> 認証局証明書 -> インポート -> 作成した der ファイルを選択 -> この認証局によるウェブサイトの識別を信頼する -> OK

サーバー証明書認証

作成した署名要求(CSR)ファイルに署名しましょう、先ほど作成した newreq.pem ファイルのディレクトリに移動しておきます。

# /etc/pki/tls/misc/CA -sign
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:
ef:43:4a:8e:1c:83:2c:7c
Validity
Not Before: Nov 29 00:51:12 2017 GMT
Not After : Oct 25 00:51:12 2027 GMT
Subject:
countryName = JP
stateOrProvinceName = Tokyo
localityName = Shinagawa-ku
organizationName = kentokyo.com
organizationalUnitName = System
commonName = www.kentokyo.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Server
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45
X509v3 Authority Key Identifier:
AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45

Certificate is to be certified until Oct 25 00:51:12 2039 GMT (8000 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
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
ef:43:4a:8e:1c:83:2c:7c
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=JP, ST=Tokyo, O=kentokyo.com, OU=System, CN=kentokyo.com
Validity
Not Before: Nov 29 00:51:12 2017 GMT
Not After : Oct 25 00:51:12 2039 GMT
Subject: C=JP, ST=Tokyo, L=Shinagawa-ku, O=kentokyo.com, OU=System, CN=mail.kentokyo.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:bb:5e:98:ad:c0:52:a5:6c:31:ce:50:27:46:12:
...
51:29
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Server
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45
X509v3 Authority Key Identifier:
AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45

Signature Algorithm: sha256WithRSAEncryption
AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45
...(略)
-----BEGIN CERTIFICATE-----
...
(略)
...
-----END CERTIFICATE-----
Signed certificate is in newcert.pem

困ったときは

証明書を破棄

証明書が必要無くなった場合など破棄する場合は、証明書を失効させます。
/etc/pki/CA/crlnumberにファイルが無ければ手動で作成しておく必要があります。

# echo '00' > /etc/pki/CA/crlnumber

証明書を失効させます。

# openssl ca -gencrl -revoke newcert.pem
...
Enter pass phrase for /etc/pki/CA/private/cakey.pem: # 証明書発行(認証局起動)用のパスフレーズ
...
Data Base Updated

認証局の更新

認証局の有効期限が切れるとサイト・メールが信用されなくなります。
その場合は認証局を更新しましょう。
現在の認証局の有効期限を確認します。

# openssl x509 -inform PEM -in /etc/pki/CA/cacert.pem -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
9b:14:47:64:36:e8:98:56
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=JP, ST=Tokyo, L=Shinagawa-ku, O=KENTOKYO.COM, OU=System, CN=KENTOKYO
Validity
Not Before: Jan 6 06:32:26 2018 GMT
Not After : Jan 4 06:32:26 2021 GMT

現在の認証局秘密鍵から証明書を更新します。
10年延長しています。

# openssl req -new -x509 -days 3650 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -config /etc/pki/CA/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:証明書を発行した際のパスフレーズ
...
Country Name (2 letter code) [JP]:そのままエンターキーを押します
State or Province Name (full name) [Tokyo]:そのままエンターキーを押します
Locality Name (eg, city) [Shinagawa-ku]:そのままエンターキーを押します
Organization Name (eg, company) [kentokyo.com]:そのままエンターキーを押します
Organizational Unit Name (eg, section) [System]:そのままエンターキーを押します
Common Name (eg, your name or your server's hostname) []:kentokyo.com # 認証局の名前
Email Address []:

できあがった証明書からPCに取り込める形にして取り込みます。
上述の「作成した認証局をブラウザ利用するために PC で取り込める形式に変換します。」を参考にしてください。

認証局を再構築

何らかの理由で認証局を削除してするには2つのファイルを削除すれば再度作成出来ます。

# rm -f /etc/pki/CA/index.txt
# rm -f /etc/pki/CA/private/cakey.pem