【初心者向け】Let’s EncryptでUbuntuサーバを簡単にSSL化する

Linux

Let's EncryptでUbuntuサーバを簡単にSSL化アイキャッチ画像
ブログ運営者
さいとう

閲覧いただきありがとうございます!"さいとう"と申します。わたしは異業種・未経験からIT業界に転職し、現在インフラエンジニアとしてクラウド環境の設計や構築・運用の支援を行っています。


国内の格安VPSを使用した際に、HTTP通信をSSL化しようと試みました。契約オプションでSSLを有効化する選択肢がありましたが、その月額料金はサーバ代よりも高額であり、経済的に見合わないと感じました。


このような状況から、無料でHTTPS通信を実現できる方法を模索することにしました。その結果、私は"Let’s Encrypt"という無料のSSL証明書を提供しているサービスに出会いました


“Let’s Encrypt"は、インターネットセキュリティの向上を目指しており、簡単にSSL証明書を取得・更新できることから、多くのユーザーに利用されています。


今回の記事では、UbuntuにLet’s Encryptの"certbot"をインストールし、無料でHTTPS通信を実現する具体的な手順を紹介します。これにより、SSL化によるセキュリティ強化を費用をかけずに行うことが可能となります。


まず、certbotのインストールから始め、証明書の取得、ウェブサーバの設定、そして証明書の自動更新までの全てのステップを丁寧に解説します。この方法を使えば、手軽に自分のサイトをHTTPS化し、ユーザーに安心して利用してもらうことができるでしょう。

Let’s Encryptを使ってみる

Let’s Encryptとは

Let's EncryptでUbuntuサーバを簡単にSSL化アイコン

Let’s Encryptは、無料でSSL/TLS証明書を発行するための認証局(CA)です。このプロジェクトは、Webサイトを安全にするためにHTTPSをより広く普及させる目的で設立されました。Let’s Encryptは、Automated Certificate Management Environment(ACME)というプロトコルを使用して自動化された証明書管理を提供します。


以下の特徴は、公式Webサイトから引用しております。

【主な特徴】

  • 無料
     ドメイン名を持っている人なら誰でも、Let’s Encrypt を利用して費用なしで信頼される証明書を取得することができる
  • 自動化
     ウェブサーバー上で Let’s Encrypt と通信できるソフトウェアを動かすことで、証明書の取得や使用するためのセキュアな設定、更新の作業を簡単に行える
  • セキュア
     Let’s Encrypt は、それ自体が発展的な TLS セキュリティのベスト・プラクティスを実践するプラットフォームとして提供される。これは、CA * サイドとサイトのオペレータがサーバーを適切にセキュアにすることによって成り立つ
  • 透明性
     発行または無効化されたすべての証明書は、パブリックに記録され、だれでも検証に利用することができる
  • オープン
     自動的な発行・更新のプロトコルを、オープンスタンダードとして発行し、誰でも採用できるようにする


“Let’s Encrypt"の魅力は、利用が無料で、プラグインを利用すれば設定もほぼ自動で行われることです。国内のVPSを提供している会社のSSL化導入料金を調べてみると、

会社料金/年
C社6,600円/年
S社990円/年
X社836円/年 Let’s Encrypt利用無料プランあり
K社9,350円/年
2023年調べ


サーバが月額ワンコインで借りられることを考えると、通信の保護にサーバ代金以上のコストがかかる場合もあるみたいです。セキュリティ、運用、コストを考えると、判断が難しいところではありますが、個人ブログサイトや検証にはLet’s Encryptが最適ではないでしょうか。

ハンズオン

Let’s Encryptが提供する証明書の発行・取得や使用するためのセキュアな設定、更新の作業は、ソフトウェア"certbot"が実行します。"certbot"のインストールと、簡単な設定をハンズオン形式で紹介いたします。

●前提条件

今回のハンズオンの前提条件は以下の通りです。

  • 環境: AWS
  • 使用AWSリソース: Amazon EC2, Amazon VPC, Amazon Route53
  • セキュリティグループルール(インバウンド): 0.0.0.0/0 port: 80, 443
  • OS: ubuntu22.04
  • 接続: 任意。Session Managerを利用する場合、適切なIAMポリシーを付与してください
  • ユーザー: ubuntu
  • パブリックv4: あり
  • アプリケーション: nginx


