開発環境としてvirtual boxを使っているが、本サイトと別のドメインを割り振って閲覧確認することが多い。
ローカル内の通信なのでセキュリティ的に問題はないので、SSLなしでSSLありのサイトの開発をしていた。
ただ、ある日当たり前のように証明書エラーがある中で開発していたら、
本番に移行した時にも証明書エラーが出てしまった。
URLがhttpであることに気づけず、mixed contentとなってしまっていた。
ローカル環境なので、正規のSSLを購入するのも手間なので、今後サイトを増やすことも考慮していることもあり、オレオレSSL証明書を自由に発行できるようにしたいと考えた。
ページコンテンツ
設置した環境
- CentOS 7
認証局を準備
opensslをインストールしているからか知らないけど、必要な環境はあるみたい。
既にあるファイルをコピーして、自分用の認証局を作る。
なので、認証局と言ってもファイルをコピーして自分用に修正すればいい。
- /etc/pki 配下に自分の環境を作る
以下の実施して
「CAown」は任意のディレクトリ名で良い。以下の手順では「CAown」としたとして進める。
cd /etc/pki
mkdir CAown
自分の任意の名前を付けた場合は「CAown」を読み替えればよい。
- 必要なファイルをコピー
必要なファイルを「CAown」配下にコピーする。
cp tls/misc/CA CAown/
cp tls/openssl.cnf CAown/
- コピーしたファイルを自分用に編集
コピーした「tls/misc/CA」はコマンドで、この後実行するので、自分の環境に合わせて編集。
まずはファイルのトップにコメント文がたくさんあるが、そのコメント文の直下に以下を記入
SSLEAY_CONFIG="-config /etc/pki/CAown/openssl.cnf"
次に以下の文を追記。80行目あたり。
CATOP=/etc/pki/CAown # ←下の文の上にこの行を追記
if [ -z "$CATOP" ] ; then CATOP=/etc/pki/CA ; fi
次に、 コピーした「openssl.cnf 」は処理上で使われるみたい。自分の環境に合わせて編集。
「[CA_default]」ディレクティブ (と言っていいのか?)があるので 、
このディレクティブにある以下の値を修正する。
dir = /etc/pki/CAown # Where everything is kept ←作成したディレクトリ名に変更
「[ req_distinguished_name ]」ディレクティブ(と言っていいのか?)があるので
このディレクティブにある以下の値を修正する。
(ここは、のちの作業で求められる情報の初期値を設定するので、最悪やらなくていいかも)
(設定する値は任意)
countryName_default = JP
ーーー<何行か開けて>ーーー
stateOrProvinceName_default = Tokyo #←コメントアウトされていたので、コメントアウトを外して値を修正
ーーー<何行か開けて>ーーー
localityName_default = Taito-ku
ーーー<何行か開けて>ーーー
0.organizationName_default = Private Office
次に「[ usr_cert ]」ディレクティブの以下の値を修正する。
keyUsage = nonRepudiation, digitalSignature, keyEncipherment # ←コメントアウトされていたので、コメントアウトを外した
ーーー<何行か開けて>ーーー
extendedKeyUsage = critical,timeStamping # ←コメントアウトされていたので、コメントアウトを外した
ーーー<何行か開けて>ーーー
#nsComment = "OpenSSL Generated Certificate" # ←コメントアウトする
次に「[ v3_ca ]」ディレクティブの以下の値を修正する。
keyUsage = cRLSign, keyCertSign # ←コメントアウトされていたので、コメントアウトを外した
認証局用の鍵、証明書を作成する
今後作成するサイト用の証明書等のもとになる(?)鍵と証明書を作成する。
作成したCAornディレクトリに移動して以下を実行する。
./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/CAnakamuraserver/private/./cakey.pem'
Enter PEM pass phrase: ← 鍵のパスフレーズを入力。空で[Enter]するとエラーになるので、パスフレーズを決めて入力して[Enter]
Verifying - Enter PEM pass phrase: ← 上と同じパスフレーズを入力して[Enter]
-----
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]: ← [Enter]でよい。値を設定してもよいがアルファベット二文字。
State or Province Name (full name) [Tokyo]: ← [Enter]でよい。値を設定してもよい。
Locality Name (eg, city) [Taito-ku]: ← [Enter]でよい。値を設定してもよい。
Organization Name (eg, company) [Private Office]: ← [Enter]でよい。値を設定してもよい。
Organizational Unit Name (eg, section) []:Development ← [Enter]でよい。値を設定してもよい。
Common Name (eg, your name or your server's hostname) []:my server ← 何でもいいの値を設定する。あとで見ることがあるので、意味ある文章がいいかも。
Email Address []:example@example.com ← [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/CAnakamuraserver/openssl.cnf
Enter pass phrase for /etc/pki/CAnakamuraserver/private/./cakey.pem: ← ここで上のパスフレーズを入力して[Enter]
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 8 (0x8)
Validity
Not Before: Dec 28 15:46:47 2021 GMT
Not After : Dec 27 15:46:47 2024 GMT
Subject:
countryName = JP
stateOrProvinceName = Tokyo
organizationName = Private Office
organizationalUnitName = Development
commonName = my server
emailAddress = example@example.com
X509v3 extensions:
X509v3 Subject Key Identifier:
B8:0A:F0:3A:30:1E:74:0A:F3:76:83:79:5D:BF:C2:CB:80:26:59:45
X509v3 Authority Key Identifier:
keyid:B8:0A:F0:3A:30:1E:74:0A:F3:76:83:79:5D:BF:C2:CB:80:26:59:45
X509v3 Basic Constraints:
CA:TRUE
X509v3 Key Usage:
Certificate Sign, CRL Sign
Certificate is to be certified until Dec 27 15:46:47 2024 GMT (1095 days)
Write out database with 1 new entries
Data Base Updated
[root@localhost CAown]#
これで完了。すると以下のようにファイルが増えていた。
[root@localhost CAown]# ll
合計 48
-rwxr-xr-x 1 root root 5324 12月 29 02:50 CA
-rw-r--r-- 1 root root 4613 12月 29 02:53 cacert.pem ← 増えた
-rw-r--r-- 1 root root 1070 12月 29 02:53 careq.pem ← 増えた
drwxr-xr-x 2 root root 6 12月 29 02:52 certs ← 増えた
drwxr-xr-x 2 root root 6 12月 29 02:52 crl ← 増えた
-rw-r--r-- 1 root root 3 12月 28 02:56 crlnumber
-rw-r--r-- 1 root root 133 12月 29 02:53 index.txt ← 増えた
-rw-r--r-- 1 root root 21 12月 29 02:53 index.txt.attr ← 増えた
-rw-r--r-- 1 root root 0 12月 29 02:52 index.txt.old ← 増えた
drwxr-xr-x 2 root root 33 12月 29 02:53 newcerts ← 増えた
-rw-r--r-- 1 root root 11130 12月 29 02:50 openssl.cnf
drwxr-xr-x 2 root root 22 12月 29 02:52 private ← 増えた
-rw-r--r-- 1 root root 17 12月 29 02:53 serial ← 増えた
これでできた「cacert.pem」が認証局の証明書になる。
設定した認証局の証明書をPCに登録する(Windows10)
作ったcacert.pemを自分のPCに「信頼できる認証局」として登録することで、
自分の認証局で発行したサーバ証明書を使ったサイトが正常に表示されるようになる。
私はWindows10を使っているので、ここに登録してみる。
- 「cacert.pem」をvirtual boxからWindows10にコピーする。
- コピーした「cacert.pem」を「cacert.crt」にリネームする。
- 「cacert.crt」をダブルクリックする。
すると、証明書のウィンドウが開くので、「証明書のインストール」をクリック
証明書のインポートウィザードが開く。
保存場所はどちらでもいいが「現在のユーザー」を選択して「次へ」
次の画面で「証明書を全て次のストアに配置する」にチェックを入れて、
下のボックス右の「参照」をクリックする。
証明書ストアダイアログにて、「信頼されたルート証明機関」をクリックして、「OK」をクリック。
もしかしたら、「信頼された発行元」でもいいかも。
上の画面に戻るので、「次へ」をクリック。
で、「完了」をクリック。
これで、このPCで自分がログインした時には、自分で作った認証局が信頼されるようになる。
そして、その認証局で証明されたサーバ証明書は「信頼された証明書」として、
その証明書を使ったサイトをブラウザ閲覧時にエラーが出なくなる。
Firefoxは独自の証明書管理をしているとのことなので、もしかしたらfirefoxではエラーになるかも?
(細かい手順は省略するが、設定の「プライバシーとセキュリティ」→「証明書」のところの「証明書を表示」をクリックすると表示される画面にてインポートできる)
下準備はここまで
virtual box内で認証局を作って、自分のPCの設定も完了したので、
あとは、この認証局を使ってサーバ証明書を発行すればよい。
サイトを追加するたびに、ここから下の手順を行う。
発行するサイトをopenssl.cnfに登録する
発行するサイトのFQDNをopenssl.cnfのalt_namesディレクティブに記載する。
もともと alt_namesがない可能性もあるので、なければopenssl.cnfの末尾に[ alt_names ]を追記する。
[ alt_names ]
DNS.1 = example.com # ← 左のようにFQDNを記入する。
DNS.2 = www.example.com # ← 追加する場合は、「DNS.」の右の数字を増やしていけばよい
サイトの証明書を発行してみる
認証局の証明書発行手順と同じく、「CAown」に移動してコマンドを実行する。
(もうCAownにいるけど。)
上と違って、引数が「-newreq」となる。
[root@localhost CAown]# ./CA -newreq
Generating a 2048 bit RSA private key
..............+++
...........................+++
writing new private key to 'newkey.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]: ← [Enter]でよい
State or Province Name (full name) [Tokyo]: ← [Enter]でよい
Locality Name (eg, city) [Taito-ku]: ← [Enter]でよい
Organization Name (eg, company) [Private Office]: ← [Enter]でよい
Organizational Unit Name (eg, section) []:Development ← [Enter]でよい。任意に値を入れてもよい
Common Name (eg, your name or your server's hostname) []:coword.com ← 証明書のFQDNを入力する。[Enter]
Email Address []:example@example.com ← メールアドレスを入力して[Enter]
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
[root@localhost CAown]#
すると、さらにファイルが増えていた。
[root@localhost CAown]# ll
合計 56
-rwxr-xr-x 1 root root 5324 12月 29 02:50 CA
-rw-r--r-- 1 root root 4613 12月 29 02:53 cacert.pem
-rw-r--r-- 1 root root 1070 12月 29 02:53 careq.pem
drwxr-xr-x 2 root root 6 12月 29 02:52 certs
drwxr-xr-x 2 root root 6 12月 29 02:52 crl
-rw-r--r-- 1 root root 3 12月 28 02:56 crlnumber
-rw-r--r-- 1 root root 133 12月 29 02:53 index.txt
-rw-r--r-- 1 root root 21 12月 29 02:53 index.txt.attr
-rw-r--r-- 1 root root 0 12月 29 02:52 index.txt.old
drwxr-xr-x 2 root root 33 12月 29 02:53 newcerts
-rw-r--r-- 1 root root 1834 12月 29 02:56 newkey.pem ← 増えた
-rw-r--r-- 1 root root 1078 12月 29 02:56 newreq.pem ← 増えた
-rw-r--r-- 1 root root 11130 12月 29 02:50 openssl.cnf
drwxr-xr-x 2 root root 22 12月 29 02:52 private
-rw-r--r-- 1 root root 17 12月 29 02:53 serial
増えたのはサイト用の鍵(newkey.pem)と証明書発行要求(newreq.pem)とのこと。
これを使って、認証局に登録するのが次のコマンドみたい。
[root@localhost CAown]# ./CA -sign
Using configuration from /etc/pki/CAown/openssl.cnf
Enter pass phrase for /etc/pki/CAown/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number:
86:0c:73:5b:57:ef:76:0a
Validity
Not Before: Dec 28 18:20:21 2021 GMT
Not After : Dec 4 18:20:21 2121 GMT
Subject:
countryName = JP
stateOrProvinceName = Tokyo
localityName = Taito-ku
organizationName = Private Office
organizationalUnitName = Development
commonName = example.net
emailAddress = example@gmail.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Key Encipherment
X509v3 Subject Key Identifier:
C5:38:A3:88:8C:E7:47:37:74:79:32:3C:20:E4:94:E5:F8:1C:43:9A
X509v3 Authority Key Identifier:
keyid:56:D5:43:6B:D9:BB:EA:58:84:68:36:93:0A:B5:9E:7D:90:9E:EB:CB
X509v3 Subject Alternative Name:
DNS:example.com
X509v3 Extended Key Usage:
TLS Web Server Authentication
Certificate is to be certified until Dec 4 18:20:21 2121 GMT (36500 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:
---<証明書の情報っぽいものが表示される>---
Signed certificate is in newcert.pem
[root@localhost CAown]#
すると、newcertsディレクトリにファイルが生成されている。
[root@localhost CAown]# ll newcerts/
合計 16
-rw-r--r-- 1 root root 4613 12月 29 02:53 860C735B57EF7609.pem
-rw-r--r-- 1 root root 4906 12月 29 03:20 860C735B57EF760A.pem
[root@localhost CAown]#
webの情報を見ると、上が01.pemでしたが02.pemとなるはずだけど。。。
いったん良しとして、今回は「860C735B57EF760A.pem」が作られたみたい。
これとペアになる鍵と証明書発行要求をわかりやすいように同じ名前にして、移動する。
[root@localhost CAown]# mv newreq.pem certs/860C735B57EF760A.pem
[root@localhost CAown]# mv newkey.pem private/860C735B57EF760A.pem
[root@localhost CAown]#
サーバ証明書と鍵を作成する
上で作ったファイルを使って、以下のコマンドでサーバ証明書と鍵を作成する。
[root@localhost CAown]# openssl x509 -in newcerts/860C735B57EF760A.pem -out example_com.crt
[root@localhost CAown]# openssl rsa -in private/860C735B57EF760A.pem -out example_com.key
[root@localhost CAown]#
「example_com.crt」と「example_com.key」が生成されているが、
これがapacheに設定するサーバ証明書と鍵のファイルとなる。
できたファイルをapacheに読み込ませて、apacheをリロードし、
Windows10のブラウザ(chrome)で表示したところ、正常に表示された。
最後にメモ
設定途中でいろいろエラーも行ったので、それらをメモしておく。
- 「./CA -sign」実行時にエラーが出た場合でも、処理がまるで最後まで行ったかのようなメッセージが出る。
(証明書を作りました。みたいな)
でも、「newcert.pem」が0バイトなので、結局正常に処理されていない。
- 途中で「opnessl.cnf」にalt_namesディレクティブの追加があるが、alt_namesディレクティブが
空のまま「./CA -sign」を実行しようとするとエラーになった。
適当なFQDNを追加したら問題なくなった。(別に適当なFQDNでなくていいのだが。。。)