2022年5月アーカイブ

SeversMan@VPSでLet's Encryptを導入

ServersMan@VPSのCentOS7でLet's Encryptを導入したので、備忘用のメモです。

低価格VPSであるServersMan@VPSですが、OpenVZという仮想化ソフトウェアを使っている点が特徴的です。
通常の仮想マシンとは異なり、どちらかといえばコンテナ寄りの方式です。
しかし、これに癖があり、デフォルトではinitscriptsパッケージのupdateがされない様になっています。
結果、依存関係が解けず、yum installを通すのが難しいという問題があります。

initscriptsの更新除外を外すという手もあるようですが、今回はrpmコマンドで導入する版の手順です。
※パワープレーで解くやり方になっていますので、実施は自己責任でお願いします。

Let's Encryptの導入手順は以下のサイトを参考に実施しました。
Let's Encryptの使い方〜SSL証明書の取得から更新の自動化まで〜

通常の手順でインストールすると、以下の状態となります。(--skip-brokenを付けてもインストールは成功しません。)
# yum install certbot
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.riken.jp
* extras: ftp.riken.jp
* updates: ftp.riken.jp
依存性の解決をしています
(中略)
エラー: systemd conflicts with initscripts-9.49.17-1.el7_0.1.x86_64
問題を回避するために --skip-broken を用いることができます。
これらを試行できます: rpm -Va --nofiles --nodigest

地道に依存関係を解いて、rpmコマンドでインストールしていきます。
(元々Pythonを使ってないサーバでしたので、インストール順序含め、概ね参考にできると思います。)

まずはパッケージをひたすらwgetします。
# mkdir /tmp/work_certbot
# cd /tmp/work_certbot
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/audit-libs-python-2.3.3-4.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/c/certbot-1.11.0-2.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/checkpolicy-2.1.12-6.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/libcgroup-0.41-6.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/libselinux-python-2.2.2-6.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/libsemanage-python-2.1.10-16.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/policycoreutils-2.2.5-11.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/policycoreutils-python-2.2.5-11.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/pyOpenSSL-0.13.1-3.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/python-IPy-0.75-6.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/python-backports-1.0-6.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/python-backports-ssl_match_hostname-3.4.0.2-4.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-cffi-1.6.0-5.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-chardet-2.2.1-3.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/python-configobj-4.7.2-7.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-enum34-1.0.4-1.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-idna-2.4-1.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-ipaddress-1.0.16-2.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python-ndg_httpsclient-0.3.2-1.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-ply-3.4-11.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-pycparser-2.14-1.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-requests-2.6.0-8.el7_7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python-requests-toolbelt-0.8.0-3.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/python-setuptools-0.9.8-3.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-six-1.9.0-2.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-urllib3-1.10.2-7.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python-zope-component-4.1.0-5.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python-zope-event-4.0.3-2.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/python-zope-interface-4.0.5-4.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-acme-1.11.0-1.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-certbot-1.11.0-2.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-configargparse-0.11.0-2.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python2-cryptography-1.7.2-2.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-distro-1.5.0-1.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-future-0.18.2-2.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-josepy-1.3.0-2.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-mock-1.0.1-10.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-parsedatetime-2.4-6.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python2-pyasn1-0.1.9-7.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-pyrfc3339-1.1-3.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-requests-2.6.0-0.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-six-1.9.0-0.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/pytz-2012d-5.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/setools-libs-3.3.7-46.el7.x86_64.rpm

