CentOS 5.xでLet's Encrypt

CentOS5.x/Apache 2.2.19のSSL/TLS証明書の有効期限切れに対応することになったのでメモとして残しておくことにしました。

# 方式
- 証明書はcertbotを使って取得
- 認証局はLet's Encrypt
- 証明書はCentOS5.xとは別のホストのcertbotで証明書をDNS認証で発行

# 動作確認環境
今回対応するCentOS5.xのサーバは本番環境しかないため、まずは動作を確認するため検証環境の構築から始めます。

検証環境はKVMゲストとして以下の緒元で作成しました。
CentOS 5.5を選択した理由は手持ちのCentOS 5系のisoがCentOS 5.5だけだったので特に意味はありません。

| # |  |
| --- | --- |
| ホストOS | CentOS 8 Stream |
| IP | 192.168.1.55/24 |
| メモリ | 512 MB |
| OS | CentOS 5.5 |
| httpd | Apache 2.2.19 (ソースからインストール) |
| openssl | 1.0.12u (ソースからインストール) |

#### CentOS5.5のインストール

cent55.cfgを以下の内容で作成

```
install

cdrom
text
skipx
reboot

keyboard    jp106
timezone    Asia/Tokyo
key         --skip
lang        en_US.UTF-8
network     --device eth0 --bootproto static --ip 192.168.1.55 --netmask 255.255.255.0 --gateway 192.168.1.1 --nameserver 192.168.1.1

rootpw      --iscrypted $6$JNY9rzBjiwK4HgJQ$A3Nac/jusuRE0q1RYK1ZNq.LVz4k0w8t6TGmDM55yxGkPHP64m466BrPlHBKuHr4feIlTYu0Wb4q0jqnBQbu1

firewall    --disabled
selinux     --disabled
authconfig  --enableshadow --passalgo=sha512

zerombr     yes
bootloader  --location=mbr --driveorder=vda --append="console=ttyS0,115200n8"

clearpart   --all --initlabel
autopart

%packages   --nobase
```

インストール開始

```
virt-install \
    --name cent55 \
    --initrd-inject cent55.cfg \
    --hvm \
    --virt-type kvm \
    --ram 512 \
    --vcpus 1 \
    --arch x86_64 \
    --cpu kvm64 \
    --os-type linux \
    --os-variant rhel5.5 \
    --graphics none \
    --disk=/var/lib/libvirt/images/cent55.img,format=qcow2,size=8,bus=virtio,cache=none \
    --location /export/isos/CentOS-5.5-x86_64-bin-DVD-1of2.iso \
    --network bridge=br0 \
    --extra-args "edd=off console=tty0 console=ttyS0,115200n8 ks=file:/cent55.cfg" \
    --serial pty
```

インストール完了

```


    GNU GRUB  version 0.97  (639K lower / 523104K upper memory)

 +-------------------------------------------------------------------------+
 | CentOS (2.6.18-194.el5)                                                 |
 |                                                                         |
 |                                                                         |
 |                                                                         |
 |                                                                         |
 |                                                                         |
 |                                                                         |
 |                                                                         |
 |                                                                         |
 |                                                                         |
 |                                                                         |
 |                                                                         |
 +-------------------------------------------------------------------------+
      Use the ^ and v keys to select which entry is highlighted.
      Press enter to boot the selected OS, 'e' to edit the
      commands before booting, 'a' to modify the kernel arguments
      before booting, or 'c' for a command-line.

   The highlighted entry will be booted automatically in 1 seconds.
```

ログイン

```
/boot: clean, 35/26104 files, 15947/104388 blocks

[  OK  ]
Remounting root filesystem in read-write mode:  [  OK  ]
Mounting local filesystems:  [  OK  ]
Enabling /etc/fstab swaps:  [  OK  ]
INIT: Entering runlevel: 3
Entering non-interactive startup
Checking for hardware changes [  OK  ]
Bringing up loopback interface:  [  OK  ]
Bringing up interface eth0:  [  OK  ]
Starting system logger: [  OK  ]
Starting kernel logger: [  OK  ]
Starting system message bus: [  OK  ]
Mounting other filesystems:  [  OK  ]
Starting HAL daemon: [  OK  ]
Starting sshd: [  OK  ]

CentOS release 5.5 (Final)
Kernel 2.6.18-194.el5 on an x86_64

localhost.localdomain login: root
Password:
Last login: Tue Apr 27 07:31:02 on ttyS0
[root@localhost ~]#
```

