Hero img
certbotを使って無料でSSL証明書を取得し、webページをhttps化する方法

certbotを使って無料でSSL証明書が取得する。

無料のSSLをcertbotを使って取得し、webをhttpsにする


目次

  • 目標
  • 環境
  • certbotとは
  • certbotのインストール
  • certbot webroot
  • 証明書の更新
  • 404エラー
  • certbotの一時ファイル生成場所の修正
  • certbotについて
  • certbotは何をするのか?
  • ウェブサーバ
  • Apache,nginxで認証をする
  • apach nginx用のプラグイン
  • 為になるサイト
  • まとめ

目標

certbotを使ってwebページをhttps化します。

環境

  • AlmaLinux 9.1
  • nginx

certbotとは

certbotとは、SSL証明書の自動化ツールであり、無料のSSL証明書を取得することができます。この記事では、certbotを使用してnginxサーバーでSSL証明書を設定する方法を説明します。

certbotのインストール

certbotをインストールするには次のコマンドを実行します。

dnf install certbot

インストールできない場合アップデート等をしてみてください。

dnf update 
dnf install epel-release

インストールが完了したら、動作確認をします。

certbot --version

certbot webroot

Webrootを使用すると、Let's Encryptがドメイン所有者であることを確認するために、ディレクトリの特定のフォルダに一時ファイルを確認します。

そのため、正しいディレクトリの設定や80ポートの解放がされていないと証明書を取得できません。

1.certobtの起動

certbot certonly

2.既に起動しているウェブサーバーを使って認証をする

2のwebrootを指定する。 certbot-webroot

初期設定

初めてcertbotを使用する際はこの後に以下3つを聞いてきます。

  • Emailアドレス
  • letsencryptの使用同意するかどうか?
  • メールでお知らせを受け取るかどうか? certbot-first-start

3.ドメインを入力 今回設定するドメインを入力します。

certbot-set-domain

4.ドメインのディレクトリ このドメインのルートディレクトリを指定します。
この場合「/var/www/customdomain-directory」になります。この中にindex.htmlなどが入っています。 certbot-set-directory.png

認証成功

成功すると「fullchain.pem」と「privkey.pem」のフルパスが表示されます。 certbot-success

5.nginxを修正

先ほどのフルパスをssl_certificate,ssl_certificate_keyに追加します。

nginx.conf
server {
server_name customdomain.com;
   listen 80;
return 301 https://$host$request_uri;
}
server {
    listen 443 ssl;
    ssl_certificate     /etc/letsencrypt/live/customdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/customdomain.com/privkey.pem;
    server_name  customdomain.com;
    access_log  /var/log/nginx/customdomain.com.access.log;
    location / {
        root   /var/www/customdomain.com;
        index  index.html ;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

6.nginxの再起動

証明書を読み込ませるためにnginxを再起動させます。

systemctl restart nginx

これでssl化が無事できたと思います。

ちなみに以下のように一度に記入することもできます。

certbot certonly --webroot -w /var/www/customdomain.com -d customdomain.com

証明書の更新

certbotで証明書を更新する場合は次のコマンドを実行しますが、 その前にテスト実行用の--dry-runを付けて実行してみます。

certbot renew --dry-run

404エラー

更新しようとすると 私の場合404エラーが複数起きてしまって!!?
ちょっと何言ってるのか分からないのだけど...
404...ファイルが無いの?

エラーの内容

Processing /etc/letsencrypt/renewal/domeins.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Simulating renewal of an existing certificate for domeins.com

Certbot failed to authenticate some domains (authenticator: webroot). The Certif
  Domain: domeins.com
  Type:   unauthorized
  Detail: 22.222.222.222: Invalid response from https://yumeno.me/.well

Hint: The Certificate Authority failed to download the temporary challenge filesom the internet.

Failed to renew certificate yumeno.me with error: Some challenges have......

まぁこんな感じのエラーが起きてしまいました。
調べて行くとポート?DNSレコード??リバースプロキシ使ってるから?? 色々と原因があるようですが...

結論

一時ファイルの生成場所が違いました。

certbotの一時ファイル生成場所の修正

更新する際certbot読み込みをする設定ファイルがありそこの修正を行います。

confを修正する

/etc/letsencrypt/renewal
# Options used in the renewal process
[renewalparams]
account = 1c8fa634d79e5f0b1a49a15f90200764
authenticator = webroot
webroot_path = /var/www/yumeno.me, #<--こいつ
server = https://acme-v02.api.letsencrypt.org/directory
key_type = rsa
[[webroot_map]]
yumeno.me = /var/www/yumeno.me #<--こいつ

webroot_pathとwebroot_mapの二つのパスが違いましたので、ここの2つのパスを直すことによって無事に404エラーが解決されました。

certbotについて

certbotは何をするのか?

certbotがどのよう証明書を取得するのか?

  1. 1.まず、この(SSL証明書が欲しい)サーバーがLetsecnryptにコマンドを投げます。
  2. 2.Letsecnryptが指定されたドメインのポート80を通って、正しいドメインの所有者かを一時ファイルを参照して、確認します。
  3. 3.Letsecnryptウェブサーバの検証、確認ができたら、ssl証明書を発行します。
  4. 4.certbotが受け取りpemファイルを作り管理します。

そのため、80ポートのウェブサーバーが起動していないと、Letsecnryptアクセス、認証ができないので証明書の発行できません。

ウェブサーバ

SSL証明書を作るのためにはドメインとウェブサーバが必ず必要になります。ウェブサーバを起動するミドルウェアはApacheとnginx。 別の方法としてcertbot自体が80ポートを使って認証時のみウェブサーバとして起動する方法があります。

certbotのウェブサーバ

certbot自体がウェブサーバになる機能

certbot standalone

というコマンドがあります。
が、これを使うことはないでしょう。 これを使う場合certbotが80ポートを要求しますが、通常運用時はnginxやApacheが既に80ポートを使っているので起動ができません。
そのため、このstandaloneを使う場合一度nginx,Apacheを終了させる必要があります。

Apache,nginxで認証をする

既に起動しているウェブサーバを使って認証します。
認証はcertbotが 「指定した場所/.well-known/acme-challenge/」のフォルダに一時的にファイルを作りLetsecnryptが80ポートを通してそのファイルを確認して、認証します。 そのため、80ポートが空いてない場合や、一時ファイルが確認できない場合は証明書の発行がされません。
一時ファイルの生成場所、アクセス許可に注意してください。

apach nginx用のプラグイン

certbotのプラグインがあります。プラグインを利用するとapache,nginxの設定ファイルに自動的追加してくれます。
nginxの場合は以下をインストールします。

python3-certbot-nginx

そしてcertonlyのコマンド外し、--nginxを付けて実行します。

sudo certbot --nginx -d customdomain.com -d customdomain.com

為になるサイト

コマンド実行の参考になりました。 qiita

まとめ

Certbotは、Letsecnryptの自動化ツールであり、80ポートのウェブサーバーが起動していないと証明書を発行できません。既存のApacheまたはnginxウェブサーバを使用して認証を行ってください。Certbotは高機能過ぎるので起動コマンドが結構あります。
certonlyを付けないと証明書取得と、インストール「configファイルに書き込む」まで実行する仕様となっているので、その時プラグインがありませんと怒られてしまう点は注意ください。
nginxの設定ファイルあまり自信ない...

関連記事

コメント

コメントを書く

質問や、間違いがありましたら、お気軽にどうぞ

※お名前とコメントの内容を入力してください。
※全てこのブログ上に公表されます。
※許可なく管理者によって修正・削除する場合がございます。 詳しくはプライバシーポリシーを参照ください