証明書の固定、CertificatePinnerとCharlesのパッケージの問題

3180 ワード

証明書固定
この間、私たちのコードに証明書の固定コードを追加して、APPのネットワーク要求がパッケージされることを防止しました.
方法は以下の通りです:1、opensslを使って、私達のCA証明書の公開鍵を取得します
openssl s_client -connect mydomain.com:443 -servername mydomain.com | openssl x509 -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64

2、ネットワークライブラリで使用するOkHttp+Retrofitのため、コードに以下の内容が追加されました
    private static final String CA_DOMAIN = "*.mydomain.com";
    private static final String CA_PUBLIC_KEY = "sha256/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

    .....

    CertificatePinner pinner = new CertificatePinner.Builder()
                .add(CA_DOMAIN, CA_PUBLIC_KEY)
                .build();

    .....
    
    OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder()
            .certificatePinner(pinner);

これにより、私たちのコードをパケットからある程度保護することができます.
パッケージのデバッグ
それに伴うもう一つの問題は、証明書を使用して固定すると同時に、私たち自身も私たちのコードをパッケージにキャプチャしてデバッグすることができません.もともと特別な口を開けてCertificatePinnerを閉じ、私たち自身の制限を迂回したいと思っていましたが、リスクが増加します.
どうすればいいの?
実は、本来の証明書のほかに、自分たちの内部で使っているCharlesの証明書をもっと信用すればいいのです.
方法は次のとおりです.
(我々が使用しているCharlesバージョンはv 4.0です)
1、CharlesメニューからHelp>SSLProxying>View Generated SSL Certificates Keystore Passwordを選択し、表示されたパスワードをメモします.これはCharlesがインストールされるたびに自動的に生成され、あなたの本体のCharles Root Certificatesに対応します.
2、CharlesメニューでHelp>SSLProxying>Export Charles Root Certificate and Private Key…を選択し、先ほどのパスワードを入力して生成したp 12ファイルを保存します.
3、CharlesメニューからHelp>SSLProxying>Save Charles Root Certificate…を選択し、pemファイルを保存する
4、opensslを使用して、先ほどのpemファイルから公開鍵を取得する
openssl x509 -pubkey -noout -in charles-ssl-proxying-certificate.pem  | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64

5、上記の証明書の固定コードに従って、PUBLICを一つ追加する.KEY
    CertificatePinner pinner = new CertificatePinner.Builder()
                .add(CA_DOMAIN, CA_PUBLIC_KEY)
                .add(CA_DOMAIN, CA_PUBLIC_KEY_2)
                .build();

6、さっきのpemファイルを携帯電話にインストールし、一般的にシステム設定>安全なメニューで、SDカードからさっきのpemファイルをインストールし、バッグをつかむエージェントを配置する.(これは一般的なCharlesグリップ構成と同じです)
7、(バッグをつかむ必要があるパソコンで)Charlesメニューでproxy>SSL Proxy Settings...、Root Certificate、Choose、前に保存したp 12ファイルを選択すると、前のパスワードを入力させられます.
8、(バッグをつかむ必要があるパソコンで)Charlesを再起動する
これですべての構成が完了し、対応するp 12ファイル(秘密鍵公開鍵を含む)、pemファイル(公開鍵を含む)、パスワードを保存すれば、デバッグが必要なパートナーにパケットをキャプチャさせることができます.
Android 7.0+について
Android 7.0以上は上記の操作を完了する以外に、コードの中でネットワークセキュリティの構成を追加する必要があります.ここでは多くは言いませんが、公式サイトにはあります.詳細です.ここを見てください.https://developer.android.com/training/articles/security-config.html?hl=zh-cn#CustomTrust
注意、charlesのpemも、apiリクエストに必要なpemもrawに入れます.
次のコマンドで取得できます.
openssl s_client -connect mydomain.com:443 -servername mydomain.com | openssl x509 -out test.pem

ネットワークセキュリティ構成が行われている場合は、前のステップ6でpem接尾辞のCA証明書を、手動で携帯電話にインストールする必要はありません(apkに付属しているため)
リファレンスリンク
https://developer.android.com/training/articles/security-config.html?hl=zh-cn#CustomTrust https://www.cnblogs.com/eshizhan/archive/2012/10/07/2713557.html http://www.cnblogs.com/guogangj/p/4118605.html