そして、ひたすらインストールします。
python2-josepy-1.3.0-2.el7.noarch.rpmだけ、python2-setuptoolsの問題が解消できず...。
私の環境では問題なく動いているので、一旦無視しました。
# rpm -ivh audit-libs-python-2.3.3-4.el7.x86_64.rpm
# rpm -ivh checkpolicy-2.1.12-6.el7.x86_64.rpm
# rpm -ivh setools-libs-3.3.7-46.el7.x86_64.rpm
# rpm -ivh libcgroup-0.41-6.el7.x86_64.rpm
# rpm -ivh libselinux-python-2.2.2-6.el7.x86_64.rpm
# rpm -ivh libsemanage-python-2.1.10-16.el7.x86_64.rpm
# rpm -ivh python-IPy-0.75-6.el7.noarch.rpm
# rpm -ivh policycoreutils-2.2.5-11.el7.x86_64.rpm
# rpm -ivh policycoreutils-python-2.2.5-11.el7.x86_64.rpm
# rpm -ivh python-configobj-4.7.2-7.el7.noarch.rpm
# rpm -ivh python2-future-0.18.2-2.el7.noarch.rpm
# rpm -ivh python2-parsedatetime-2.4-6.el7.noarch.rpm
# rpm -ivh python-backports-1.0-6.el7.noarch.rpm
# rpm -ivh python-zope-event-4.0.3-2.el7.noarch.rpm
# rpm -ivh python-zope-interface-4.0.5-4.el7.x86_64.rpm
# rpm -ivh python-zope-component-4.1.0-5.el7.noarch.rpm
# rpm -ivh pyOpenSSL-0.13.1-3.el7.x86_64.rpm
# rpm -ivh python2-pyasn1-0.1.9-7.el7.noarch.rpm
# rpm -ivh python-ndg_httpsclient-0.3.2-1.el7.noarch.rpm
# rpm -ivh python-six-1.9.0-2.el7.noarch.rpm
# rpm -ivh python2-six-1.9.0-0.el7.noarch.rpm
# rpm -ivh python-ply-3.4-11.el7.noarch.rpm
# rpm -ivh python-pycparser-2.14-1.el7.noarch.rpm
# rpm -ivh python-cffi-1.6.0-5.el7.x86_64.rpm
# rpm -ivh python-enum34-1.0.4-1.el7.noarch.rpm
# rpm -ivh python-idna-2.4-1.el7.noarch.rpm
# rpm -ivh python-ipaddress-1.0.16-2.el7.noarch.rpm
# rpm -ivh python2-cryptography-1.7.2-2.el7.x86_64.rpm
# rpm -ivh python-setuptools-0.9.8-3.el7.noarch.rpm
# rpm -ivh python2-setuptools-39.2.0-4.el8.noarch.rpm
# rpm -ivh --force --nodeps python2-josepy-1.3.0-2.el7.noarch.rpm
# rpm -ivh python2-pyrfc3339-1.1-3.el7.noarch.rpm
# rpm -ivh python2-requests-2.6.0-0.el7.noarch.rpm
# rpm -ivh python-chardet-2.2.1-3.el7.noarch.rpm
# rpm -ivh python-urllib3-1.10.2-7.el7.noarch.rpm
# rpm -ivh python-requests-2.6.0-8.el7_7.noarch.rpm
# rpm -ivh python-requests-toolbelt-0.8.0-3.el7.noarch.rpm
# rpm -ivh pytz-2012d-5.el7.noarch.rpm
# rpm -ivh python2-acme-1.11.0-1.el7.noarch.rpm
# rpm -ivh python2-configargparse-0.11.0-2.el7.noarch.rpm
# rpm -ivh python2-distro-1.5.0-1.el7.noarch.rpm
# rpm -ivh python2-mock-1.0.1-10.el7.noarch.rpm
# rpm -ivh python2-certbot-1.11.0-2.el7.noarch.rpm
# rpm -ivh certbot-1.11.0-2.el7.noarch.rpm

Apache等のWEBサーバ系のサービスを停止しないと失敗するので、停止を先に実施します。
そして、以下のコマンドで証明書を導入します。
# certbot certonly --standalone -d www.example.com

ウィザードに従い、メールアドレスの入力や利用規約等の同意を行います。
問題なく終われば、証明書が/etc/letsencrypt/live内に生成されます。

あとはバーチャルホストに証明書の設定を行い、サービスを再起動すれば完了です。
Apacheの場合は、以下のように設定すれば使えると思います。
SSLCertificateFile /etc/letsencrypt/live/ドメイン名/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ドメイン名/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/ドメイン名/chain.pem

Let's Encryptは3か月で証明書の期限切れを迎えるので、自動更新の設定をお忘れなく。
以下のコマンドをcron等で実行すればOKです。
# certbot renew --pre-hook 'systemctl stop httpd' --post-hook 'systemctl start httpd'

補足ですが、certbotコマンド実行時にSSLErrorが出ることがあります。
その場合には、以下のコマンドでサーバ内のCA証明書を更新します。
# yum update ca-certificates