問題タブ [pinning]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - Android OS 証明書のピン留め
まず、Android の OS 証明書のピン留めについて非常に簡単に紹介します。Android システム/OS レベルの SSL/TLS 証明書ピンニングのバージョン 4.2 から導入されました (詳細については、この URL も参照してください)。このメカニズムを使用して固定された証明書のリストは「/data/misc/keychain/pins」にあり、デフォルトで、mail.google.com、youtube.com などの Google サービスの約 40 のエントリが含まれています。自分の証明書をこのリストに追加してピン留めします。android.permission.WRITE_SECURE_SETTINGS
ただし、このリストを変更するには、システム アプリでのみ使用できるAndroid 権限 ( ) が必要です。
このリスト (つまり、/data/misc/keychain/pins) に追加するリクエストを送信するために、Google で何らかの手続きが行われている可能性があるかどうかを知っている人はいますか?
ios - iOS での SSL ピンニング - NSURLConnection での TLS キャッシュの問題
iOS アプリに SSL 証明書の固定を実装する際に問題が発生しました。現在NSURLConnection
、認証チャレンジのデリゲートを使用しています。これで問題なく、アプリへの最初のログイン時に呼び出され、サーバーに接続されていることが保証されます。
私たちは TLS キャッシングを認識しており、ピンニング デリゲート メソッド ( willSendRequestForAuthenticationChallenge ) が 10 分間再度呼び出されることはありません。ログイン時に証明書を確認するだけでよいため、これは実際には問題ではありませんが、より頻繁に確認することが望ましいです。Apple にサポート チケットを提出したところ、TLS キャッシングは、ピニング デリゲート メソッドが定期的にしか呼び出されないことを意味するが、暗号化キー交換が呼び出し間の MITM プロキシ攻撃の発生を防止することを確認する応答を受け取りました。
良さそうですが、そうではないようです。発見したことは次のとおりです。起動時に通常どおりアプリにログインすると、ピン留めデリゲートが呼び出されます。次に、アプリをバックグラウンドで実行し、Burp Suite を実行している macbook のプロキシ サーバーに iPhone を接続します (サーバーの信頼証明書は、この時点で既に iPhone にインストールされています)。その後、アプリをフォアグラウンドにし、ログアウトしてから再度ログインすると、この時点で TLS セッションが無効になっているはずですが、 willSendRequestForAuthenticationChallenge は呼び出されません。
リクエストでさまざまなキャッシング ポリシーを指定しようとしましたが、違いはないようです。MITM プロキシが追加された状態でデリゲートが再度呼び出されない理由がわかりません。アドバイスをいただければ幸いです。
ssl - libcurl を使用した SSL 証明書のピニング
この例が libcurl で証明書のピン留めを提供するのに十分かどうか知りたい: http://curl.haxx.se/libcurl/c/cacertinmem.html
curl もhttp://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.htmlを許可することがわかったので
私は自己署名証明書を使用し、それを信頼するだけなので、それを固定する必要があるかどうかはわかりません。
再開: 例のように自分の証明書 (自己署名) を x509 証明書ストアに追加するだけで、接続が侵害される可能性はありますか? 余分なチェックを追加する必要がありますか? CURLOPT_PINNEDPUBLICKEY オプションを使用する必要がありますか?
ありがとう。
android - 証明書のピン留め - 不正な開発者が Android で証明書ファイルを取得するとどうなるか
認証ピンニング開発を使用する場合、サードパーティは https 証明書で信頼されず、代わりにデバイスに保存されると言っています。Android APK をリバース エンジニアリングすると、この証明書にアクセスできなくなりますか? 私はその公開を認識していますが、それを使用して中間者攻撃を行うことができますよね? 誰もアクセスできないように、証明書をどこに置くべきですか? Android のリソース フォルダーに *.cer 証明書ファイルがありますが、そのファイルの安全性を知る必要があります。
android - Google Cloud Endpoints の使用時に中間者攻撃を回避するにはどうすればよいですか?
私は現在、最初の Android アプリを作成しており、Google クラウド エンドポイントを使用することにしました。このドキュメントに従って、バックエンド エンドポイント メソッドを保護しました: https://cloud.google.com/appengine/docs/java/endpoints/auth、 https://cloud.google.com/appengine/docs/java/endpoints/ gen_clients、https: //cloud.google.com/appengine/docs/java/endpoints/consume_android
基本的に、エンドポイントの WEB_CLIENT_ID と ANDROID_CLIENT_ID を生成し、保護する各メソッドに param User を追加し、最後にメソッド内でユーザーが null でないことを確認する必要があります。それ以外の場合は OAuthRequestException をスローします。
クライアント Android ライブラリをビルドし、Android アプリで次のように構成しました。
最初は、資格情報なしではバックエンド メソッドを使用できないため、かなりうまく機能しているように見えます。(401エラーになります)
残念ながら、「Charles Proxy」( https://www.charlesproxy.com/ ) などのツールを使用すると、バックエンド エンドポイントへの https 要求/応答を復号化できることに気付きました。Charles プロキシ証明書をスマートフォンにインストールして、プロキシを設定するだけです。
同じ問題の別の説明を次に示します: http://nickfishman.com/post/50557873036/reverse-engineering-native-apps-by-intercepting-network
これで、Android アプリで使用されるエンドポイント URL が得られました。各リクエストで送信されたすべてのパラメーターと、トークンを含む自動化プロパティを含むすべてのヘッダー プロパティを取得したので、基本的に、アプリでバックエンド エンドポイントを使用するために必要なすべての情報が得られます。 . :( しばらくするとトークンの有効期限が切れることはわかっていますが、その間にデータを抽出できます。
Google は、Google クラウド ストアのドキュメントでそれについて話します: https://cloud.google.com/storage/docs/concepts-techniques#bestpractices
「サーバー証明書を検証する HTTPS ライブラリを使用していることを確認してください。サーバー証明書の検証が行われていないと、アプリケーションが中間者攻撃やその他の攻撃に対して脆弱になります。」
素晴らしいですが、ツールで生成されたエンドポイント クライアント ライブラリを使用すると、脆弱になります。
この問題を回避する解決策があることは知っています: https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning
しかし、生成されたエンドポイント クライアント Android ライブラリを使用して、中間者攻撃を回避するにはどうすればよいですか?
ssl - SSL ピニングと証明書の有効期限
この質問は、Web API と証明書の有効期限に対するクライアント アプリでの SSL ピンニングの使用に関連しています。
シナリオ:
私はexample.comを所有しており、 APIがホストされているサブドメインを持っています: api.example.com
SSL経由で API を使用したいので、サブドメイン用に SSL 証明書が作成されます。
証明書を取得した後、私は次のことを行いました。
- 公的証明書
- 中間証明書
- 秘密鍵
これらの証明書を Web サーバーにインストールすることを理解しています。
次に、クライアント アプリが API に接続することを望みます。man-in-the-middle スタイルの攻撃を軽減するために、SSL ピニングを使用して、クライアントが自分の API とのみ通信し、なりすましを行わないようにしたいと考えています。
クライアント アプリにピン留めするには、パブリック証明書または中間証明書に対してピン留めする 2 つの選択肢があります。
これを実装するとしましょう。
api.example.comの証明書の有効期限が切れるとどうなりますか?
クライアント アプリが機能しなくなることは理解しています。
パブリック/中間/プライベート アイテムの完全なセットを再生成する必要がありますか? 次に、新しい公開証明書または中間証明書をアプリに入れますか?
質問:
api.example.com の証明書が更新されるまで、クライアント アプリを引き続き動作させたいと考えています。もちろん、新しい証明書をクライアント アプリに入れることはできますが、ロールアウトなどには時間がかかります。
どうすればこれを処理できますか?
Google が証明書を毎月更新しているのを読んだことがありますが、どうにかして公開鍵を同じに保つことができます: iOS で証明書の公開鍵をピン留めする方法
それが可能であれば、解決策は単純にサーバーから公開鍵を抽出し、それをローカルに保存されている公開鍵と照合することです...しかし、Googleはどのようにそれを行うのでしょうか?
ありがとう
クリス
ios - Alamofire での証明書のピン留め
HTTPS Web サービスにアクセスする iPad アプリを作成しています。ピン留めを実装したいのですが、問題があります。
このクラスは Alamofire Manager を作成します (主にドキュメントから取得)。
この関数は呼び出しを行います:
証明書はプロジェクトに保存され、 [ターゲット] > [ビルド フェーズ] > [バンドル リソースのコピー] の下に表示されます。
現在、(のelseブロックから)リクエストを行うたびに次のエラーが表示されますtestPinning()
: