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
今回は証明書の検証なので検証用のドメインを取得してhttps://(ドメイン名)/で正常にアクセス出来る事を確認する必要があります。
また証明書は上で構築したCentOS5.5とは別のホストのcertbotでDNS認証により発行するのでDNSサーバも必要となります。
今回は以下の2つフリーサービスを使うことにしました。
- ドメイン取得 → freenom
- DNSサーバ → serverspace
ドメイン取得
例としてドメインはcerts-test.tkを取得します。
freenomのサイトにアクセスしてドメインの利用状況を確認します。
しかし「今すぐ入手」をクリックすると×利用不可の表示に変わってしまいます。
ドメインの利用状況の確認を「certs-test.tk」で行うと
利用可能となるので、「チェックアウト」をクリックして先にすすみます。
デフォルトでは「3 Months@FREE」が選択されていますが、無料なので「12 Months@FREE」を選択しました。
※「12 Months@FREE」なのに「1 Year @ USD 9.95」な理由は分かりません。
Review & Checkout画面が表示されるのでメールアドレスを登録します。
「Verify My Email Address」をクリックすると確認メールが届くので、メール内のリンクをクリックします。
Your Detailsを埋め、利用規約をチェックして「Complete Order」をクリックします。
Order Confirmation画面が表示されるので「Click here to go to your Client Area」をクリックします。
name server登録
ログイン画面が表示されたら、登録したメールアドレスとパスワードでログインします。
ログインしたら、「Service」→「My Domains」を選択します。
certs-test.tkの「Manage Domain」をクリックします。
「Management Tools」→「Nameservers」を選択します。
freenomの画面はこのままにしておき、別のブラウザやタブなどからserverspaceのサイトにアクセスします。
メールアドレスを登録してアカウントを作成します。
確認メールが届くのでメール内の「CONFIRM」をクリックします。
serverspaceのサイトにアクセスして登録したメールアドレスと、↑のメールで届いたパスワードでログインします。
freenomで取得したドメイン「certs-test.tk」を入力して「ADD DOMAIN」をクリックします。
2つのNSレコードのname serverをCopyして、freenomのnameserver1とnameserver2に登録します。
freenomのnameserver1とnameserver2に登録が完了したら「Change Nameservers」をクリックします。
serverspaceの画面で「CREATE RECORD」をクリックします。
Domain nameに@、IP addressにグローバルIP、TTLを適当に設定して「CREATE RECORD」をクリックします。
グローバルIPはifconfig.ioやipconfig.ioなどにアクセスすると確認できます。
レコードが追加され「certs-test.tk」ドメインで検証用CentOS5.xにアクセスできるようになります。
今回の検証環境ではインターネットからのリクエストがホスト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)でアクセスできるようになりました。
証明書作成
ここまでで検証環境の構築が完了したので、いよいよ証明書を作成します。
証明書はホスト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レコードを追加します。
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 (下記2箇所を以下のように変更)
SSLCertificateFile "/usr/local/apache2/conf/fullchain1.pem"
SSLCertificateKeyFile "/usr/local/apache2/conf/privkey1.pem"
Apacheを再起動してアクセスしてみます。
/usr/local/apache2/bin/apachectl restart
「サーバーは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
まとめ
今回は検証環境を構築するためドメインの取得から行ったので手順が多かったですが、実環境ではcertbotで証明書をDNS認証で作成し、CentOS5.xにはTLS1.2に対応したopensslをインストールすれば良いことが分かりました。
Let's Encryptでは証明書の更新を3ヶ月以内に行う必要がありますが、更新はAnsibleなどを使えば簡単に行えるかと思います。
証明書の更新作業についてはまた別の機会に書こうと思います。