%20%E3%82%A2%E3%83%97%E3%83%AA%E3%81%8C%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%80%81nginx%20%E3%81%A7%E5%89%8D%E6%96%B9%E7%A7%98%E5%8C%BF%E6%80%A7%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82.png)
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 の現在の設定です。NO
Info.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: