« Pythonリファクタリング初体験(2021/05/03追記) | トップページ | Chrome DevToolsで出ていたViolationおばけ »

2020/03/25

TinkerBoardのApache2 HTTPS対応メモ(2020/03/26追記)

うちの中で使っているWEBサーバーを使うと「保護されていない通信」とChromeで表示されるのが気持ち悪く、HTTPS対応することを思い立ちました。

200324_tb01ssl1

なんとかできたのですが、ちょっと苦労したので、ほぼ自分向けの備忘録を残しておきます。

200324_tb01ssl2

typoや状況の変化などありましたらご指摘頂けると助かります。

私が使っているローカルWEBサーバーはASUSのTinkerBoardで、バージョン等は次の通りです:
200325_version

このWEBサーバーのIPアドレスは 192.168.0.2, /etc/hostsで付けている自称はtb01です。

また、クライアント側のWEBブラウザが証明書を自動的にインポートするのは、証明書の認証局が信頼できるリストに入っている場合だけです。ここで作る認証局は当然リストに入っていませんので、ハンドでインポートする必要があります(面白くないけど仕方ない)。

私はmacOS (Catalina 10.15.3)とAQUOS sense plus SH-M07 (Android 9)でインポートし、Google Chrome 80.0.3987.149で動作確認しました。macOSのSafari 13.1でも動作確認しました。
(2020/03/26追記:Windows10のChrome 80.0.3987.149, IE 11.719.18362.2, Edge 44.18362.449.0およびiOS 12.4.6の第6世代iPod(音楽プレイヤー、iPadにあらず)のSafari 12.1.2, Chrome 80.0.3987.95でも動作確認しました。これらはインポートする証明書が違ったので、その旨を追記済です)

主に参考にさせて頂いたページは、手順の順番に、次の6つです:
1.Ubuntu 18.04 LTS で OpenSSL を使ったプライベート認証局&証明書を作る - 未完放流 -
2.RaspberryPiでApache2をHTTPSに対応させたい! - Qiita -
3.UNIXユーザ奮戦記 : Apache2のServerName Error -
4.スマホに、IPアドレスのオレオレサーバ証明書をインストールする: パソコン鳥のブログ -
5.ルートCA(証明機関)の証明書をインポートする - Windows Tips - ←2020/03/26追加
6.iOS や iPadOS で手動でインストールした証明書プロファイルを信頼する - Apple サポート - ←2020/03/26追加

前置きが長くなりましたが、以下ほぼコマンド等を羅列します。内容は上記ブログを参照して下さい。異なる点のみ内容を書きます。

 

まずは、証明書の作成準備:

参考:上記1.

sudo mkdir /etc/apache2/ssl
cd /etc/apache2/ssl
sudo cp /etc/ssl/openssl.cnf ./original_openssl.cnf
sudo vi original_openssl.cnf
サンプル - original_openssl.cnf
sudo vi createca
サンプル - createca
sudo vi createsrv
サンプル - createsrv
sudo vi ext_v3
サンプル - ext_v3

createcaとcreatesrvは、認証局と証明書を作るシェルスクリプトです。

ext_v3のbasicConstraintsが上記1.ではCA:FALSEでしたが、それだとAndroidで有効にならないので、CA:TRUEにしました。
ここは少々気持ち悪いです。

 

続いて、サーバーの準備:

参考:上記2.上記3.

cd /etc/apache2/sites-available/
sudo cp default-ssl.conf default-ssl.conf.bak
sudo vi default-ssl.conf
サンプル - defaultssl.conf

ここでDocumentRootは私特有のところになっています。また、私はPythonを使っているのでFilesMatchにpyを加えています。

cd /etc/apache2/conf-available/
sudo vi local-servername.conf
サンプル - localservername.conf

 

いよいよ証明書の作成とサーバーの起動:

参考:上記2.

cd /etc/apache2/ssl
sudo sh createca

ここでローカル認証局を作ります。スクリプトからの問い合わせに対し(国・県・市・団体名は適当で)、organizationalUnitNameをCAに、Common Nameを127.0.0.1:443にします(IPアドレスはlocalhost、443はSSL/TLSのポート番号)。メールアドレス以下は空EnterでOKで、コミットに2回yを押します。:443を入力し忘れるなどしたらctrl+cで抜けられます。

sudo sh createsrv

ここでWEBサーバー用の証明書を作ります。こちらではorganizationalUnitNameをホスト名に、Common Nameをクライアントからアクセスするアドレスの192.168.0.2:443にします。ホスト名は/etc/hostsに合わせておけば無難でしょう。

