僕は最近知りました。。
無料でSSLを設定できるって知ってました?
「無料でSSLを設定する方法を知りたい」
「『Let’s Encrypt』を設定する方法を知りたい」
「『Let’s Encrypt』の有効期限を自動で更新する方法を知りたい」
こんな僕と同じ状態のあなたのために「コピペ可能」なコード付きで解説します。
Apache、Nginx、Poundの3つのWebサーバー(OSはCentOSです)それぞれの設定方法と有効期限の自動更新方法をまとめています。
SSL証明書の作成と設定にフォーカスして説明してるよ。
※サーバーへSSHでの接続方法や、Linuxコマンドを理解している方向けの内容が含まれます。
無料SSL証明書「Let’s Encrypt」
Let’s Encrypt(レッツエンクリプト)とは
SSLをWebサーバーに設定するためには、SSL証明書が必要です。
そのSSL証明書を無料で利用できるのが「Let’s Encrypt」です。
SSL証明書といえば、数年前は有料でかつ年間で数万円する高いものでした。
ベリサインとかだと年間で10万以上とかでしたね。
今は、SSL証明書は年間数千円のものからあります。
そんななか、Let’s Encrypt(レッツエンクリプト)はなんで無料なのかというと、いろんな組織がスポンサーとなって無料でのサービスがなりたってます。
マジ感謝ですね。
アメリカのInternet Security Research Group (ISRG)が運営しています。
無料だけど信頼性はどうなのか?
信頼性はどうなの?と思う方もいるでしょう。
今のところクロームブラウザ(Google)で利用できるので大丈夫ですね。
なぜなら、シェアNO1ブラウザですから。
他のブラウザも追従するしかないです。
ただ、2020年3月に一部更新プログラムに不具合があり、証明書を失効させる処置があったそうです。
証明書300万件を強制失効。Let’s Encrypt に一体何が起きたのか?
不具合は、無料、有料どの認証局にも付きものですが現在は解消されてるそうです。
有効期限は3ヵ月(90日)
特徴的なのが、Let’s Encrypt が発行する証明書は有効期限が3ヶ月(90日)と短い。
3ヶ月で使えくなる理由は、セキュリティの観点であえてそのような仕様にしてるようです。
設定によって、自動更新させることができます。
結果、ずっと利用できます。
ドメイン名であなたのサイトに接続できる状態が必要
早速、無料SSL証明書といきたいですが、Let’s Encryptの設定するには、ドメイン名であなたのサイトに接続できる状態である必要があります。
この記事ではその状態はできている前提ですすめます。
サーバーの設定、ドメインとグローバルアドレスの設定については、方法がいろいろあるのでググって調べてください。
例えばドメインを取得したければ「ドメイン 取得」でググればたくさんでてきます。
おすすめは安心のGoogle Domains
とにかく安く取得したいならお名前.com
ドメインは世界で1つしかありません。
すでに他の方が買われてるとその名前では購入できないので、あなたの買いたいドメイン名が、購入可能かの確認だけでもしておきましょう。
3種類のWebサーバーの設定方法
SSL証明書の発行を行う(各サーバー共通)
ドメイン名を「example.com」説明してますので、実際のドメインに置き換えて読んでください。
※ファイアウォールの設定、WEBサーバーのインストール設定は割愛します。
Certbot クライアントをインストールする(これがLet’s Encrypt)
yum install -y epel-release
yum install -y certbot
※権限がない場合は、rootユーザになるか、sudoコマンドを付けてください。
SSL証明書の発行
certbot certonly – webroot -w /var/www/document/root/html -d example.com
-w にはドキュメントルートを指定
-d にはドメイン名を指定
いくつか質問が来ます。
メールアドレスの登録(メールアドレス)
利用規約に同意(A で同意)
メールアドレスを運営に共有してくれるかきかれます(N でいい)
設定ファイルについて聞かれます(1 でOK)
httpsへリダイレクトする設定にするか否か(2 リダイレクトする)
発行された証明書は /etc/letsencrypt/live/example.com/ ディレクトリの配下に出来上がります。
cert.pem | SSL証明書本体 |
---|---|
chain.pem | 中間証明書 |
fullchain.pem | SSL証明書と中間証明書がセットになったもの |
privkey.pem | 秘密鍵ファイル |
※fullchain.pemはWEBサーバーがnginxかApache httpdのバージョンが2.4.8以降でないと利用できないです。
Apacheでの設定方法(CentOS編)
CentOS 7 + Apache 2.4での解説です。
mod_sslパッケージのインストール
yum install -y mod_ssl
既にインストール済みの場合は、その旨のメッセージが表示されます。
vhost-ssl.confの設定
vi /etc/httpd/conf.d/vhost-ssl.conf
※環境によってパスは変わります。
以下のように該当箇所に設定を追加します。
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem # SSL証明書のパス
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem # 中間証明書のパス
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem # 秘密鍵ファイルのパス
または、Apacheが2.4.8以降のバージョンであれば下記でもOK。
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem # SSL証明書+中間証明書のパス
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem # 秘密鍵ファイルのパス
Apacheを再起動します。
systemctl restart httpd
これで、あなたのサイトにアクセスし、https://example.com アドレス部分に鍵マークが表示されていればここまでは成功です。
あとは、証明書の自動更新を設定しましょう。
Nginxでの設定方法(CentOS編)
CentOS 7 + Nginx 1.17 での解説です。
前提として、NginxでSSLを利用するには “-with-http_ssl_module” 付きでコンパイルしてインストールしておく必要があります。
nginx.confを設定
vi /etc/nginx/nginx.conf
※環境によってパスは変わます。
以下のように該当箇所に設定を追加します。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
server {
listen 443;
ssl on;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem # SSL証明書のパス
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem # 秘密鍵ファイルのパス
Nginxを再起動します。
systemctl restart nginx
これで、あなたのサイトにアクセスし、https://example.com アドレス部分に鍵マークが表示されていればここまでは成功です。
あとは、証明書の自動更新を設定しましょう。
Poundでの設定方法(CentOS編)
CentOS 7 + Pound 2.6 での解説です。
ググってもPoundサーバーってあまり記事でてこないけど、ロードバランサーとして優秀で僕は好きです。
ApacheやNginx+Tomcatなどと使うと便利なサーバーです。
cert.pem | SSL証明書本体 |
---|---|
chain.pem | 中間証明書 |
fullchain.pem | SSL証明書と中間証明書がセットになったもの |
privkey.pem | 秘密鍵ファイル |
のうち、fullchain.pemとprivkey.pemをまとめたファイルを作成します。
cp fullchain.pem fullchain_withkey.pem
cat privkey.pem >> fullchain_withkey.pem
fullchain_withkey.pemが出来ます。
pound.cfgを設定
vi /etc/pound.cfg
※環境によってパスは変わります。
以下のように該当箇所に設定を追加します。
ListenHTTPS
Address XXX.XXX.XXX.XXX
Port 443
Cert "/etc/letsencrypt/live/example.com/fullchain_withkey.pem" # SSL証明書+中間証明書+秘密鍵ファイルのパス
End
Poundを再起動します。
systemctl restart pound
これで、あなたのサイトにアクセスし、https://example.com アドレス部分に鍵マークが表示されていればここまでは成功です。
あとは、証明書の自動更新を設定しましょう。
Let’s Encryptの自動更新設定を行う
Let’s Encryptは有効期間が3ヶ月(90日間)です。
これは、自動更新設定を行うことで、その後は有効期限は自動更新することが可能です。
cronに更新コマンドを登録しましょう。
crontab -e
下記を追記(※下記は毎日深夜0時ちょうどに実行する場合)
Apacheの場合
0 0 * * * certbot renew – renew-hook "systemctl reload httpd"
Nginxの場合
0 0 * * * certbot renew – renew-hook "systemctl reload nginx"
Poundの場合
0 0 * * * certbot renew – renew-hook "systemctl restart pound"
※Poundはreload処理がないので、restartコマンドで登録しています。
※rootユーザーで登録してください。
毎日起動しますが、実際に証明書が更新されるのは、期限が切れる30日前になってからです。
なので、そのときにちゃんと更新されたかは確認してください。
無料のSSL証明書はなんか不安…なら有料のSSL証明書設定方法もあります。
こちらの記事をあわせてどうぞ。
ユウキでした。