> For AI agents: the complete documentation index is available at /resource/ucidm/docs/on-premise/1.9.0/llms.txt, the full documentation bundle is available at /resource/ucidm/docs/on-premise/1.9.0/llms-full.txt.

# サーバー証明書自動更新設定手順 \{#mod-md}

UCIDMのWebサーバーの証明書をACMEプロトコルで自動更新する手順を説明します。

# 前提条件 \{#prerequisites}

設定手順を説明するにあたって、以下の条件を前提とします。

- OSはRHEL系を利用していること
- WebサーバーはApache HTTPD サーバーを利用していること
- ACMEクライアントには `mod_md` を利用すること

# 設定手順概要 \{#overview}

設定手順はおおまかに以下の通りです。

1. 事前準備
2. `mod_md` のインストール
3. `mod_md` の設定
4. 証明書の取得

## 事前準備 \{#preparation}

`mod_md` を利用するためには、Webサーバーに外部からHTTP/HTTPSでアクセスできる必要があります。
また、証明書を取得するドメイン名が、DNSで正しく引ける必要があります。
DNS設定やファイアウォール設定を事前に確認してください。

また、Apache HTTPDサーバーや、UCIDMの設定は事前に行ってください。

## `mod_md` のインストール \{#install-mod-md}

以下のコマンドで `mod_md` をインストールします。

```console
# dnf install -y mod_md
```

以下のコマンドで `mod_md` がロードされていることを確認してください。

```console
# httpd -M | grep md
 md_module (shared)
```

## `mod_md` の設定 \{#configure-mod-md}

`mod_md` の設定を行います。
ここでは `/etc/httpd/conf.d/md.conf` に `mod_md` の設定を追加します。

```apache
<IfModule md_module>
  MDContactEmail root@example.com
  MDomain www.example.com
  MDPrivateKeys RSA 4096
  MDRenewWindow 10%

  #MDCertificateAuthority https://acme-staging-v02.api.letsencrypt.org/directory
  MDCertificateAuthority https://acme-v02.api.letsencrypt.org/directory
  MDCertificateAgreement accepted
</IfModule>
```

- `MDContactEmail` は証明書に関連する連絡先メールアドレスを指定します。
- `MDomain` は証明書を取得するドメイン名を指定します。複数のドメイン名を指定する場合はスペースで区切ってください。
- `MDCertificateAuthority` は利用するACME認証局のURLを指定します。
  - ACME認証局のURL例は以下になります。

|       ACME認証局      |                            URL                           |
| :----------------: | :------------------------------------------------------: |
| Let's Encrypt 本番環境 |     `https://acme-v02.api.letsencrypt.org/directory`     |
| Let's Encrypt 検証環境 | `https://acme-staging-v02.api.letsencrypt.org/directory` |
|   UPKI電子証明書発行サービス  |            `https://secomtrust-acme.com/acme/`           |

また、UPKI電子証明書発行サービスのような、EAB Credentialが必要なACME認証局を利用する場合は、以下の設定も追加してください。

```apache
  MDExternalAccountBinding <key-id> <hmac>
```

`/etc/httpd/conf/httpd.conf` も編集します。
すでに `SSLCertificateFile` や `SSLCertificateKeyFile` が設定されている場合はコメントアウトしてください。

```apache
<VirtualHost *:443>
  ...
  #SSLCertificateFile /path/to/cert.pem
  #SSLCertificateKeyFile /path/to/key.pem

  SSLEngine on
  ...
</VirtualHost>
```

`mod_md` が証明書の取得に合わせて、読み込みまで行ってくれるので、これらの設定は不要になります。

また、ACMEプロトコルでは80番ポートをリッスンすることが必須になります。
そのため、80番ポートから443番ポートへのHTTPS通信へリダイレクトする設定を追加することを推奨します。

```apache
<VirtualHost *:80>
  ...
  RewriteEngine on
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  ...
</VirtualHost>
```

`mod_md` のログを確認するには `info` 以上のログレベルが必要になります。
`/etc/httpd/conf/httpd.conf` に以下の設定を追加してください。

```apache
LogLevel md:info
```

すべての設定が完了したら、以下のコマンドでエラーが出ないことを確認してください。

```console
# httpd -t
Syntax OK
```

## 証明書の取得 \{#obtain-certificate}

`mod_md` の設定が完了したら、Apache HTTPDサーバーは次回起動時に自動で証明書の取得を行います。
また `mod_md` は最初に、証明書を取得するためのHTTPS通信に利用する、一時的な自己署名証明書を自動で生成します。
そのため実際に公的な証明書を取得するには、Apache HTTPDサーバーを2回再起動する必要があります。

1度目の再起動を行います。

```console
# systemctl restart httpd
```

`/etc/httpd/state/md/domains/<ドメイン名>/` に自己署名証明書が生成されていることを確認してください。

```console
# ls /etc/httpd/state/md/domains/www.example.com/
fallback-privkey.pem  fallback-pubcert.pem  ...
```

2度目の再起動を行います。

```console
# systemctl restart httpd
```

`/etc/httpd/state/md/domains/<ドメイン名>/` に公的な証明書が生成されていることを確認してください。

```console
# ls /etc/httpd/state/md/domains/www.example.com/
privkey.pem  pubcert.pem ...
```

ブラウザからアクセスし、証明書が正しく取得されていることを確認してください。

## 証明書の自動更新 \{#verify-auto-renewal}

`mod_md` では `mod_watchdog` というモジュールを利用して、定期的に証明書の有効期限を確認し、必要に応じて自動更新を行います。
そのため `cron` などで定期的にスクリプトやコマンドを実行する必要はありません。

`mod_md` が証明書を更新した際は `error_log` にログが出力されます。
以下のようなログが出力されていれば、自動更新が正常に動作しています。

```log
[Mon Feb 09 15:03:11.588025 2026] [md:info] [pid 1111:tid 2222] AH10068: www.example.com: staged set activated
[Mon Feb 09 15:03:11.610129 2026] [md:info] [pid 1111:tid 2222] AH10071: mod_md (v2.4.26-git), initializing..
```
