はじめに
「AndroidのSSL Pinningって、どのような仕組みなの?」
「アプリに実装したいけれど、証明書を更新したときに通信できなくならない?」と気になっていませんか。
Androidアプリとサーバー間の通信を保護するためにSSL Pinningを調べても、証明書や公開鍵などの言葉が出てくると、何をアプリ側に設定すればよいのか分からず迷ってしまいますよね。
この記事では、AndroidにおけるSSL Pinningの仕組みから、主な実装方法、証明書の更新によって通信エラーを起こさないための対策まで分かります。
AndroidのSSL Pinningとは?

AndroidのSSL Pinningは、HTTPS通信で接続するサーバーの証明書や公開鍵をアプリ側であらかじめ指定し、想定した接続先かどうかを確認する仕組みです。
ここでは、SSL Pinningで通信を保護する仕組み、Androidアプリで設定する理由、導入時の注意点を順に説明します。
SSL PinningでHTTPS通信を保護する仕組み
SSL Pinningでは、アプリ側に信頼するサーバー証明書や公開鍵の情報をあらかじめ設定します。
HTTPS通信時にサーバーから提示された証明書と照合し、一致しない場合は通信を拒否します。
これにより、アプリが想定していない接続先との通信を防ぎやすくなります。
AndroidアプリでSSL Pinningを設定する理由
AndroidアプリでSSL Pinningを設定するのは、通信するサーバーを限定し、想定していない証明書による接続を防ぐためです。
通常の証明書検証に加えて、アプリ側に登録した証明書や公開鍵とも照合するため、一致しない場合はHTTPS通信を拒否できます。
SSL Pinningを導入するときの注意点
SSL Pinningでは、サーバー証明書や公開鍵を更新すると、アプリ側の設定と一致せず通信できなくなる場合があります。
そのため、証明書の有効期限や更新予定を確認し、バックアップ用のピンを用意するなど、更新後も正常に通信できるように設定しておきましょう。
AndroidでSSL Pinningを実装する方法
AndroidでSSL Pinningを実装する方法には、Network Security Configを使う方法と、OkHttpのCertificatePinnerを使う方法があります。
ここでは、2つの実装方法と、証明書ピンニング・公開鍵ピンニングの違いを説明します。
Network Security Configで証明書をピン留めする
Network Security Configでは、XMLファイルに対象ドメインとSHA-256形式のピンを設定します。
通信時にサーバー証明書の公開鍵と照合し、一致しない場合は接続を拒否するため、ドメインごとに許可する公開鍵を指定できます。
OkHttpのCertificatePinnerで証明書をピン留めする
OkHttpでは、CertificatePinnerに対象ホスト名とSHA-256形式のピンを設定し、OkHttpClientへ組み込みます。
通信時にサーバー証明書の公開鍵と登録したピンを照合し、一致しない場合は接続を拒否できます。
証明書ピンニングと公開鍵ピンニングの違い
証明書ピンニングは特定の証明書を固定するため、証明書を更新するとアプリ側の設定変更が必要です。
一方、公開鍵ピンニングは公開鍵を基準に照合するため、証明書を更新しても同じ公開鍵を使う場合はピンを変更せずに運用できます。
ただし、公開鍵も変更する場合は新しいピンへの更新が必要です。
AndroidのSSL Pinningで証明書を更新するときの対策
SSL Pinningを設定したAndroidアプリでは、サーバー証明書の更新によって、登録済みのピンと新しい証明書の情報が一致しなくなる場合があります。
ここでは、証明書更新で通信できなくなる理由から、バックアップピンの設定、更新前に確認する項目まで説明します。
証明書を更新すると通信できなくなる理由
SSL Pinningでは、アプリに登録した証明書や公開鍵の情報と、サーバーから提示された証明書を照合します。
証明書の更新によって照合する情報が変わり、登録済みのピンと一致しなくなると検証に失敗するため、正規のサーバーでもHTTPS通信が拒否される場合があります。
証明書を更新したあとに通信エラーが出る場合は、SSL証明書が正しく更新されているかも確認しておくと原因を切り分けやすくなります。
▶SSL証明書が更新されない原因は?確認方法と対処法を解説
バックアップピンを設定して通信断を防ぐ
バックアップピンには、証明書更新後に使用する公開鍵のハッシュ値をあらかじめ登録します。
現在のピンと一緒に設定しておけば、証明書を切り替えたあとも新しい公開鍵を照合できるため、SSL Pinningによる通信断を防ぎやすくなります。
証明書更新前にSSL Pinningの設定を確認する
証明書を更新する前に、アプリへ登録しているピンと更新後に使用する公開鍵を確認します。
新しいピンが必要な場合は、証明書を切り替える前に設定を反映したアプリを配布し、更新後も正常に通信できる状態を整えておきましょう。
AndroidのSSL Pinningを安全に運用するポイント
AndroidのSSL Pinningは、実装したあとも本番環境の証明書やピンの設定が正しい状態になっているか確認する必要があります。
ここでは、本番環境で有効にするときの確認事項と、SSL Pinningの設定を変更した際に確認すべき内容を説明します。
本番環境でSSL Pinningを有効にするときの確認事項
本番環境でSSL Pinningを有効にする前に、接続先のドメインとアプリに登録したピンが正しいか確認します。
実際に本番サーバーへHTTPS通信を行い、正常に接続できることに加えて、登録していない証明書や公開鍵では通信が拒否されることも確かめておきましょう。
本番サーバーとのHTTPS通信に問題がある場合は、SSL証明書のチェーンが正しく設定されているかも確認しておきましょう。
▶ SSLの中間証明書を確認する方法は?証明書チェーンの見方と設定方法を解説
SSL Pinningの設定変更で確認すべきこと
SSL Pinningの設定を変更したあとは、新しいピンで対象サーバーへ正常に接続できるか確認します。
証明書の更新などで古いピンを削除する場合も、新しいピンで問題なく通信できることを確かめてから設定を反映すると安心です。
まとめ
AndroidのSSL Pinningは、アプリが信頼する証明書や公開鍵をあらかじめ設定し、想定していない接続先とのHTTPS通信を防ぐための仕組みです。
Network Security ConfigやOkHttpで設定できますが、証明書を更新すると通信できなくなる場合があるため、バックアップピンや新しいピンを事前に準備しておくことが大切です。
本番環境へ反映する前に実際の通信を確認し、証明書の更新後も安心して利用できる状態を整えておきましょう。











