【備忘録】Let’s Encryptを使って無料でSSL化する

お仕事でサイトをSSL化することが結構多くなってきたので、 そのたびに調べてSSL化してるのですが毎回ググるのも面倒なので 自分のサイトによくやることをメモっていこうかなと思います。

今回SSL化に使用したのは「Let's Encrypt」という無料でSSL証明書を発行できるツールです。

SSLといえば有料や自力で作成するオレオレ証明書の二択かと思いきや ちょっとLinuxが触れるならちゃんとした証明書を無料で発行できるものがあります。

もちろん有料と違ってすべて自分でやらなきゃいけませんし、 環境によって動作が違ったりもすることがあるので基本自己責任です。

私は今回UbuntuやRaspbian、いわゆるDebian系のLinuxディストリビューションで行いました。

以下のURLは公式サイトです。

https://letsencrypt.org/ja/

Let's Encryptを導入してSSLを発行

まずは導入するための準備です。

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update

上記すべてのコマンドを順に実行し終えたら、SSLを発行します。

この時ドメインはすでに取得済みでなおかつDNSの設定も済ませていることが前提です。

一応サーバーのサービスも停止しておいたほうが良いでしょう。

nginxかapacheどちらかだと思いますのでsystemctlを使ってサービスを停止しましょう。

一応サービス起動中でもいけるコマンドがあるのですが、私はそれをやってないので 今回はサービスを停止した状態で行うコマンドになります。

sudo certbot certonly --standalone -d example.com -m user@example.com --agree-tos -n

ドメインはSSLを発行したいドメインでメールアドレスは自分のものか管理者のメールアドレスでいいと思います。

これを実行してエラーがでなければOKです。

英語で「Congratulations」って文章がでてたらOKだと思います。

問題なく成功していたら以下のディレクトリに証明書ファイルが生成されています。

sudo ls -la /etc/letsencrypt/live/example.com/

lrwxrwxrwx 1 root root   44 May 17 21:38 fullchain.pem -> 省略
lrwxrwxrwx 1 root root   42 May 17 21:38 privkey.pem -> 省略

発行したときに指定したドメインのディレクトリができていて、 その中にfullchain.pemとprivkey.pemが生成されていたらOKです。

nginxに適用

今回はapacheじゃなくてnginxを使っているので 私の設定ファイルを載せておきます。

パス等は自分の環境に合わせて書き換えてください。

sudo nano /etc/nginx/conf.d/default.conf

上記のコンフィグファイルに以下の様な感じで記載します。

server {
        #listen 80;
        listen  443 default ssl;
        #ssl    on;
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key     /etc/letsencrypt/live/example.com/privkey.pem;

        server_name     example.com;

        server_tokens   off;
        ssl_prefer_server_ciphers       on;
        ssl_session_timeout     5m;
        ssl_session_cache       builtin:1000 shared:SSL:10m;
        ssl_protocols   TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers     'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 DES-CBC3-SHA +SHA !aNULL !eNULL !LOW !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED';

        access_log      /var/log/nginx/ssl-access.log;
        error_log       /var/log/nginx/ssl-error.log;


        location / {
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass      http://127.0.0.1:3000;
                proxy_http_version      1.1;
                proxy_set_header        Upgrade $http_upgrade;
                proxy_set_header        Connection "upgrade";
        }
}

上記はあくまで例です。

私はnginxでサーバーを立ててnode.jsでローカルサーバーを立ち上げて サーバー側のグローバルIPにアクセスされたら、nginxはnodejsで立ち上げてる ローカルサーバーを見に行くという仕組みにしているのでこの書き方になっています。

DNSのつなぎ込みがちゃんとできていれば、ドメインにアクセスすると node.jsのローカルサーバーにSSLでアクセスできるようになります。

無料と有料SSLの違い

そりゃ有料のほうがセキュリティいいんじゃない?って最近まで思ってたのですが どうやら調べてみると無料も有料もセキュリティの差なんて無いようなもんらしいです。

あるのはサポートの有無とのことでした。

私みたいに自分で調べてなんとかできる人であれば無料でも十分だなと感じましたね。

もし予算が余ってて知識がなくて不安だったりする場合は有料を選んでもいいと思います。

そこで学べば次は無料で運用していけばいいですからね。

有料SSLは思った以上に高いです。

知識は金なりってことですか。