yumリポジトリを変更
CentOS5 は 2017/03/31 にサポートが切れているのでyumのリポジトリを変更します。

```
# sed -i \
 -e 's/^mirrorlist=/#mirrorlist=/' \
 -e 's/^#baseurl=/baseurl=/' \
 -e 's/mirror.centos.org\/centos/archive.kernel.org\/centos-vault/' \
 -e 's/\$releasever/5.5/g' \
 /etc/yum.repos.d/CentOS-Base.repo
```

httpdとopensslのコンパイルに必要なパッケージをインストールします。

```
# yum -y install curl gcc gnutls-devel make openssl-devel pcre pcre-devel wget zlib-devel
```
#### httpdインストール

Apache httpd 2.2.19のソースダウンロード → コンパイル → インストール

```
# curl -k -O https://archive.apache.org/dist/httpd/httpd-2.2.19.tar.gz
# tar xzvf httpd-2.2.19.tar.gz -C /usr/local/src/
# cd /usr/local/src/httpd-2.2.19
# ./configure --enable-mods-shared="all ssl" --with-included-apr
# make
# make install
```

httpdの起動と確認

```
# /usr/local/apache2/bin/apachectl start
```
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/f1b431da-5c60-c802-2164-3416a96f0256.png)

---

今回は証明書の検証なので検証用のドメインを取得してhttps://(ドメイン名)/で正常にアクセス出来る事を確認する必要があります。
また証明書は上で構築したCentOS5.5とは別のホストのcertbotでDNS認証により発行するのでDNSサーバも必要となります。

今回は以下の２つフリーサービスを使うことにしました。
- ドメイン取得 → [freenom](https://www.freenom.com/ja/index.html)
- DNSサーバ → [serverspace](https://serverspace.io/services/dns-hosting/)

#### ドメイン取得

例としてドメインはcerts-test.tkを取得します。
[freenom](https://www.freenom.com/ja/index.html)のサイトにアクセスしてドメインの利用状況を確認します。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/68d94661-2067-13b1-324c-3f0e78c6584f.png)

「certs-test.tk」を選択します。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/c8f79e4e-a79e-9c34-5c16-d39a00e9a62a.png)

しかし「今すぐ入手」をクリックすると×利用不可の表示に変わってしまいます。
![03-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/01a23951-3f33-e771-0172-69b773ec7701.png)

ドメインの利用状況の確認を「certs-test.tk」で行うと
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/d6688306-b889-7da8-afdd-70fe348fa846.png)

利用可能となるので、「チェックアウト」をクリックして先にすすみます。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/dfc15e22-9245-b5f8-914c-492ea7cab31b.png)

デフォルトでは「3 Months@FREE」が選択されていますが、無料なので「12 Months@FREE」を選択しました。
※「12 Months@FREE」なのに「1　Year @ USD 9.95」な理由は分かりません。

「Continue」をクリックして先に進みます。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/45b7c5c0-f176-73c9-652d-8f36b3839685.png)

Review & Checkout画面が表示されるのでメールアドレスを登録します。
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/23258955-72cb-db68-676b-9bcae082aa12.png)

「Verify My Email Address」をクリックすると確認メールが届くので、メール内のリンクをクリックします。
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/04467772-51d2-e59a-7131-207406641840.png)

Your Detailsを埋め、利用規約をチェックして「Complete Order」をクリックします。
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/1b177f34-1dd7-f9d0-78ac-fae148aabe7c.png)

Order Confirmation画面が表示されるので「Click here to go to your Client Area」をクリックします。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/b0bcf3f0-4e83-81a3-5d8b-6a095110e6d4.png)

#### name server登録

ログイン画面が表示されたら、登録したメールアドレスとパスワードでログインします。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/2f091c20-1055-33dc-8c17-eb81e41acd57.png)

ログインしたら、「Service」→「My Domains」を選択します。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/2047c9a3-4b9b-7f4b-e51d-28fae4e51719.png)

certs-test.tkの「Manage Domain」をクリックします。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/bd19e4e2-d534-a90b-c07d-67999e2cc9aa.png)

「Management Tools」→「Nameservers」を選択します。
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/08caefaa-4399-e17c-0754-0d7eb01b891f.png)

Use custom nameserversを選択します。
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/82363753-c9a3-4584-9f0c-f70e913a5edf.png)

freenomの画面はこのままにしておき、別のブラウザやタブなどから[serverspace](https://serverspace.io/)のサイトにアクセスします。
メールアドレスを登録してアカウントを作成します。
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/79ff0aa1-17de-81d4-b870-b72596c8ecde.png)

確認メールが届くのでメール内の「CONFIRM」をクリックします。
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/35febea3-c13e-52cf-21cb-d08392f66e8b.png)

パスワードが書かれたメールが届きます。
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/505579c4-1082-4952-a705-247ab4d8cd7d.png)

[serverspace](https://serverspace.io/)のサイトにアクセスして登録したメールアドレスと、↑のメールで届いたパスワードでログインします。
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/9bf85df7-1141-8ff3-9fc5-038bf9fcd069.png)

「DNS」をクリックします。
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/e82892b5-c077-86d7-6a4d-65c7edd26906.png)

「ADD DOMAIN」をクリックします。
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/141c2ef1-4758-8ef2-b833-115c6fd73a8b.png)

freenomで取得したドメイン「certs-test.tk」を入力して「ADD DOMAIN」をクリックします。
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/22a454cb-7234-a859-b89a-8e99785e6a46.png)

2つのNSレコードのname serverをCopyして、freenomのnameserver1とnameserver2に登録します。
![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/91e299c3-1eff-3272-238c-d5358ce3a9b4.png)

freenomのnameserver1とnameserver2に登録が完了したら「Change Nameservers」をクリックします。
![24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/0358a28c-d793-747b-46b7-9429f01e829d.png)

以上でfreenomでの作業は終了です。
![25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/1aef34a6-1a4c-b7dc-9384-39958ba3296d.png)

serverspaceの画面で「CREATE RECORD」をクリックします。
![26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/9a388e03-999c-828b-2a2b-5979c01bc905.png)

Domain nameに＠、IP addressにグローバルIP、TTLを適当に設定して「CREATE RECORD」をクリックします。
![27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/c90065c8-5243-1565-8a50-e0df52594872.png)

グローバルIPはifconfig.ioやipconfig.ioなどにアクセスすると確認できます。
![28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/5bc1615d-36bb-9cf6-974a-7233e27379ae.png)

レコードが追加され「certs-test.tk」ドメインで検証用CentOS5.xにアクセスできるようになります。
![29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/a22d74fb-afcc-d6c9-fb1f-ba650b583607.png)

今回の検証環境ではインターネットからのリクエストがホストOS(CentOS 8 Stream)に着信するので、着信したhttp(tcp:80)とhttps(tcp:443)の通信をCentOS5.5へポートフォワードするように設定します。

```
# firewall-cmd --zone=external --add-forward-siamsport=port=80:proto=tcp:toport=80:toaddr=192.168.1.55
# firewall-cmd --zone=external --add-forward-port=port=443:proto=tcp:toport=443:toaddr=192.168.1.55
```

ドメイン(certs-test.tk)でアクセスできるようになりました。
![30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/7c5f8d14-a96f-65cc-4a7b-1e0ab181e324.png)

#### 証明書作成

ここまでで検証環境の構築が完了したので、いよいよ証明書を作成します。
証明書はホストOS(CentOS 8 Stream)のcertbotを使用してDNS認証で作成します。

```
# certbot certonly \
        --manual \
        --domain certs-test.tk \
        --email certs-test@XXXXXXXX.xxx \
        --agree-tos \
        --preferred-challenges dns-01 \
        --server https://acme-v02.api.letsencrypt.org/directory
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Requesting a certificate for certs-test.tk
Performing the following challenges:
dns-01 challenge for certs-test.tk

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.certs-test.tk with the following value:

VLdtOLi2Rmy9JbuZCeAbB1yYE4h-xm8MqgXwl042a_U

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
```
**注意** ここではまだEnterを押下しないでください。

serverspaceのDomainに↑で表示されたTXTレコードを追加します。
![31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/1ca54075-221d-896c-995f-6af5ebeed1d7.png)
![32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/652a8d41-a1f9-1536-324e-c5627a89f9f1.png)

TXTレコードが登録されたことを確認してから、certbot画面でEnterを押下します。

```
# dig +short _acme-challenge.certs-test.tk txt
"VLdtOLi2Rmy9JbuZCeAbB1yYE4h-xm8MqgXwl042a_U"
```

```
Press Enter to Continue (Enter)
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/certs-test.tk/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/certs-test.tk/privkey.pem
   Your certificate will expire on 2021-07-29. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
```

/etc/letsencrypt/archive/certs-test.tkに証明書が作成されるのでCentOS5.5に転送します。

```
# pwd
/etc/letsencrypt/archive/certs-test.tk
# scp fullchain1.pem privkey1.pem 192.168.1.55:/usr/local/apache2/conf/
Warning: Permanently added '192.168.1.55' (RSA) to the list of known hosts.
root@192.168.1.55's password:
fullchain1.pem                                100% 3424     3.8MB/s   00:00
privkey1.pem                                  100% 1704     2.3MB/s   00:00
```

CentOS5.5にログインしてapacheの設定を変更します。

```
# cd /usr/local/apache2/conf

# vi httpd.conf
Include conf/extra/httpd-ssl.conf ←　コメントアウトを削除

# vi extra/httpd-ssl.conf (下記２箇所を以下のように変更)
SSLCertificateFile "/usr/local/apache2/conf/fullchain1.pem"
SSLCertificateKeyFile "/usr/local/apache2/conf/privkey1.pem"
```

Apacheを再起動してアクセスしてみます。

```
/usr/local/apache2/bin/apachectl restart
```

エラーです。
![33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/0696a86a-92ef-4d38-4ac6-51220e7cad16.png)

詳細情報を見てみましょう。
![34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/eef518f0-63da-cf18-b574-93147b8708d7.png)

「サーバーはTLS1.2以降を使用する必要があります。」
証明書は有効ですが、サーバー(Apache)がTLS1.2に対応していないためエラーとなります。

### TLS1.2対応
それでは、CentOS5.5のApacheをTLS1.2に対応しましょう。
以下はCentOS5.5での作業です。

```
# curl -k -O https://ftp.openssl.org/source/old/1.0.2/openssl-1.0.2u.tar.gz
# tar xzvf openssl-1.0.2u.tar.gz -C /usr/local/src/
# cd /usr/local/src/openssl-1.0.2u/
# ./config shared enable-ssl2 enable-ssl3 enable-md2 --prefix=/usr/local/openssl-1.0.2u
# make
# make install

# cd /usr/local/openssl-1.0.2u/lib/
# ln -s libssl.so.1.0.0 libssl.so.6
# ln -s libcrypto.so.1.0.0 libcrypto.so.6

# cd /usr/local/apache2/bin
# cp -a envvars envvars_bak

# vi envvars
LD_LIBRARY_PATH="/usr/local/apache2/lib:$LD_LIBRARY_PATH"
                            ↓変更
LD_LIBRARY_PATH="/usr/local/openssl-1.0.2u/lib:/usr/local/apache2/lib:$LD_LIBRARY_PATH"
```

Apacheを再起動してアクセスしてみます。

```
/usr/local/apache2/bin/apachectl restart
```

今度は正常にアクセス出来ました。
![35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246630/98484033-1d9e-ce7e-77d2-4dcb00c61944.png)

### まとめ
今回は検証環境を構築するためドメインの取得から行ったので手順が多かったですが、実環境ではcertbotで証明書をDNS認証で作成し、CentOS5.xにはTLS1.2に対応したopensslをインストールすれば良いことが分かりました。

Let's Encryptでは証明書の更新を3ヶ月以内に行う必要がありますが、更新はAnsibleなどを使えば簡単に行えるかと思います。

証明書の更新作業についてはまた別の機会に書こうと思います。