SSL証明書取得・更新 (HTTPS化)
ホームページをHTTPS化するためのSSL証明書の取得、更新の流れ。
ここでは有料の証明書を利用する場合の手順。
無料で取得できるLet’s Encryptについてはこちら
証明書の種類
SSL証明書は認証局と呼ばれる第三者の署名が必須。
第三者に信用してもらうためにはいくつかの方法があり、
SSLサーバ証明書として3つに分類できる。
DV (Domain Validation)
ドメイン認証。
対象のドメインを所持しているかを確認する。
- DNSにTXTレコードを登録
- サイトの特定の位置にファイルを置く
自分の管理下のドメインでなければ認証が行えない。
無料のものから有料のものがあり、有害なサイトでも取得できる。
また、申請してから証明書が発行されるまでが早く、
SSL証明書更新忘れちゃった!!!みたいな時に仮発行に便利。
OV (Organization Validation)
企業認証。
ドメインの確認だけでなく、第三者のデータベースから情報を組織が実在しているかを確認する。
そして、企業の申請した担当者に対して発行申請を行ったか電話などで確認作業が入る。
信用度はDVよりも高く、値段も高い。
EV (Extended Validation)
企業認証+α。
EVではOVよりも厳格な審査が入る。
EVはCA/Browser Forumで決められたガイドラインに準拠する。
登記に関する実在証明も行われる。
信用度は最も高く、値段も高い。
ブラウザによってはアドレスバーが緑色になる。
以上のように種類はあるが、セキュリティの高さなどは関係ない。
それぞれ信頼度の高さが異なり、利用者に対して証明し安心できる証明書を選ぶと良い。
また、Googleでは常時SSLを推していて、SEOでも優遇されるためHTTPSは必須。
フォームがある場合は個人情報が平文で流れてしまうため、暗号化の為にも必須。
証明書は上の3つに分類できるが、更に細かく見ていくとブランドの違いがある。
- Symantec
- GlobalSign
- GeoTrust
その他にも多くのブランドが存在している。
料金やオプション、ブランド力などが異なる。
細かい違いやオプションについてはホームページなどで見てみると良い。
Let’s Encrypt
無料で利用できるLet’s EncryptはDV。
コマンドを使えば一瞬で取得できるすごいやつ。
このサイトも利用している。
注意点として、期限が申請後90日できれてしまうためこまめな更新が必要。
とはいえ、更新するためのスクリプトを定期実行すれば自動的に更新される。
証明書の取得
証明書の発行更新に必要なもの
- 管理下にあるドメイン
- 秘密鍵と公開鍵
- CSR作成情報(ディスティングイッシュネーム)
- 認証局に申請するための情報
申請前
証明書を発行する際、認証局のフォームに情報を入力する。
そこではCSRと管理者などの情報を入力することになる。
管理者等の情報は事前に用意されていることとする。
まずはCSRの作成を行う。
CSR作成
CSRとはCertificate Signing Requestの通り証明書署名要求のこと。
CSRにはドメインや組織情報が含まれる。DVはドメイン以外適当でも良かったりするが、、、
証明書の仕組みには公開鍵暗号方式と呼ばれる技術が利用されており、
秘密鍵と公開鍵が必要になる。
まずは、秘密鍵から作っていく。
Linux環境でopensslがインストールされていることが条件。
秘密鍵の作成
# openssl genrsa -out server.key 2048
# cat server.key
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA60gm58H47zjFbxP5yQSYGlolzCJpIYAT87O2+wLiWtKKlnmK
fXUhioVQsAmqUOZdLmaCPnVt6vyK2SuxN4SdEqOokbkOwKF/Lcarz2P/2J6QiuKB
ebHjDUgszh9riHXCLDNjCbrqfM3BieM4QSh49vqYYYVJgQE0GxyYsw2WQ78OWxWK
cp/WSTNtqa72lT4ZGvcS7S6DagFb5XeTsiwyOpRG5ixNkvXwsLBVxjTU6SdpiPq9
RyCL6j11wRI3h3t/zuzsJclVhmy1yeexozrlRxWlCH3VqtTcfb1p86QKplSjYjDd
bxpFboRBnMAggJBHI/IUpncExC55bzGvu5+1UwIDAQABAoIBAEMzzaD+v3qcrY/n
lb376PIF86vV3E9sRMaj+0zA6yRj5J/MQWlKLnVhVMWjTRlkYxMgxmzOn8GxtnsH
RswDvdWYF0rgH72XozrQ9zv6ZRZbXA+/WJoI3EBr8BhD0zQb5oU3fD9IOzfAkVow
I15BECQDOckJCBCn5lkkFt11sQjSGixqiFvyq1aKv2QB5TBMhAcVPZE5thObOrZh
96bFnRy2ux+CHk0mjhmr3mw6w4TtZL8eMrqPl8rXd9wFA4fTu9h4JMmZkAfQj1Gj
geLJZNWYz5GmV26h7EYDXoe6dx0ONeXTWmxxENbqVq8eSUzxrFHyJt7LwwIUiE7l
uTy1XVECgYEA+wHKEcgdvBcOttn44TKKNKC6Cjc0PLozh5dCzSKRWqCiJ5gEj7AF
Fy/Ll166LQ1ACwWGZH65K6rqCHuyNOl6qUC6aC4r598BeLS45iQ7P8WhAkm5sPsW
LkFLH9hG5W0SYXphWcX/bAo6kJjINTNjqNsHKyfX1kRQpq+N4kFefvkCgYEA7/ZI
9ULRGrZxfeU7uOD6C62hAozgq63inMXVgi9PFDxrDBZapW4i9HEnJyIcuBU4ilaA
ncEAL6aaYbjJvr7j6v+LL9KaYjc6IF/NFjepO7/uovUrmcfBREMZC+hIxTmfpq7c
TEMaXd7x6Tsmueaa5cKyCU46SH/mbwuKeRPQTasCgYEAxHi4FIcRT0K1D8c6GfuX
Vm5gcNKZHteYsg9iCHOAVvHZOyiwmU/sDCQrNga9r7npYTcn5M2UX2ve2FkKOoRu
sMCrqBRL5akW28aJ3AqMHfSxfLr8kF1ZFUeiaADALaDcfFRwkvZ6YbT39mrAe3QI
FAmtaMg9F8hNYMuVQX5tWvECgYBkG75SO77awxRT7mdc+Na4OoZ6duVgGhn5R3uM
ZUo7af1KvKSycWE5017/L3cFwSymYfIkXhlCx+GONTZNUnvpVRTvLZBkux+P1AfO
Zgg/OhJHf7rh2/kgDlILqqt5RFH7iuWzFyeP0+veXmQImFE022XFBhLAnkM3PnxV
iNOVIwKBgGsb1IDRDLGYwD61zRsRRMCvt4gL+li0L7x8SUTf7d98y4Sf6PRXiPWU
CEObWoT9ciiynkGbB7zq23r7WfPmthfYR1jPa4sd+JfxYR1snVNqVRrGl02NYm4s
OCs4MzqPA4i1Qyht1ZoXGNheQ8biWzXM/XDq+TL76rjLUohNgvcK
-----END RSA PRIVATE KEY-----
現在は2048bitが利用されることが多いため2048を指定。
ファイル名は何でも良いが「server.key」とした。
オプションとして-des3を使ってパスワード保護をすることもできる。
パスワードを掛けた場合、Apache等で読み込む再起動や再読み込み時にパス入力が求められる。
したがって、今回は指定しない。
確認コマンド
# openssl rsa -text -noout -in server.key
CSRの作成
# openssl req -new -key server.key -out server.csr
Country Name (2 letter code) [XX]:JP //国
State or Province Name (full name) []:Tokyo //都道府県
Locality Name (eg, city) []:Shinjuku //市区町村
Organization Name (eg, company) []:izumin group //組織名
Organizational Unit Name (eg, section) []: //部門
Common Name (eg, YOUR name) []:izuminmin.com //ドメイン
Email Address []: <hoge@mail> //メールアドレス
A challenge password []: //入力なし
An optional company name []: //入力なし
# cat server.csr
-----BEGIN CERTIFICATE REQUEST-----
MIICpDCCAYwCAQAwXzELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBVRva3lvMREwDwYD
VQQHDAhTaGluanVrdTEVMBMGA1UECgwMaXp1bWluIGdyb3VwMRYwFAYDVQQDDA1p
enVtaW5taW4uY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA60gm
58H47zjFbxP5yQSYGlolzCJpIYAT87O2+wLiWtKKlnmKfXUhioVQsAmqUOZdLmaC
PnVt6vyK2SuxN4SdEqOokbkOwKF/Lcarz2P/2J6QiuKBebHjDUgszh9riHXCLDNj
CbrqfM3BieM4QSh49vqYYYVJgQE0GxyYsw2WQ78OWxWKcp/WSTNtqa72lT4ZGvcS
7S6DagFb5XeTsiwyOpRG5ixNkvXwsLBVxjTU6SdpiPq9RyCL6j11wRI3h3t/zuzs
JclVhmy1yeexozrlRxWlCH3VqtTcfb1p86QKplSjYjDdbxpFboRBnMAggJBHI/IU
pncExC55bzGvu5+1UwIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAAi0ccXuPwD9
WxPkWw7TnX4ZY/FiULIHrfxpYG44OimyBO/IAfvHg0oJ5Wu+7jGheaqgQ9knuOYz
rrAXtUUCvJzCS3SKsdJfhKcYo0JzFAFyerXIuJuLR4xudF5VxQFgYTjteQvwLfs7
6+a7a0bcdsKkjwRxbXCR/It6gJ6fm3OIY2m9b7kB52toNM6PTVLAddPVYb92iM0w
O1qwgGDcIhthX7+y6K/M5HEIW1D1ZHyH4hqGv3jJ+dEYTQ7EWNauFxxjeWXf+plJ
HxEu1xoH2ofQ03233MrZpiwaV+4apyy66XkIrpxWQngETfzyimrI5l/qwNiS3oXS
k3EZ3BoaLzk=
-----END CERTIFICATE REQUEST-----
server.key(秘密鍵)を利用してCSRを作成する。
ここでは所有者情報と一緒に公開鍵も作成され組み込まれる。
入力中、特に重要なのはコモンネーム。
これがWebサイトのドメインと一致していないと信頼されたサイトにならない。
www有り無しで区別するので注意が必要。
※2way(SAN)でどちらも対応したり、*でワイルドカードにするオプションがあったりする。
DVではその他は割と何でもいいが、EV,OVでは注意する。
「server.key」「server.csr」が作成された。
これらは後ほど使うので無くさないように注意。
また、同じ秘密鍵からでも全く同じCSRは作成することができない点も注意。
このサイトのようにCSRの内容を確認するツールがある。確認をしておくと確実。
コマンドで確認する方法もある。
# openssl req -text -noout -in server.csr
申請
申請は認証局に提出するフォームが用意されているはずなのでそこから提出する。
管理者情報やCSRなどを入力して提出する。
ここでドメインのファイル認証を選ぶことができる場合もあり、
その場合、申請後に「https://xxxx.xxx/.well-know/pki-validation/hogehoge」に認証ファイルを置いてくれと言われる場合がある。クローラーが自動で確認しに来るので認証ファイルを置く。
これがうまく行かないといつまでも証明書は届かない。
※認証ファイルの設置時にBOM付きでないといけない場合も?
SSLサーバ証明書が届く
提出した内容を元に認証局が認証を行い、認証が通ると認証局からSSLサーバ証明書が届く。
※マイページで見れたり、メールで届いたり。
届くSSL証明書はこんな感じのやつ。※下のものは偽物ですが。
-----BEGIN CERTIFICATE-----
VQQHDAhTaGluanVrdTEVMBMGA1UECgwMaXp1bWluIGdyb3VwMRYwFAYDVQQDDA1p
enVtaW5taW4uY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA60gm
58H47zjFbxP5yQSYGlolzCJpIYAT87O2+wLiWtKKlnmKfXUhioVQsAmqUOZdLmaC
PnVt6vyK2SuxN4SdEqOokbkOwKF/Lcarz2P/2J6QiuKBebHjDUgszh9riHXCLDNj
CbrqfM3BieM4QSh49vqYYYVJgQE0GxyYsw2WQ78OWxWKcp/WSTNtqa72lT4ZGvcS
7S6DagFb5XeTsiwyOpRG5ixNkvXwsLBVxjTU6SdpiPq9RyCL6j11wRI3h3t/zuzs
JclVhmy1yeexozrlRxWlCH3VqtTcfb1p86QKplSjYjDdbxpFboRBnMAggJBHI/IU
pncExC55bzGvu5+1UwIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAAi0ccXuPwD9
WxPkWw7TnX4ZY/FiULIHrfxpYG44OimyBO/IAfvHg0oJ5Wu+7jGheaqgQ9knuOYz
rrAXtUUCvJzCS3SKsdJfhKcYo0JzFAFyerXIuJuLR4xudF5VxQFgYTjteQvwLfs7
6+a7a0bcdsKkjwRxbXCR/It6gJ6fm3OIY2m9b7kB52toNM6PTVLAddPVYb92iM0w
-----END CERTIFICATE-----
この届いた「SSLサーバ証明書」と「最初に作成した秘密鍵」のペアをWebサーバに設定すると
HTTPS化することができる。
ここでの注意点は証明書と一緒に中間証明書というものが必要な場合がある。
Webサーバによってはこの中間証明書を分ける場合と、SSLサーバ証明書と一つにまとめる場合がある。
証明書を設置する
証明書をどこかのディレクトリに設置する。
設置した後パーミッションに気をつける。
# chomod 400 /<path>/server.crt
# chomod 400 /<path>/server.key
Apache
コンフィグで証明書と秘密鍵を指定する。
SSLCertificateFile /<path>/server.crt //SSLサーバ証明書
SSLCertificateKeyFile /<path>/server.key //秘密鍵
中間証明書についてはSSLサーバ証明書とまとめる。※Apache 2.4.8~
# cat server.key
-----BEGIN CERTIFICATE-----
サーバ証明書
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
中間証明書
-----END CERTIFICATE-----
Apache2.2などの古いバージョンは中間証明書は別になる。
SSLCertificateFile /<path>/server.crt //サーバ証明書
SSLCertificateKeyFile /<path>/server.key //秘密鍵
SSLCertificateChainFile /<path>/chain.crt //中間証明書
Nginx
コンフィグで証明書と秘密鍵を指定する。
Nginxは行末に「;」が必要な点に注意。
ssl_certificate /<path>/server.crt; //SSLサーバ証明書
ssl_certificate_key /<path>/server.key; //秘密鍵
Apache同様、中間証明書についてはSSLサーバ証明書とまとめる。
# cat server.key
-----BEGIN CERTIFICATE-----
サーバ証明書
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
中間証明書
-----END CERTIFICATE-----
Webサーバの再起動・再読み込み
設置ができたら更新を行う。
その前に証明書と秘密鍵のペアが正しいか確認することもできる。
出力される数値が同じならペア。
# openssl rsa -modulus -noout -in server.key | openssl md5
(stdin)= 77d1esa9e5ea1670ed142aa00315d094
# openssl x509 -modulus -noout -in server.crt | openssl md5
(stdin)= 77d1esa9e5ea1670ed142aa00315d094
Webサーバのコンフィグが間違っていないか確認
#httpd -t //Apache(centOS)
#nginx -t //nginx
間違いがなければ更新※リロードでも可
# systemctl restart httpd
# systemctl restart nginx
証明書の更新
証明書の取得と同じ流れ。
認証局の申請方法が若干異なる。
以上が証明書の設置までの流れ。