kapieciiのブログ

日々学んだことを残しておくためのブログです。このブログはGoogle Analyticsを利用しています。

はてなブログからブログを移行します

f:id:kapiecii:20200315150612p:plain

長らくお世話になった「はてなブログ」から、ブログを移行しようと思います。移行前に、はてなブログでのブログ活動を振り返ってみます。

数字で振り返ってみる

アクセス数や投稿数はこのようになりました。

f:id:kapiecii:20200315144752p:plain

それぞれの数値についてみていきます。

継続期間

f:id:kapiecii:20200315144848p:plain

2018年9月から、77週間継続して毎週記事を更新しました✌

記事投稿数

94の記事を投稿しました。
キリ良く100まで投稿してから移行することも考えましたが、思い立ったが吉日です。
94+1=95投稿(+1はこの投稿)で最後にしようと思います。

アクセス数

これまでの累計アクセス数は、「38,631」アクセスでした。
福岡ヤフオク!ドームで野球の試合をする場合の収容人数が38,530人らしいので、ちょうどヤフオクドームが満員になったくらいの方に記事を見ていただけたようです。

minute.jp

アクセス数の推移

f:id:kapiecii:20200315145159p:plain

2019年末頃は、4,500 PV/月位だったのですが、年明けからPV数が少し下がりました。
原因はわかりませんが、Googleの検索順位が下がったのでしょうか。
また、平日のPV数と週末のPV数に大きな差があるため、全体を通してギザギザな形になっています。IT技術っぽい内容の投稿が多いので、平日のお仕事中に読んでもらっているのかなと思います。

アクセス数が多い投稿

f:id:kapiecii:20200315145402p:plain

アクセス数の多い投稿トップ10は、このようになりました。 上位10記事で、全体の7割のアクセスを占めています。

アクセス元

f:id:kapiecii:20200315145458p:plain

ほぼ全て、Googleからのアクセスです。

直帰率とページ平均滞在時間

f:id:kapiecii:20200315145550p:plain

直帰率は約90%で、とても高いです。ページの平均滞在時間が4分半ということと合わせて考えると、下記のような流れが多いのではないかと思います。

Google検索から流入-->目的の記事を読む-->直帰

直帰率が高いのは改善したい気もしますが、良い面を考えると、「Google検索した人が求める情報にたどり着くことができている。記事を読んで目的を達成して帰っている。」とも考えられるのかなと思いました。

まとめ

各種数字からこれまでのブログ活動を振り返ってみました。

ブログを始める前は、アウトプットすることに対して苦手意識が強く、アウトプットする習慣は皆無でした。
omoiyari.fmに触発されてブログを書き始め、write-blog-every-weekコミュニティの方々のおかげで、ここまで継続することができました。

「アウトプットすることによってのみ、自分を取り巻く環境を変化させることができる」というアウトプット大全の言葉を胸に、これからもブログ活動を継続していこうと思います。

podtail.com

write-blog-every-week.netlify.com

学びを結果に変えるアウトプット大全 (Sanctuary books)

学びを結果に変えるアウトプット大全 (Sanctuary books)

  • 作者:樺沢紫苑
  • 発売日: 2018/08/03
  • メディア: 単行本(ソフトカバー)

今後はこちらでブログを更新していきます。

blog.kapiecii.com

アプリの通信内容を確認する(Android7以降)

f:id:kapiecii:20200305201441p:plain

Androidアプリのテストをするため、先日用意した検証用端末で、アプリの通信内容を確認しました。

kapiecii.hatenablog.com

「今更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」の中で紹介されていた、ブログの手順に従って進めます。

forum.portswigger.net

blog.ropnop.com

CA Certificate Export

「Burp Suite > Proxy > Options > Proxy Listeners」 から「Import / Export CA certificate」をクリックします。
「Certificate in DER format」を選択してExportします。

f:id:kapiecii:20200305194329p:plain

今回は参照したブログに合わせて、「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権限の取得についてはこちら

kapiecii.hatenablog.com

先ほど名前を変更した証明書ファイルを、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」を設定します。

f:id:kapiecii:20200305195400p:plain

追加した設定を有効にしておきます。

f:id:kapiecii:20200305195455p:plain

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ヶ月未満の証明書を発行しなおすしかなさそうです。

www.rapid-ssl.jp

Burp Suiteの証明書により問題が発生している可能性が高いので、別の証明書を使う別のプロキシツールを試してみます。

OWASP ZAPの場合

OWASP ZAPは、OWASPが作成しているローカルプロキシツールです。下記からインストールします。

www.zaproxy.org

証明書の生成とExport

「Tools > Options > Dynamic SSL Certificates」からルートCA証明書を生成して保存します。
今回は「owasp_zap_root_ca.cer」というファイル名で保存しました。

f:id:kapiecii:20200305195820p:plain

ファイル名の変更

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がどのようなものなのかは、下記の記事が大変参考になりました。有益な記事を公開していただき、ありがとうございます。

qiita.com

記事の内容を抜粋させていただきます。

  • 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」を指定します。

f:id:kapiecii:20200305200152p:plain

Android端末のネットワーク設定

「設定 > WiFi > {接続しているSSID名} > ネットワークの変更」から、プロキシの設定をします。 プロキシのIPアドレスは、OWASP ZAPを動かしているパソコンのIPアドレス、ポートは8080を指定します。

アプリを動かす

通信内容を確認したいAndroidアプリを起動し、適宜アプリを操作をします。
Androidアプリの通信内容をOWASP ZAPの画面下部、「History」から確認できます。

f:id:kapiecii:20200305200306p:plain

まとめ

Android7以降の端末に、プロキシの証明書を追加して、Androidアプリの通信内容を確認しました。

目的を達成するまでに下記のような問題が発生しました。

  • Androi7以降では、証明書の扱いと、信頼できる証明書の追加方法が変わっていた
  • Burp Suiteの証明書を追加したにも関わらず、「certificate_unknown」エラーが発生した
  • Chromeの仕様により、39ヶ月より長い期間の証明書を使った場合に「NET::ERR_CERT_VALIDITY_TOO_LONG」エラーが発生した

「certificate_unknown」のエラーでは、エラーが発生している原因がわからず、原因の切り分けに時間がかかりました。 また、これまでよくわからずに使っていた、DERやPEMについて知る良い機会になりました。

kapieciiのブログについてお問い合わせがある場合、下記のフォームからご連絡をお願い致します。
お問い合わせはこちら