タイガーラック クリエイティブブログ
2024
October
17

【Certbot】CentOS7+Apache2.4にLet’s Encryptで証明書発行

最近社内サーバーにCertbotによる証明書発行をする機会がありましたので、今回はその際の手順を紹介します。

環境

  • CentOS Linux 7
  • Apache/2.4.6
  • certbot 1.11.0

作業要項

  • 以前は別の方が管理していたサーバー内での証明書発行。
  • 証明書発行を行うドメイン名はexample.com(仮定)。
  • 既に証明書が存在するが、一つの証明書内にdevelopment環境のドメインが混在している。
  • example.com用の証明書を新しく発行したい。

手順

既存の証明書が存在するかチェック

certbot certificates

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
    Certificate Name: example.com
    Serial Number: e18d7e89ae465175c7b89e96d178b202
    Key Type: RSA
    Domains: example.com, www.example.com, development.example.com
    Expiry Date: 2023-10-01 00:00:00+00:00 (VALID: 50 days)
    Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

certbot certificatesコマンドを入力することで、certbotで取得された既存の証明書を一覧表示することが出来ます。

  • 証明書名(letsencryptディレクトリ内のファイル名)
  • 紐付けられたドメイン
  • 証明書の期限
  • 証明書の保存先

といった情報が確認できます。

certbot証明書更新用のconfファイルをチェック

cd /etc/letsencrypt/renewal
vi example.com.conf

証明書の存在が確認できたので、次に/etc/letsencrypt/renewal内に存在している証明書更新の設定ファイルを開き、設定を確認します。

# renew_before_expiry = 30 days
version = 1.11.0
archive_dir = /etc/letsencrypt/archive/example.com
cert = /etc/letsencrypt/live/example.com/cert.pem
privkey = /etc/letsencrypt/live/example.com/privkey.pem
chain = /etc/letsencrypt/live/example.com/chain.pem
fullchain = /etc/letsencrypt/live/example.com/fullchain.pem

# Options used in the renewal process
[renewalparams]
authenticator = webroot
account = ce311857de64148db5375b8c2521868f
manual_public_ip_logging_ok = None
server = https://acme-v02.api.letsencrypt.org/directory
webroot_path = /var/www/example.com, /var/www/example.com, /var/www/development.example.com
[[webroot_map]]
example.com = /var/www/example.com
www.example.com = /var/www/example.com
development.example.com = /var/www/development.example.com

中には証明書更新の為の各種設定が書かれています。
以前発行された証明書の設定が書かれているので、読んでおくと現在の状態が把握しやすくなります。

webサーバーのディレクトリ内に認証用ディレクトリを作成する

mkdir -p /var/www/certbot/example.com

証明書発行の際、certbotがhttp://example.com/.well-known/acme-challengeへのアクセスを試みるのですが、その際ベーシック認証等のアクセス権が必要なディレクトリが指定されている場合、エラー出てしまうので対策が必要になります。
今回はwebサーバーのディレクトリ内に/certbot/example.comというディレクトリを作成し、その中で認証を行うように設定します。

Apacheの設定を変更する

<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com

<Directory "/var/www/certbot/example.com/">
Require all granted
</Directory>

Alias /.well-known /var/www/certbot/example.com/.well-known
</VirtualHost>

Apacheの各ドメインの設定が書かれたconfファイル内に、認証用のDirectoryAliasの設定を追記します。
まず<Directory>により証明書用のディレクトリへのアクセスを許可し、次にAliasによってweb上からhttp://example.com/.well-known下にアクセスした場合に、証明書用のディレクトリへアクセスされるようにします。
また、httpsへのリダイレクト設定が書かれている場合は一度コメントアウトしておくと良いでしょう。

既存の証明書の失効

certbot revoke --cert-path /etc/letsencrypt/live/example.com/cert.pem

既存の証明書が残った状態では証明書発行時に既存証明書の更新が優先されてしまい、上手く証明書発行が出来ないケースがあるので、新規発行したいドメインが含まれている証明書をrevokeコマンドにより失効させます。

新規証明書の発行

certbot certonly --dry-run --webroot -w /var/www/certbot/example.com -d example.com -d www.example.com

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

各種処理が終わったら証明書を発行します。-wには認証用に作成したディレクトリ、-dにはドメインを指定します。また、発行を行う際はまず–dry-runオプションを使用し、証明書の発行時にエラーが出ないかチェックを行い、The dry run was successful.と表示されるのを確認した上で行います。

Apacheの設定を変更する

<VirtualHost *:80>
(各種設定)

RewriteEngine on
RewriteCond %{SERVER_NAME} =example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<VirtualHost *:443>
(各種設定)

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
</VirtualHost>

証明書の発行が終わったら、再度ドメイン設定が書かれたconfファイルを開き設定を追記します。
追記するのは、

  • <VirtualHost *:80>内にhttpsへのリダイレクト
  • <VirtualHost *:443>内に証明書のファイル指定

この2つになります。一度証明書が作られたことのあるドメインであれば、SSLCertificateFile以下を修正するだけで使用できる状態になるかと思います。example.comの部分は証明書名になるので、不明な場合はcertbot certificatesコマンドで確認すると良いでしょう。

まとめ

全体の流れとしては、
1.現在の証明書の状態を確認
2.証明書発行の為の設定変更
3.既存の証明書の削除
4.新しく証明書を発行
5.ssl用の設定追記
というような形で行いました。
初めて見るVPSの場合、certbot certificatesコマンドと/etc/letsencrypt/renewalディレクトリ内から得られる情報量が多いので、とりあえずこの辺りから確認を始めると作業がやりやすいですね。
証明書の再取得が必要になることがあれば、まずはこの辺りの確認から始めてみてはいかかでしょうか。

このカテゴリの最新記事

関連記事

SHOP LIST

タイガーラック株式会社

〒577-0056
大阪府東大阪市長堂1-3-14 TOKUYASU Bld.