以下、ドドッとサーバー起動です
sudo a2enmod ssl
sudo a2ensite default-ssl
sudo a2enconf local-servername
sudo service apache2 restart
systemctl status apache2.service

これでサーバー側は完了です。

もしエラーが出ていたら、systemctl statusの出力のほか、次を確認します。

journalctl -xe
tail -20 /var/log/apache2/error.log

エラーが出たときのやり直し手順と、確認ファイルのまとめを下の方に書いておきます。

 

クライアントへの証明書インポート:

参考:上記4.上記5.上記6.

サーバーのエラーが出ていなければ、クライアントのChromeからhttps://192.168.0.2/へ(あなたのWEBサーバーのトップページへ"s"つきで)アクセスします。すると「この接続ではプライバシーが保護されません」が出ます。
これは、SSLサーバーは立ち上がっているけれど、証明書がインポートされていない、という状態です。
では、続いてクライアントへ証明書をコピーしましょう。私はサーバーでSambaも動かしているので、そちらにコピーして、クライアントから取りに行きました。(WindowsおよびiOS用を2020/03/26追記。WEB配布でもいいですね。)

cd /etc/apache2/ssl/server
sudo cp localhost.crt ~/hoge.crt
 ↑これはmacOS用。Sambaの適当なフォルダに分かりやすい名前で。拡張子は.crt
sudo cp localhost.der.crt ~/hoge.der.crt
 ↑こちらはAndroid用。Sambaの適当なフォルダに分かりやすい名前で。こちらも拡張子は.crt
cd /etc/apache2/ssl/demoCA
sudo cp ca.crt ~/fuga.crt
 ↑これはWindowsおよびiOS用。Sambaの適当なフォルダに分かりやすい名前で。拡張子は.crt
(sudoを付けたのは、前に失敗したファイルが残っているかも知れないからです… はまったので。)

インポートの手順はOSによって異なります。
macOSの場合は、Finderでhoge.crtを開くと「キーチェーンアクセス.app」が起動します。あとはAppleの公式案内通りに開き「常に信頼」します。
Androidの場合は上記4.の通りです。
WindowsとiOSの場合はサーバーの証明書ではなく、ルート証明機関の証明書を使います。上記5.の通りです。

インポートを終えて、再びhttps://192.168.0.2/へアクセスすると、鍵付きになりました!

なお、ページの内容によっては「鍵」にならず「丸囲みのi」になることがあるそうです。次のページに解説がありましたので、参考まで:
このサイトへの接続は完全には保護されていません ← 対処法を解説【混合コンテンツがあります】 -

 

おまけ:

失敗したときの手戻し手順:
cd /etc/apache2/ssl
sudo a2disconf local-servername
sudo a2dissite default-ssl
sudo a2dismod ssl
sudo service apache2 restart
systemctl status apache2.service

…SSLサーバーを落としたのでAH00558が出ます。

設定ファイルの確認まとめ:
sudo vi /etc/apache2/ssl/original_openssl.cnf
sudo vi /etc/apache2/sites-available/default-ssl.conf
sudo vi /etc/apache2/conf-available/local-servername.conf
sudo vi /etc/apache2/ssl/createca
sudo vi /etc/apache2/ssl/createsrv
sudo vi /etc/apache2/ssl/ext_v3

 

確認後の再開手順(前回の証明書は消してやり直す):
cd /etc/apache2/ssl
sudo rm -rf demoCA
sudo rm -rf server
sudo sh createca
sudo sh createsrv
sudo a2enmod ssl
sudo a2ensite default-ssl
sudo a2enconf local-servername
sudo service apache2 restart
systemctl status apache2.service

…エラーが出ていませんように!

ご利用は自己責任で。

 

パドラッパ from MacBook Air (2017)

 

ps. 書き終えてアップした直後にmacOS 10.15.4が降ってきましたが、問題無く動いています。

 

 【2020/03/26記】
macOSとAndroidの場合はSSLサーバ証明書のインポートで通りましたが、Windows10およびiOSでは認証局側のルート証明書が必要でした。その旨を追記しました。
また、WEBサーバーの話をしているのだからWEBで配布すればいいと後で気付きました(お恥ずかしい)。

| |

« Pythonリファクタリング初体験(2021/05/03追記) | トップページ | Chrome DevToolsで出ていたViolationおばけ »

コメント

コメントを書く



(ウェブ上には掲載しません)




« Pythonリファクタリング初体験(2021/05/03追記) | トップページ | Chrome DevToolsで出ていたViolationおばけ »