今回のハンズオンはAWSで構築しますが、AWSでドメインを管理している場合、無料で証明書を発行できます。AWSを利用している方は、Let’s Encryptを使ってSSL証明書を発行する方法があるんだな、くらいの認識で大丈夫です。

はじめるまえに

用意したWebサーバの状況を確認しておきます。

http://<自身のドメイン名>



↓https: でアクセスしようとすると、接続できません。

Let's EncryptでUbuntuサーバを簡単にSSL化状況1


certbotインストール

Let’s Encryptの証明書を取得するためには、certbotというクライアントソフトウェアが必要です。インストールしていきましょう。

↓まずはリポジトリのインデックスを更新します。

sudo apt-get update


Let's EncryptでUbuntuサーバを簡単にSSL化コマンド1


↓ユーティリティを提供するパッケージをインストールします。

sudo apt-get install software-properties-common


Let's EncryptでUbuntuサーバを簡単にSSL化コマンド4


↓universe リポジトリをシステムに追加し、[ENTER]を実行してください。

sudo add-apt-repository universe


Let's EncryptでUbuntuサーバを簡単にSSL化コマンド3

Adding component(s) 'universe’ to all repositories.
Press [ENTER] to continue or Ctrl-c to cancel.
コンポーネント「universe」をすべてのリポジトリに追加します。
[ENTER] を押して続行するか、Ctrl+C を押してキャンセルします。


↓Certbot の最新版をインストールし、[ENTER]を実行してください。

sudo add-apt-repository ppa:certbot/certbot


Let's EncryptでUbuntuサーバを簡単にSSL化コマンド2


↓新しく追加したパッケージ情報を取り込むためにリポジトリのインデックスを更新します。

sudo apt-get update


↓Let’s Encryptの証明書を取得・更新するためのツール"certbot"と、NginxでCertbotを使うためのプラグイン"python3-certbot-nginx"をインストールします。

sudo apt-get install certbot python3-certbot-nginx


Let's EncryptでUbuntuサーバを簡単にSSL化コマンド6


↓Certbotを実行して、Nginxの設定を自動で行います。このコマンドが成功すると、Let’s Encryptの証明書が取得され、Nginxの設定が自動で更新されます。

sudo certbot --nginx


Let's EncryptでUbuntuサーバを簡単にSSL化コマンド5
>ubuntu@ip-10-0-1-101:~$ sudo certbot --nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent r
enewal and security notices)
(Enter 'c' to cancel): <メールアドレス>
デバッグ ログを /var/log/letsencrypt/letsencrypt.log に保存する
メールアドレスを入力してください(緊急の更新やセキュリティに関する通知に使用されます)



Let's EncryptでUbuntuサーバを簡単にSSL化コマンド6
>Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
agree in order to register with the ACME server. Do you agree?
(Y)es/(N)o: Y
次のサイトで利用規約をお読みください。
https://letsencrypt.org/documents/LE-SA-v1.3- September-21-2022.pdf。絶対です
ACME サーバーに登録するために同意します。同意しますか?



Let's EncryptでUbuntuサーバを簡単にSSL化コマンド8
>Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
最初の証明書が正常に発行されたら、次のことをしていただけますか?
電子フロンティア財団と電子メール アドレスを共有する
Let's Encrypt プロジェクトのパートナーであり、
Certbotを開発していますか? Web の暗号化に関する当社の取り組みについて電子メールをお送りしたいと考えています。
EFF のニュース、キャンペーン、デジタルの自由をサポートする方法。


↓ドメイン名を入力しまし、[Enter]を押しましょう。

Let's EncryptでUbuntuサーバを簡単にSSL化コマンド9
>Account registered.
Please enter the domain name(s) you would like on your certificate (comma and/or
space separated) (Enter 'c' to cancel):
アカウントが登録されました。
証明書に記載するドメイン名を入力してください (カンマまたは/または)
スペースで区切ります) (キャンセルするには「c」を入力します):



Let's EncryptでUbuntuサーバを簡単にSSL化コマンド7


↓設定変更に成功すると、以下のメッセージが出てきます。

