こんにちは、千本木です。
WEBサイトの常時SSL化が進む昨今、無料のSSL証明書であるLet’s Encryptをインストールする機会も増えてきました。
弊社ではCentOSで稼働しているサーバが多いのですが、最新バージョンのCentOS 7だけでなく、CentOS 6で稼働するサーバもまだまだ多くあります。
実際にLet’s Encryptの証明書発行を行ってみると、CentOS 7では労せず動くのに対して、CentOS 6ではちょっとした工夫が必要になりました。
今回はその工夫について記事にしたいと思います。
下準備
Let’s Encryptの証明書を取得する際にはcertbot-autoというコマンドをインストールして使用することになりますが、このcertbot-autoを使用するためにはpython 2.7以上が必要となります。
pythonのバージョンが古く、そのままではLet’s Encryptが動かない
実はCentOS 6のpythonのバージョンはというと
# python --version
Python 2.6.6
ご覧の通り2.6系がインストールされてしまっているため、そのままだと証明書取得に進むことができなくなります。
では削除して新しいバージョンを入れなおせば良いかというと、pythonと依存関係にあるアプリケーションが数多くあるため、現実的に対応ができません。
Software Collectionで対応する
ではどうするかというと、python 2.6系と2.7系を共存させるという手段を取ります。
CentOS向けに公式にSoftware Collectionsというリポジトリがあり、これを使うことで標準パッケージと別バージョンのパッケージを共存させることが可能になります。
やり方は簡単。リポジトリをインストールし、パッケージをインストールすればOKです。
# yum install centos-release-scl-rh
# yum install python27
# vi /etc/profile.d/python27.sh
-----------------------------------------------------
#!/bin/bash
source /opt/rh/python27/enable
export X_SCLS="`scl enable python27 'echo $X_SCLS'`"
-----------------------------------------------------
この後いったんログアウトするか、 profileを再読み込みさせてからpythonのバージョン確認を行います。
# python --version
Python 2.7.13
ばっちりバージョンが変わりました。
以上でpython 2.7系が使えるようになりました。
certbot-autoを使った証明書取得
これで下準備ができましたので、certbot-autoを取得して使えるようにします。
# curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
# chmod 700 /usr/bin/certbot-auto
また、libcurlとnssが必要になるため事前にインストールしておきます。
# yum update libcurl
# yum update nss
ここで先ほど取得したcertbot-autoが正常に動くかテストします。
# certbot-auto --version
意外なエラー発生
ここまで順調に来ましたが、特定環境下で以下のエラーが出ることがわかりました。
# certbot-auto --version
Bootstrapping dependencies for RedHat-based OSes... (you can skip this with --no-bootstrap)
yum is /usr/bin/yum
yum is hashed (/usr/bin/yum)
読み込んだ??ゥぅ鷓fastestmirror, security
イ?ゥ函璽觸萢・寮瀋蠅鬚靴討い?
耕oading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
パaケージ gcc-4.4.7-18.el6_9.2.x86_64 はインス?ゼル済?か最新アミ炎ジョンです
パaケージ augeas-libs-1.0.0-10.el6.x86_64 はインス?ゼル済?か最新アミ炎ジョンです
パaケージ openssl-1.0.1e-57.el6.x86_64 はインス?ゼル済?か最新アミ炎ジョンです
パaケージ openssl-devel-1.0.1e-57.el6.x86_64 はインス?ゼル済?か最新アミ炎ジョンです
パaケージ libffi-devel-3.0.5-3.2.el6.x86_64 はインス?ゼル済?か最新アミ炎ジョンです
パaケージ redhat-rpm-config-9.0.3-51.el6.centos.noarch はインス?ゼル済?か最新アミ炎ジョンです
パaケージ ca-certificates-2017.2.14-65.0.1.el6_9.noarch はインス?ゼル済?か最新アミ炎ジョンです
パaケージ python-devel-2.6.6-66.el6_8.x86_64 はインス?ゼル済?か最新アミ炎ジョンです
パaケージ python-virtualenv-12.0.7-1.el6.noarch はインス?ゼル済?か最新アミ炎ジョンです
パaケージ python-tools-2.6.6-66.el6_8.x86_64 はインス?ゼル済?か最新アミ炎ジョンです
パaケージ python-pip-7.1.0-1.el6.noarch はインス?ゼル済?か最新アミ炎ジョンです
何?い泙擦
鹵reating virtual environment...
Installing Python packages...
Had a problem while installing Python packages.
pip prints the following errors:
=====================================================
Exception:
Traceback (most recent call last):
File "/opt/eff.org/certbot/venv/lib/python2.7/site-packages/pip/basecommand.py", line 215, in main
status = self.run(options, args)
File "/opt/eff.org/certbot/venv/lib/python2.7/site-packages/pip/commands/install.py", line 272, in run
with self._build_session(options) as session:
File "/opt/eff.org/certbot/venv/lib/python2.7/site-packages/pip/basecommand.py", line 72, in _build_session
insecure_hosts=options.trusted_hosts,
File "/opt/eff.org/certbot/venv/lib/python2.7/site-packages/pip/download.py", line 329, in __init__
self.headers["User-Agent"] = user_agent()
File "/opt/eff.org/certbot/venv/lib/python2.7/site-packages/pip/download.py", line 93, in user_agent
from pip._vendor import distro
File "/opt/eff.org/certbot/venv/lib/python2.7/site-packages/pip/_vendor/distro.py", line 1050, in <module>
_distro = LinuxDistribution()
File "/opt/eff.org/certbot/venv/lib/python2.7/site-packages/pip/_vendor/distro.py", line 594, in __init__
if include_lsb else {}
File "/opt/eff.org/certbot/venv/lib/python2.7/site-packages/pip/_vendor/distro.py", line 922, in _get_lsb_release_info
stdout, stderr = stdout.decode('utf-8'), stderr.decode('utf-8')
File "/opt/eff.org/certbot/venv/lib64/python2.7/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa5 in position 22: invalid start byte
=====================================================
Certbot has problem setting up the virtual environment.
We were not be able to guess the right solution from your pip
output.
Consult https://certbot.eff.org/docs/install.html#problems-with-python-virtual-environment
for possible solutions.
You may also find some support resources at https://certbot.eff.org/support/ .
他のサーバでは問題がないにも関わらず、あるサーバではこのエラーが発生した後、進まなくなってしまいました。
原因は意外なアイツ
エラー内容を良く読めばわかるのですが、原因はサーバ側の文字コードにありました。
# cat /etc/sysconfig/i18n
LANG="ja_JP.eucJP"
なんとこのサーバ、EUC-JP環境で動いていたのです・・・。
certbot-autoはUTF-8環境で動かすことを想定しているためEUC-JP環境だと動かないということがわかりました。
ちなみに以下のようにLANGを指定することで回避させることができました。
# LANG=ja_JP.UTF-8 certbot-auto --version
後はバーチャル設定を行ったうえで以下のようなコマンドでCentOS 7と同じようにcertbot-autoで証明書の取得を行うことができました。
certbot-auto certonly --webroot -w /www/vhost/test.nedia.ne.jp -d test.nedia.ne.jp --email xxxxxxxx@nedia.ne.jp
まとめ
私が行った工夫、いかがでしたでしょうか。
冒頭でも述べた通り、CentOS 6で動いているサーバはまだ多くありますので、インストール時の参考にしていただければ幸いです。