こんにちは、千本木です。
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のバージョンはというと
1 2 |
# python --version Python 2.6.6 |
ご覧の通り2.6系がインストールされてしまっているため、そのままだと証明書取得に進むことができなくなります。
では削除して新しいバージョンを入れなおせば良いかというと、pythonと依存関係にあるアプリケーションが数多くあるため、現実的に対応ができません。
Software Collectionで対応する
ではどうするかというと、python 2.6系と2.7系を共存させるという手段を取ります。
CentOS向けに公式にSoftware Collectionsというリポジトリがあり、これを使うことで標準パッケージと別バージョンのパッケージを共存させることが可能になります。
やり方は簡単。リポジトリをインストールし、パッケージをインストールすればOKです。
1 2 3 4 5 6 7 8 9 10 |
# 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のバージョン確認を行います。
1 2 |
# python --version Python 2.7.13 |
ばっちりバージョンが変わりました。
以上でpython 2.7系が使えるようになりました。
certbot-autoを使った証明書取得
これで下準備ができましたので、certbot-autoを取得して使えるようにします。
1 2 |
# curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto # chmod 700 /usr/bin/certbot-auto |
また、libcurlとnssが必要になるため事前にインストールしておきます。
1 2 |
# yum update libcurl # yum update nss |
ここで先ほど取得したcertbot-autoが正常に動くかテストします。
1 |
# certbot-auto --version |
意外なエラー発生
ここまで順調に来ましたが、特定環境下で以下のエラーが出ることがわかりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# 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/ . |
他のサーバでは問題がないにも関わらず、あるサーバではこのエラーが発生した後、進まなくなってしまいました。
原因は意外なアイツ
エラー内容を良く読めばわかるのですが、原因はサーバ側の文字コードにありました。
1 2 |
# cat /etc/sysconfig/i18n LANG="ja_JP.eucJP" |
なんとこのサーバ、EUC-JP環境で動いていたのです・・・。
certbot-autoはUTF-8環境で動かすことを想定しているためEUC-JP環境だと動かないということがわかりました。
ちなみに以下のようにLANGを指定することで回避させることができました。
1 |
# LANG=ja_JP.UTF-8 certbot-auto --version |
後はバーチャル設定を行ったうえで以下のようなコマンドでCentOS 7と同じようにcertbot-autoで証明書の取得を行うことができました。
1 |
certbot-auto certonly --webroot -w /www/vhost/test.nedia.ne.jp -d test.nedia.ne.jp --email xxxxxxxx@nedia.ne.jp |
まとめ
私が行った工夫、いかがでしたでしょうか。
冒頭でも述べた通り、CentOS 6で動いているサーバはまだ多くありますので、インストール時の参考にしていただければ幸いです。