問題: iOS 9がATSを使用するようになったため、モバイルアプリはWebサービスへの安全な接続を確立できなくなりました。
背景: iOS 9にはApp Transport Securityが導入されています
サーバーのセットアップ: Windows Server 2008 R2 SP1(VM)IIS 7.5、digicertからのSSL証明書。Windowsファイアウォールがオフ。
キーRSA 2048ビット(e 65537)
発行者DigiCert SHA2セキュアサーバーCA
署名アルゴリズムSHA512withRSA
App Transport Securityの要件は次のとおりです。
サーバーは、少なくともTransport Layer Security(TLS)プロトコルバージョン1.2をサポートする必要があります。接続暗号は、前方秘匿性を提供するものに限定されます(以下の暗号のリストを参照してください)。証明書は、2048ビット以上のRSAキーまたは256ビット以上のElliptic-Curveで、SHA256以上の署名ハッシュアルゴリズムを使用して署名する必要があります(ECC)キー。証明書が無効な場合、ハード障害が発生し、接続できなくなります。これらは受け入れられた暗号です:
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
試行されたもの:
- ドメインが機能するようにモバイルアプリに例外を追加しますが、このセキュリティで保護されていない方法を使用したくないので、SSLを修正します。
- 使用IIS暗号を「ベストプラクティス」を使用するには、「PCI」を試してみました、およびカスタムセットアップ。暗号スイートを上記のリストだけに変更して、並べ替えを試みました。各試行の後、サーバーが再起動され、SSL Labsが実行されました(キャッシュをクリアした後)。私はFからA、さらにはA-に移行することに成功しましたが、これはiOS 8と9が安全な接続を確立できないという結果に終わりました。(NSURLErrorDomain Code = -1200および_kCFStreamErrorCodeKey = -9806)
- VMを復元し、PowerShellスクリプトを試しましたSSL Perfect Forward SecrecyおよびTLS 1.2用にIISをセットアップしました。電源スクリプトから必要なものの最小限のリストに暗号を編集する2回目の試行も行いました。
結果:常に類似、AまたはA-の評価。iOS8およびiOS9は、安全な接続をネゴシエートできません。ハンドシェイクシミュレーションの結果、SafariおよびiOS製品で「プロトコルまたは暗号スイートの不一致」が発生します。
更新 Appleサポートと連携した後、パケットトレースキャプチャを行いました。
$ tcpdump -n -r trace.pcap
reading from file trace.pcap, link-type EN10MB (Ethernet)
client > server [S], seq 1750839998, win 65535, length 0
server > client [S.], seq 2461151276, ack 1750839999, win 8192, length 0
client > server [.], ack 1, win 4104, length 0
client > server [P.], seq 1:175, ack 1, win 4104, length 174
server > client [R.], seq 1, ack 175, win 0, length 0
最初の3つのパケットは、TCP接続をセットアップする従来のSYN-SYN-ACK-ACK 3ウェイハンドシェイクです。4番目のパケットは、iOSがサーバーにTLSクライアントHelloメッセージを送信することです。これは、そのTCP接続を介してTLS接続をセットアップする最初のステップです。私はこのメッセージをバラバラにしましたが、それは十分に合理的です。5番目のパケットでは、サーバーは(RSTを送信して)接続を単にドロップします。
IIS 7.5がRSTを実行する理由を誰もが知っていますか?