はてなブログからブログを移行します
長らくお世話になった「はてなブログ」から、ブログを移行しようと思います。移行前に、はてなブログでのブログ活動を振り返ってみます。
数字で振り返ってみる
アクセス数や投稿数はこのようになりました。
それぞれの数値についてみていきます。
継続期間
2018年9月から、77週間継続して毎週記事を更新しました✌
記事投稿数
94の記事を投稿しました。
キリ良く100まで投稿してから移行することも考えましたが、思い立ったが吉日です。
94+1=95投稿(+1はこの投稿)で最後にしようと思います。
アクセス数
これまでの累計アクセス数は、「38,631」アクセスでした。
福岡ヤフオク!ドームで野球の試合をする場合の収容人数が38,530人らしいので、ちょうどヤフオクドームが満員になったくらいの方に記事を見ていただけたようです。
アクセス数の推移
2019年末頃は、4,500 PV/月位だったのですが、年明けからPV数が少し下がりました。
原因はわかりませんが、Googleの検索順位が下がったのでしょうか。
また、平日のPV数と週末のPV数に大きな差があるため、全体を通してギザギザな形になっています。IT技術っぽい内容の投稿が多いので、平日のお仕事中に読んでもらっているのかなと思います。
アクセス数が多い投稿
アクセス数の多い投稿トップ10は、このようになりました。 上位10記事で、全体の7割のアクセスを占めています。
アクセス元
ほぼ全て、Googleからのアクセスです。
直帰率とページ平均滞在時間
直帰率は約90%で、とても高いです。ページの平均滞在時間が4分半ということと合わせて考えると、下記のような流れが多いのではないかと思います。
Google検索から流入-->目的の記事を読む-->直帰
直帰率が高いのは改善したい気もしますが、良い面を考えると、「Google検索した人が求める情報にたどり着くことができている。記事を読んで目的を達成して帰っている。」とも考えられるのかなと思いました。
まとめ
各種数字からこれまでのブログ活動を振り返ってみました。
ブログを始める前は、アウトプットすることに対して苦手意識が強く、アウトプットする習慣は皆無でした。
omoiyari.fmに触発されてブログを書き始め、write-blog-every-weekコミュニティの方々のおかげで、ここまで継続することができました。
「アウトプットすることによってのみ、自分を取り巻く環境を変化させることができる」というアウトプット大全の言葉を胸に、これからもブログ活動を継続していこうと思います。
write-blog-every-week.netlify.com
学びを結果に変えるアウトプット大全 (Sanctuary books)
- 作者:樺沢紫苑
- 発売日: 2018/08/03
- メディア: 単行本(ソフトカバー)
今後はこちらでブログを更新していきます。
アプリの通信内容を確認する(Android7以降)
Androidアプリのテストをするため、先日用意した検証用端末で、アプリの通信内容を確認しました。
「今更Android7の記事を書くの?」とも思いましたが、色々試したので内容を整理してブログに残しておこうと思います。
HTTPSで通信している内容を通信経路上のプロキシで確認する場合、プロキシの証明書をAndroid端末に追加する必要があります。
下記のようにプロキシを通信経路上に介在させることで、HTTPS通信の内容を確認します。
Android端末 < -- > プロキシ(Burp Suiteなど) < -- > 通信先サーバ
目次
要約
記事がとても長くなったので、3行で要約です。
- Android7から信頼できる証明書の扱いが変わったので、Android6までとは違う手順で証明書を追加する必要があった
- Androidアプリが通信する部分は問題なく通信内容を確認できたが、アプリ内のWebViewが通信する箇所で別のエラーが発生していた
- アプリ内WebViewのエラーが発生しない証明書をAndroid端末に追加することで全てのエラーが解消した
Android7以降と証明書について
Android7で、「端末が信頼する証明書」の扱いが変わりました。そのため、Android6までと同じ方法で証明書を追加しても、HTTPSの通信内容を確認することができません。
これまでと同じ方法で証明書を追加した場合、プロキシを経由した通信では、「the client failed to negotiate an ssl connection to foo.com:443: Received fatal alert: certificate_unknown」のようなエラーが発生します。
android-developers.googleblog.com
環境
下記の環境で作業しました。
証明書の追加手順
Android端末にプロキシツールの証明書を追加します。
Burp Suiteの場合
Burp community forum「Unable to intercept SSL traffic for Android 7 & above」の中で紹介されていた、ブログの手順に従って進めます。
CA Certificate Export
「Burp Suite > Proxy > Options > Proxy Listeners」 から「Import / Export CA certificate」をクリックします。
「Certificate in DER format」を選択してExportします。
今回は参照したブログに合わせて、「cacert.der」というファイル名で保存しました。
証明書形式の変換とファイル名の変更
Exportした証明書をAndroidが認識する形式と名称に変更する必要があります。
Kali Linuxに入っているopensslコマンドを使って形式を変更した後、ファイル名を変更します。
今回はopensslのバージョンが1.0以上なので、「subject_hash」ではなく、「subject_hash_old」を使います。
# openssl version OpenSSL 1.1.1d 10 Sep 2019
Androidに認識させるためには、証明書のファイル名を「{英数字}.0」の形式にします。
英数字の部分は、「subject_hash_old」オプションを使って調べます。
# openssl x509 -inform DER -in cacert.der -out cacert.pem # openssl x509 -inform PEM -subject_hash_old -in cacert.pem | head -1 9a5ba575 # mv cacert.pem 9a5ba575.0
Android端末に追加
証明書を追加するにあたり、端末のroot権限を取得しておく必要があります。
root権限の取得についてはこちら
先ほど名前を変更した証明書ファイルを、Android端末にpushし、「/system/etc/security/cacerts/」以下に配置します。
証明書ファイルを配置するために、「/system」をマウントし直します。
$ adb push 9a5ba575.0 /sdcard 9a5ba575.0: 1 file pushed. 0.0 MB/s (1375 bytes in 0.038s) $ adb shell shamu:/ $ su shamu:/ # mount -o rw,remount /system shamu:/ # mv /sdcard/9a5ba575.0 /system/etc/security/cacerts/ shamu:/ # chmod 644 /system/etc/security/cacerts/9a5ba575.0 shamu:/ # reboot
Android端末の再起動が終わると、「設定 > セキュリティ > 信頼できる認証情報 > システム」に「PortSwigger」が追加されています。
Burp Suiteの設定
「Proxy > Options > Proxy Listeners > Add」から、Burp Suiteが待ち受けるIPアドレスとポートを指定します。 今回は、Bind to portに「8080」、Bind to addressに「All interfaces」を設定します。
追加した設定を有効にしておきます。
Android端末のネットワーク設定
「設定 > WiFi > {接続しているSSID名} > ネットワークの変更」から、プロキシの設定をします。
プロキシのIPアドレスは、Burp Suiteを動かしているパソコンのIPアドレス、ポートは8080を指定します。
アプリを動かす
通信内容を確認したいAndroidアプリを起動し、適宜アプリを操作をします。
Androidアプリの通信内容をBurp Suiteの「Proxy > Intercept」から確認できます。
エラーが発生した場合
今回上記の設定をした上でアプリを動作させたところ、「the client failed to negotiate an ssl connection to foo.com:443: Received fatal alert: certificate_unknown」というエラーが発生しました。どうやらSSL周りでエラーが発生しているようです。
エラーが発生する箇所を調べたところ、「WebViewでWebアプリにアクセスしようとしている箇所」でエラーが発生していました。「certificate_unknown」だけではよくわからないので、エラーが発生しているURLに対して、Androidアプリ内のChromeでアクセスしてみます。
Chromeでアクセスしたところ、「NET::ERR_CERT_VALIDITY_TOO_LONG」というエラーが表示されました。このエラーは、「39ヶ月を超える有効期限を持つ証明書を使用した場合にChromeで発生するエラー」のようです。
対処方法としては、有効期限が39ヶ月未満の証明書を発行しなおすしかなさそうです。
Burp Suiteの証明書により問題が発生している可能性が高いので、別の証明書を使う別のプロキシツールを試してみます。
OWASP ZAPの場合
OWASP ZAPは、OWASPが作成しているローカルプロキシツールです。下記からインストールします。
証明書の生成とExport
「Tools > Options > Dynamic SSL Certificates」からルートCA証明書を生成して保存します。
今回は「owasp_zap_root_ca.cer」というファイル名で保存しました。
ファイル名の変更
Burp Suiteの時と同様に、ファイル名を変更します。
Burp Suiteの場合は、ファイルがDER形式だったので、PEM形式に変換してから「subject_hash_old」でファイル名を調べました。OWASP ZAPの場合は、最初からCER形式なので変換不要です。
# openssl x509 -inform PEM -subject_hash_old -in owasp_zap_root_ca.cer | head -1 539fc0af # cp owasp_zap_root_ca.cer 539fc0af.0
DER?PEM?CER?
DER、PEM、CERがどのようなものなのかは、下記の記事が大変参考になりました。有益な記事を公開していただき、ありがとうございます。
記事の内容を抜粋させていただきます。
- DER: 鍵や証明書をASN.1というデータ構造で表し、シリアライズしたバイナリファイル
- PEM: DERと同じASN.1のバイナリデータを、Base64によってテキスト化したファイル
- CER: 証明書。中身は.CRTと同じ
- CRT: エンコーディングはDERだったり、PEMだったりする。バイナリだったらDER、「-- BEGIN」で始まるテキストファイルならPEMと考えたらいいらしい
Android端末に追加
Burp Suiteの時と同じ手順でAndroid端末に証明書ファイルを追加します。
$ adb push 539fc0af.0 /sdcard 539fc0af.0: 1 file pushed. 0.1 MB/s (1801 bytes in 0.031s) $ adb shell shamu:/ $ su shamu:/ # mount -o rw,remount /system shamu:/ # mv /sdcard/539fc0af.0 /system/etc/security/cacerts/ shamu:/ # chmod 644 /system/etc/security/cacerts/539fc0af.0 shamu:/ # reboot
Android端末の再起動が終わると、「設定 > セキュリティ > 信頼できる認証情報 > システム」に「OWASP Root CA」が追加されています。
OWASP ZAPの設定
「Tools > Options > Local Proxies」から、OWASP ZAPが待ち受けるIPアドレスとポートを指定します。Addressは「{OWASP ZAPが動いているパソコンのIPアドレス}」、Portは「8080」を指定します。
Android端末のネットワーク設定
「設定 > WiFi > {接続しているSSID名} > ネットワークの変更」から、プロキシの設定をします。 プロキシのIPアドレスは、OWASP ZAPを動かしているパソコンのIPアドレス、ポートは8080を指定します。
アプリを動かす
通信内容を確認したいAndroidアプリを起動し、適宜アプリを操作をします。
Androidアプリの通信内容をOWASP ZAPの画面下部、「History」から確認できます。
まとめ
Android7以降の端末に、プロキシの証明書を追加して、Androidアプリの通信内容を確認しました。
目的を達成するまでに下記のような問題が発生しました。
- Androi7以降では、証明書の扱いと、信頼できる証明書の追加方法が変わっていた
- Burp Suiteの証明書を追加したにも関わらず、「certificate_unknown」エラーが発生した
- Chromeの仕様により、39ヶ月より長い期間の証明書を使った場合に「NET::ERR_CERT_VALIDITY_TOO_LONG」エラーが発生した
「certificate_unknown」のエラーでは、エラーが発生している原因がわからず、原因の切り分けに時間がかかりました。 また、これまでよくわからずに使っていた、DERやPEMについて知る良い機会になりました。