デフォルトの ATS 設定を持つ iOS9 (Xcode7) アプリがサーバーに接続できるように、nginx で前方秘匿性を設定する方法を教えてください。

デフォルトの ATS 設定を持つ iOS9 (Xcode7) アプリがサーバーに接続できるように、nginx で前方秘匿性を設定する方法を教えてください。

iOS9のApp Transport Securityでは、特定の要件を満たさない接続は失敗すると規定されています。以下はAppleのドキュメントから引用した要件です(https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/index.html

  • サーバーは少なくともトランスポート層セキュリティ (TLS) プロトコル バージョン 1.2 をサポートしている必要があります。
  • 接続暗号は、前方秘匿性を提供するものに限定されます (以下の暗号のリストを参照してください)。
  • 証明書は、2048 ビット以上の RSA キーまたは 256 ビット以上の楕円曲線 (ECC) キーを使用して、SHA256 以上の署名ハッシュ アルゴリズムを使用して署名する必要があります。

私のサーバーが実際に 2048 ビット RSA キーの証明書を使用し、SHA256 ハッシュ アルゴリズムを使用して署名されていることを確認しました。いずれにしても、Xcode7 でビルドしたアプリは、デフォルトの ATS 設定ではサーバーに接続できませんでした。ただし、アプリの で にNSExceptionRequiresForwardSecrecy設定した後は、接続に成功しました。そのため、サーバーが Forward Secrecy 暗号で正しく構成されていないようです。以下は、nginx.conf の現在の設定です。NOInfo.plist

ssl_protocols             TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers               'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

私の証明書はComodoによって発行されており、上記の設定もComodoのサポートドキュメントからのものです(https://support.comodo.com/index.php?/Default/Knowledgebase/Article/View/789/37/certificate-installation-nginx)。

Apple のドキュメントによると、デフォルトの ATS 設定では、受け入れられる暗号は次のとおりです。

  • 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

(私の nginx の ssl_ciphers 設定にはこれらの暗号が含まれているようです。)

また、アプリの設定で にNSExceptionRequiresForwardSecrecy設定されている場合、次の暗号も受け入れられます。NO

  • LS_RSA_WITH_AES_256_GCM_SHA384
  • TLS_RSA_WITH_AES_128_GCM_SHA256
  • TLS_RSA_WITH_AES_256_CBC_SHA256
  • TLS_RSA_WITH_AES_256_CBC_SHA
  • TLS_RSA_WITH_AES_128_CBC_SHA256
  • TLS_RSA_WITH_AES_128_CBC_SHA

これを に設定するとNO、アプリはサーバーに正常に接続しますが、理由は不明です。

私の質問は、デフォルトの ATS 設定を持つ iOS9 (Xcode7) アプリが正常に接続できるように、前方秘匿暗号用に nginx をどのように設定すればよいかということです。


更新しました:

私は以下のガイドに従ってサーバーを再構成しました。https://weakdh.org/sysadmin.html次のコマンドで新しい DH グループを再生成します。

openssl dhparam -out dhparams.pem 2048

これを nginx 設定に追加しました:

ssl_dhparam dhparams.pem;

しかし、私のアプリからの接続はまだ失敗します。nsurl --ats-diagnosticsツールは依然として、問題が前方秘匿性によって発生していると示しています。


診断目的で、以下はsslテスト私のサーバーの結果ページのスクリーンショットssllabs:

ここに画像の説明を入力してください

関連情報