Let's Encryptで常時SSL化してみた話(事前準備編)
参照:Let's Encrypt
新年の目標達成か?
参考:Let's Encrypt総合ポータル<https://free-ssl.jp>
自己(オレオレ)証明書でホームページをSSL化したところ、Webブラウザからケチョンケチョンにされたので、やはりきちんとした認証局からサーバー証明書を取得することにした。とは言え、お金はかけなくないので、認証局は Let's Encryptでのドメイン認証の一択となる。
ドメイン認証とは、このドメイン(ウチの場合"y-naito.ddo.jp")の正当な所有者が間違いなくウチであることを証明してくれるもの。サイトの運営をしている個人、団体、企業などとは関係なく、ドメインを有していれば誰でも認証してもらえる。最も簡易な認証で、証明書の発行、更新も自動で行われるのであまり運営コストがかからず、今日では Let's Encrypt といった無料で使える認証局もできたというわけだ。
既に自己(オレオレ)証明書でSSL化した実績があるので、その自己証明書を Let's Encrypt から発行してもらった証明書に置き換えれば良いわけだ。以後、Apache2 を SSL化した実績がある前程、すなはち Apache2 のSSLモジュール有効化やポート開放等は済んでいる前程(以下)で書いている。
- Apache は 2.4系(2.4.37以降を推奨)が動作
- Apache の mod_ssl によるSSL化実績あり
- OpenSSL は Ver.1.1.1系(Ver.1.1.1a以降を推奨)
- サーバ、ルーターのポート80, 443開放、ポートマッピング設定済み
大まかな手順は以下のようになるが、長い話になるので何回かに分けて書いておこうと思う。
- 事前準備
- Certbotクライアントのダウンロードとインストール
- 証明書の取得と、Apache2の設定変更
- 証明書の更新と自動更新設定
- HTTP/2の使用(できれば)
また、これは自分のための備忘録なので、他のマシン環境では当てはまらなかったり、非効率な部分もあろうかと思うが、ご了承願いたい。
事前に以下をインストールしておく必要があった。
- libffi
- Python2
- Python2 の pip
- virtualenv
1.1 libffi
現時点での最新版はlibffi-3.2.1
libffiのホームページ:https://sourceware.org/libffi/
1) ダウンロードしたソースを解凍
$ tar xzf libffi-3.2.1.tar.gz
$ cd libffi-3.2.1
|
2) ビルド方法("build.sh"スクリプト作成)
以下では自力でビルドしたgcc-5.5を使用している
#!/usr/local/bin/bash -x
export MACOSX_DEPLOYMENT_TARGET=10.4
export GCC="/usr/local"
export PATH="${GCC}/bin:$PATH"
export DYLD_LIBRARY_PATH="${GCC}/lib:${DYLD_LIBRARY_PATH}"
./configure \
CC="${GCC}/bin/gcc" \
CXX="${GCC}/bin/g++" \
CPP="${GCC}/bin/cpp" \
CPPFLAGS="-I/usr/local/include -I/usr/include" \
CFLAGS="-O2 -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
CXXFLAGS="-O2 -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
LDFLAGS="-L/usr/local/lib -L/usr/lib"
make
注)「¥」は実際には半角の「\」(バックスラッシュ)
3) ビルドしてインストール
$ chmod +x ./build.sh
$ ./build.sh
$ sudo make install
|
1.2 Python2
元々 Mac OS X/macOS には Python2 がインストール済みであるが、自宅サーバー(Mac mini G4, Mac OS X 10.4.11/Tiger)の Python2 は古く(Ver.2.3)、Let's encrypt の Certbotクライアント動作条件(Python 2.6/2.7)も満たしていないので、この機会に最新化しておく。
Python2 の現時点での最新版は Python-2.7.15
Pythonホームページ:https://www.python.org/
1) ダウンロードしたソースを解凍
$ xzcat Python-2.7.15.tar.xz | tar xf -
$ cd Python-2.7.15
|
2) ビルド方法("build.sh"スクリプト作成)
ウチのサーバーには LibreSSL と OpenSSL の2つのSSLライブラリがインストールしてあり、デフォルトでは LibreSSL の方が使用されるようにしている。LibreSSL は OpenSSL から派生したもので、以前はソース互換性があった。しかし、その後各々に独自の改良や機能追加が行われた結果非互換が発生して、現在では OpenSSL を使ってしかビルドできないものがあるようだ。
Let's Encrypt の Certbotクライアントでインストールされる Pythonのパッケージの中にも OpenSSL でしかビルドできないもの(cryptography)が存在する。Python2 を LibreSSL を使ってビルドすると、パッケージのビルドの際にも LibreSSL が使用され、コンパイルエラーや実行時の動的リンク時にリンクエラーが発生するようだ(実はこれで随分と悩まされた)。そのため、以下では"usr/local/ssl"にインストールされている OpenSSL の方を使用してビルドしている。
#!/usr/local/bin/bash -x
export LANG=ja_JP.UTF-8
export MACOSX_DEPLOYMENT_TARGET=10.4
export GCC="/usr/local"
export SSL="/usr/local/ssl"
export PATH="${GCC}/bin:$PATH"
export DYLD_LIBRARY_PATH="${GCC}/lib:$DYLD_LIBRARY_PATH"
export PKG_CONFIG_PATH="${SSL}/lib/pkgconfig:$PKG_CONFIG_PATH"
./configure \
--enable-unicode \
--with-threads \
--enable-framework \
--with-tcltk-includes="-I/Library/Frameworks/Tcl.framework/Headers -I/Library/Frameworks/Tk.framework/Headers" \
--with-tcltk-libs="-L/Library/Frameworks/Tcl.framework -L/Library/Frameworks/Tk.framework" \
CC="${GCC}/bin/gcc" \
CPPFLAGS="-I${SSL}/include -I/usr/local/include -I/usr/include" \
CFLAGS="-O2 -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
LDFLAGS="-L${SSL}/lib -L/usr/local/lib -L/usr/lib"
make
make test >check.log
注)「¥」は実際には半角の「\」(バックスラッシュ)
3) ビルドしてインストール
$ chmod +x ./build.sh
$ ./build.sh
$ sudo make install
|
4) PythonフレームワークのVersion修正
Python2 をインストールすると"/Library/Frameworks/Python.framework/Versions/Current"が Python2 の方を指すようにシンボリックリンクが張られてしまう。
$ cd /Library/Frameworks/Python.framework/Versions
$ ls -l
drwxr-xr-x 10 root admin 340 1 20 17:34 2.7
drwxr-xr-x 9 root admin 306 12 26 11:50 3.7
lrwxr-xr-x 1 root admin 5 1 20 17:37 Current -> 2.7
|
Current は Python3 の方にしておきたいので、Python3.7 を指すようにシンボリックリンクを張り直す。
$ sudo rm Current
$ sudo ln -s ./3.7 Current
|
1.3 Python2 の pip
Python2 の場合、Python2 をインストールしただけでは pip(パッケージ管理コマンド)がインストールされない(Python-2.7.9以降は pipもインストールされるようになったとのことだが、自分の場合はインストールされなかった)。後述の virtualenv や、Certbotクライアントのインストールで必要になるので、pip をインストールする。
1) get-pip.py のダウンロード
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
|
2) pip のインストール
3) /usr/local/bin"からシンボリックリンクを張る
上では "/Library/Frameworks/Python.framework/Versions/2.7/bin/" 配下に pip がインストールされる。このままでは使いづらいので"/usr/local/bin"からシンボリックリンクを張る。
$ cd /usr/local/bin
$ sudo ln -s /Library/Frameworks/Python.framework/Versions/2.7/bin/pip pip
$ /usr/local/bin/pip --version
pip 18.1 from /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pip (python 2.7)
$
|
1.4 virtualenv
virtualenv は、Pythonの仮想環境を作るコマンド(ちょっと古い)。Certbotクライアントのインストールで用いられているので、これをインストールする。
$ sudo pip install virtualenv
|
インストールすると、virtualenv コマンドも先の pip と同様に"/Library/Frameworks/Python.framework/Versions/2.7/bin/virtualenv"に置かれる。このままでは使いづらいので、pip同様"/usr/local/bin"からシンボリックリンクを張る。
$ cd /usr/local/bin
$ sudo ln -s /Library/Frameworks/Python.framework/Versions/2.7/bin/virtualenv virtualenv
$ /usr/local/bin/virtualenv --version
16.2.0
$
|
|