Let's EncryptでUbuntuサーバを簡単にSSL化コマンド10
>Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/saito-test.test.cloud5.jp/fullchain.pem
Key is saved at: /etc/letsencrypt/live/saito-test.test.cloud5.jp/privkey.pem
This certificate expires on 2023-12-15.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for saito-test.test.cloud5.jp to /etc/nginx/sites-enabled/default
Congratulations! You have successfully enabled HTTPS on https://saito-test.test.cloud5.jp
We were unable to subscribe you the EFF mailing list because your e-mail address appears to be invalid. You can try again later by visiting https://act.eff.org.
証明書を正常に受け取りました。
証明書は/etc/letsencrypt/live/saito-test.test.cloud5.jp/fullchain.pemに保存されます。
キーは/etc/letsencrypt/live/saito-test.test.cloud5.jp/privkey.pemに保存されます。
この証明書の有効期限は 2023 年 12 月 15 日です。
これらのファイルは、証明書が更新されるときに更新されます。
Certbot は、この証明書をバックグラウンドで自動的に更新するスケジュールされたタスクを設定しました。
証明書の展開
saito-test.test.cloud5.jp の証明書が /etc/nginx/sites-enabled/default に正常にデプロイされました
おめでとう! https://saito-test.test.cloud5.jp で HTTPS が有効になりました。
あなたの電子メール アドレスが無効であるため、EFF メーリング リストに登録できませんでした。 https://act.eff.org にアクセスして、後でもう一度試すことができます。


メールアドレスとドメイン名を入力するだけでインストール作業は終了です。

動作確認

httpsでの通信が可能になったか、動作確認をしてみます。

https://<自身のドメイン名>


Let's EncryptでUbuntuサーバを簡単にSSL化状況



Let's EncryptでUbuntuサーバを簡単にSSL化状況5



問題なくhttpsでアクセスできますね。ためしにhttpでアクセスしても、httpsでリダイレクトされます。certbotを実行した際に、nginxのconfファイルが編集されていました。デフォルトと比較してみると、以下の記述が追加されていますね。※ドメイン名など一部ぼかしています。

server {

        # SSL configuration
        #
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        #
        # Note: You should disable gzip for SSL traffic.
        # See: https://bugs.debian.org/773332
        #
        # Read up on ssl_ciphers to ensure a secure configuration.
        # See: https://bugs.debian.org/765782
        #
        # Self signed certs generated by the ssl-cert package
        # Don't use them in a production server!
        #
        # include snippets/snakeoil.conf;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;
    server_name saito-test.<ドメイン>.jp; # managed by Certbot


        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }

        # pass PHP scripts to FastCGI server
        #
        #location ~ \.php$ {
        #       include snippets/fastcgi-php.conf;
        #
        #       # With php-fpm (or other unix sockets):
        #       fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        #       # With php-cgi (or other tcp sockets):
        #       fastcgi_pass 127.0.0.1:9000;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #       deny all;
        #}


    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/saito-test.<ドメイン>.jp/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/saito-test.<ドメイン>.jp/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = saito-test.<ドメイン>.jp) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


        listen 80 ;
        listen [::]:80 ;
    server_name saito-test.<ドメイン>.jp;
    return 404; # managed by Certbot


}


今回は以上です。

まとめ

格安VPSを利用すると、ほとんどすべての設定を自分で行わなければなりません。その中には、通信のSSL化も含まれます。SSL化は、ウェブサイトのセキュリティを強化し、ユーザーの信頼を得るために欠かせない重要な設定です。しかし、SSL証明書を有料で取得するのは、コストの面で負担が大きいと感じることもあります。


そこで、"Let’s Encrypt"という無料のSSL証明書を提供しているサービスが非常に役立ちます。


“Let’s Encrypt"は、無料で利用できるだけでなく、certbotというプラグインを使うことで設定自体も簡単に行えます。これにより、SSL化のハードルが大幅に下がり、誰でも手軽にHTTPS通信を実現することが可能になります。Let’s Encryptを利用することで、通信の暗号化をコストをかけずに実現できるため、予算が限られているプロジェクトや、検証目的で利用する場合に非常に有効です。


さらに、証明書の自動更新機能を利用すれば、更新作業の手間も省けます。これにより、運用の効率化も図れます。実際に私もLet’s Encryptを使って格安VPSの通信をSSL化し、無料でHTTPS通信を実現しました。その過程で、certbotの使い方や設定方法を学びましたが、思った以上に簡単に設定できました。


この記事を通じて、同じようにSSL化に挑戦しようとしている方々の手助けができればと思います。コストを抑えつつ、ウェブサイトのセキュリティを強化したい方や、検証目的でSSL化を試してみたい方は、ぜひLet’s Encryptを活用してみてください。手軽に始められ、効果的にサイトの安全性を向上させることができます。

参考リンク:Let’s Encrypt