SSL中間証明書を改良してAndroidに対応させた
およそ3週間の間多忙で何もアウトプットできていなかったくりすです。
nginx
のSSL証明書をAndroid
上で信頼されないという報告を受けていたのですが、先程対応が完了したのでシェア。
問題
このnginx
上ではRapidSSLを採用しており、その親ベンダはGeoTrust, Inc.であるわけですが、この両者の中間証明書をインストールしないと、一部の端末では証明書が正しく使用できませんでした。
原因
2010年頃からRSA
(1024bit) は暗号強度上の理由から廃止されており、それに伴い諸CA証明書も2048bitに順次入れ替わっております。しかし、これに伴い互換性確保のために中間証明書のインストールが必須となるので、これを正しく設置していない場合SSLエラーが発生するわけです。
気を付けないといけないのは、RapidSSL
の場合はRapidSSL
の中間証明書と、その上位のGeoTrust
の中間証明書の両方が必要であるということです。
対策
RapidSSL
, およびGeoTrust
の中間証明書をそれぞれ入手します。
参考文献の3番目のテキストファイルは、この2つの証明書がバンドルになったものなので、それを引っ張ってくればよいでしょう。$ wget https://knowledge.rapidssl.com/library/VERISIGN/INTERNATIONAL_AFFILIATES/RapidSSL/AR1548/RapidSSLCABundle.txt
- 自分のサーバ用の証明書とこれらを連結します。
# cat /path/to/the/downloaded/RapidSSLCABundle.txt >> /path/to/your/ssl/cert.pem
nginx
を再起動します。# service nginx restart
これだけの手間でしたが、Android 4.0.3
で正常に読み込まれたことを確認しましたので、一安心。
NIST
の文書によると、今年の末までに1024bitのRSA
は廃止され、2048bitに移行するものとされています。
参考文献
- RapidSSLを使うとAndroidで証明書エラーが出た場合 | TechRacho
- RapidSSL - Knowledge Center - SSL Certificates Support
- https://knowledge.rapidssl.com/library/VERISIGN/INTERNATIONAL_AFFILIATES/RapidSSL/AR1548/RapidSSLCABundle.txt
- NIST Special Publication 800-131A - Transitions: Recommendation for Transitioning the Use of Cryptographic Algorithms and Key Lengths (PDF)
2つめのTracをホストしてみました
大学や仕事のこと、私的なことなどといったプライベートなあれこれもチケット管理しようといった考えから、公開用であるこのTrac
プロジェクトとは別に、認証もかけて自分専用のプロジェクトをホストしようと思いました。
同じホスト(同じサーバ)で2つのTrac
をホストした理由は、単にSSL証明書を節約するためです。
準備
例によって、任意のパスにTrac
用のディレクトリを作成し、Trac
化します。
詳細は以前の投稿を参照のほど。
[email protected] ~:$ mkdir another_project [email protected] ~:$ trac-admin another_project initenv [email protected] ~:$ chown -R trac:www-data another_project [email protected] ~:$ chmod -R 775 another_project
失敗例
nginxの設定で、location /private
を設定し、パスを変える方法は失敗でした。
なぜかというと、Trac
にprivate
というハンドラがないからです。
それから、uwsgiのSocketポートを変えただけでも、同様にだめでした。
そんなにたくさん試行錯誤はしていません。エンジニアたるものもっと失敗にぶち当たるべき。
成功例
結局、私的に使うやつなのでポート番号くらい非defaultでもいいだろということで、別のポートでlistenすることにしました。
- /etc/nginx/sites-available/trac_private
-
server { listen 55555 ssl; server_name x86-64.jp; ssl_certificate /path/to/your/ssl/cert.pem; ssl_certificate_key /path/to/your/ssl/key.key; root /home/trac/another_project; location /favicon.ico { } location /robots.txt { } if ($scheme = http) { return 301 https://$server_name$request_uri; } location / { include uwsgi_params; uwsgi_param REMOTE_USER $remote_user; uwsgi_param HTTPS on; # リクエストが勝手にHTTPになる現象をこの行で解決 include uwsgi_params; uwsgi_pass 127.0.0.1:7778; auth_basic "Trac"; auth_basic_user_file "/path/to/your/.htpasswd"; } }
uwsgi_pass
のSocketポート番号は、ほかに走っているuwsgi
アプリケーションと違うのに気をつけてください。同じだと破滅が起こります。
このconfをsites-enabled
にシンボリックリンク張って、uwsgi
とnginx
を再起動して完了。
nginxとuwsgiを使ってTracをホストしよう
このTrac
をセットアップするのに多くの時間を費やし、文献を読みあさったのでここに手順やハマりどころをまとめておきます。
そこらの文献というのはなぜかコマンドをどの権限やパスで実行するか明記していないケースがあるので、この記事ではコマンドの説明をするときはbash
っぽくプロンプトの部分から記述します。
- なんかサーバを用意します(当サーバはAmazon EC2上のUbuntu 12.04.2)
以降、ホスト名はreimu
と表します(このホストがreimu.x86-64.jpだから)
- 必要なものをパッケージマネージャなり公式サイトなりから引っ張ってきます。
わたしはaptを使って手を抜きました。依存環境などもまるまる降ってくるし、アップデートの適用もシステムと一緒にできるという恩恵にあずかれます。
[email protected] ~:# apt-get install nginx uwsgi uwsgi-plugin-python trac trac-git
trac-git
はTrac
でgit
使いたいから入れておいたもので、必須ではありません。
で、uwsgi
って結局なんなん: Uwsgi?
- わたしはWebサイトごとにユーザを作るスタイルを採用しているので、
Trac
用にユーザを作っちゃいます。[email protected] ~:# adduser -G www-data trac
nginx
が走るグループは、環境によってはwww-data
ではないかもしれません(httpd
とか)
ユーザ分けとかどうでもいい場合はwww-data
さんが参照できるディレクトリを用意するだけで大丈夫です。
Trac
のプロジェクトが入るディレクトリを適当に作り、Trac
に付属しているTrac-admin?コマンドでそのディレクトリをTrac
化します。
これは通常ユーザ(この記事の例ではtrac
,Trac
用のユーザを作らなかった場合はwww-data
)で行います。[email protected] ~:$ mkdir your_trac_project [email protected] ~:$ trac-admin ~/your_trac_project initenv
initenv
を行っているときに、プロジェクトの名称とデータベースファイルのパスを決められます。
これがTrac
のタイトルとして反映されます。たとえばこのTrac
なら真剣な悪ふざけになっています。 どうやらUTF-8なら2バイト文字でもいいみたいです。
- このへんで
Trac
の管理者アカウントを登録しておきましょう。[email protected] ~:$ trac-admin ~/your_trac_project permission add foo TRAC_ADMIN
これで、ユーザfoo
が管理者になりましたので、foo
としてhttp-auth-basic
(以下Basic認証と記述)でログインできるように設定します(後述)。
Trac
についての、uwsgi
用とnginx
用のconfigを作ります。
わたしはこうしました:
- /etc/uwsgi/apps-available/trac.xml
-
<uwsgi> <socket>127.0.0.1:7777</socket> <plugin>python</plugin> <!--この行が意外と重要--> <env>TRAC_ENV=/home/trac/project-directory</env> <module>trac.web.main:dispatch_request</module> </uwsgi>
- /etc/nginx/sites-available/trac
-
server { listen 80; listen 443 ssl; server_name x86-64.jp; ssl_certificate /path/to/ssl-cert.pem; ssl_certificate_key /path/to/ssl-key.key; root /home/trac/your_trac_project; location /favicon.ico { } location /robots.txt { } if ($scheme = http) { return 301 https://$server_name$request_uri; } location / { include uwsgi_params; uwsgi_pass 127.0.0.1:7777; } location /login { include uwsgi_params; uwsgi_param REMOTE_USER $remote_user; uwsgi_pass 127.0.0.1:7777; auth_basic "Trac"; auth_basic_user_file "/path/to/your/.htpasswd"; } }
uwsgi
用のconfで書いたソケットはportが7777なので、こちらのconfでもuwsgi_pass
を7777に設定しておきます。
このようにして、nginx
にアクセスがあったとき、uwsgi
を通してTrac
のコンテンツを引っ張りにいく設定にします。 ちなみにこのTrac
はSSL-enabledなので、ところどころSSLに関する設定が入っています。
htpasswd
を使って、Basic認証に使うアカウントを生成します。
Apacheを入れていないUbuntuではそんなコマンドないかもしれないですが、apache-utils
をインストールすればOKです(記事は省略)[email protected] ~:$ htpasswd -c /path/to/your/.htpasswd foo [email protected] ~:$ chgrp www-data /path/to/your/.htpasswd [email protected] ~:$ chmod 750 /path/to/your/.htpasswd
これによってユーザfoo
が含まれる.htpasswd
が生成されたので、このユーザでログインすることでTrac
のWebインタフェースからの管理ができるようになりました。
個人的にはここでroot
以外が.htpasswd
を読めるのがきもい。まあしょうがない。
- 上で書いたconfigをenableします。
[email protected] ~:# ln -s /etc/nginx/sites-available/trac /etc/nginx/sites-enabled/trac [email protected] ~:# ln -s /etc/uwsgi/apps-available/trac.xml /etc/uwsgi/apps-enabled/trac.xml
uwsgi
とnginx
をrestart
して完成。[email protected] ~:# service uwsgi restart [email protected] ~:# service nginx restart
ああそういえば:
エラーが発生したときは、結構な確率でパーミッションがおかしいです。
とくにTrac
を運用するにあたってwww-data
が読み書きできなくてはいけないファイルは、
your_trac_project/conf/trac.ini
your_trac_project/db/trac.db
が大事です。これらのファイルについて
www-data
がrとwの権限を持っているかチェックしましょう。
それからハマりどころとして、
uwsgi
の設定にてPythonのプラグインを使うことを明記しないとちゃんと動かなかったのでメモ。
ざっとこんなところかしら。なんか抜けがある気がするので暇な時に検証します。