
문제:이제 iOS 9가 ATS를 사용하므로 모바일 앱은 더 이상 웹 서비스에 대한 보안 연결을 설정할 수 없습니다.
서버 설정:Windows Server 2008 R2 SP1(VM) IIS 7.5, digicert의 SSL 인증서. Windows 방화벽이 꺼져 있습니다.
키 RSA 2048비트(e 65537)
발급자 DigiCert SHA2 보안 서버 CA
서명 알고리즘 SHA512withRSA
앱 전송 보안 요구 사항은 다음과 같습니다.
서버는 최소한 TLS(Transport Layer Security) 프로토콜 버전 1.2를 지원해야 합니다. 연결 암호는 순방향 비밀성을 제공하는 암호로 제한됩니다(아래 암호 목록 참조). 인증서는 SHA256 이상의 서명 해시 알고리즘, 2048비트 이상의 RSA 키 또는 256비트 이상의 타원 곡선을 사용하여 서명되어야 합니다. (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_A ES_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 HE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
시도한 것:
- 도메인이 작동할 수 있도록 모바일 앱에 예외를 추가했지만 보안되지 않은 이 방법을 사용하고 싶지 않고 SSL을 수정하고 싶습니다.
- 사용된IIS 암호화'모범 사례'를 사용하기 위해 'pci' 및 사용자 정의 설정을 시도했습니다. 위의 목록으로 암호화 제품군을 수정하고 순서를 변경해 보았습니다. 시도할 때마다 서버가 재부팅되고SSL 연구소(캐시를 지운 후) 실행되었습니다. F 등급에서 A, 심지어 A-까지 성공적으로 진행했지만 이로 인해 iOS 8과 9에서는 보안 연결을 설정할 수 없게 되었습니다. (NSURLErrorDomain 코드=-1200 및 _kCFStreamErrorCodeKey=-9806)
- VM을 복원하고 powershell 스크립트를 시도했습니다.SSL Perfect Forward Secrecy 및 TLS 1.2를 위해 IIS를 설정하세요.나는 파워 스크립트의 암호를 필요한 최소한의 목록으로 편집하는 두 번째 시도도 했습니다.
결과:항상 유사하며 등급은 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
처음 세 개의 패킷은 TCP 연결을 설정하는 전통적인 SYN - SYN-ACK - ACK 3방향 핸드셰이크입니다. 네 번째 패킷은 iOS가 서버에 TLS 클라이언트 Hello 메시지를 보내는 것입니다. 이는 해당 TCP 연결을 통해 TLS 연결을 설정하는 첫 번째 단계입니다. 이 메시지를 분리해 보니 충분히 그럴듯해 보입니다. 다섯 번째 패킷에서 서버는 단순히 연결을 끊습니다(RST를 보냄으로써).
IIS 7.5가 RST를 수행하는 이유를 아는 사람이 있습니까?
답변1
질문은 오래되었지만 검색 중에 발견됩니다. 나는 같은 문제에 대한 해결책을 찾기 위해 시간을 보냈습니다. 그래서 나는 내 결과를 다른 사람들과 공유하기 위해 답을 쓰기로 결정했습니다.
짧은 대답: IIS 암호화를 사용하여 암호 제품군의 순서를 지정하면 안 됩니다. 이전에 설정된 순서를 제거하려면 "기본값" 버튼을 클릭한 다음 그룹 정책("컴퓨터 구성" \ "관리 템플릿" \ "네트워크" \ "SSL 구성 설정")을 사용하여 로컬 정책을 통해 암호 제품군을 구성하는 것이 좋습니다.
"프로토콜 또는 암호 그룹 불일치" 오류의 원인은 다음 중 하나일 수 있습니다.:
- 귀하의 서버는 일부 "잘못된 암호 제품군"을 지원합니다.
- 귀하의 서버는 TLS 사양에 따라 지원되어야 하는 일부 암호화 제품군을 지원하지 않습니다.
- 귀하의 서버는 HTTP/2를 지원하며블랙리스트 ~ 위에목록에 없는 다른 프로토콜. 일반적으로 문제를 해결하려면 암호화 제품군의 순서를 변경하는 것으로 충분합니다.
정확한 블랙리스트는 시스템마다 다를 수 있습니다. 인터넷에서 블랙리스트를 찾을 수 있습니다. 예를 들어,부록RFC 7540(HTTP/2)에는 하나의 목록이 포함되어 있습니다. 암호화 제품군은 TLS_RSA_WITH_AES_128_CBC_SHA
TLS 1.2용입니다(참조:여기) 및 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
1.3의 경우(참조여기). 중요한 TLS_ECDHE_ECDSA_*
것은 타원 곡선이 있는 인증서를 사용한다는 것입니다. 다른 매우 우수한 암호화 제품군은 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
아직 Microsoft에서 구현되지 않았습니다. 또한 IE 8/XP 지원이 필요한 경우에만 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
기존 시스템의 연결을 지원하고 TLS_RSA_WITH_AES_128_CBC_SHA
매우 오래된 시스템(Android 2.3.7, Java 6u45, OpenSSL 0.9.8y)을 지원하기 위해 최소한 추가하는 것을 고려할 수 있습니다 . TLS_RSA_WITH_3DES_EDE_CBC_SHA
예를 들어 오늘 사용할 수 있습니다.
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS 1.0, TLS 1.1 비활성화보안을 강화하거나
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
좋은 보안과 최고의 성능이 필요한 경우.
예를 들어 문제를 해결하기 위해 다음과 같은 짧은 암호 제품군을 설정할 수 있습니다.
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
아래에는 Windows 10의 구성 예가 포함되어 있습니다.RSA 2048 키와 Let's Encrypt의 무료 SSL 인증서를 갖춘 Qualys SSL Labs의 A+ 등급.
DES 56/56, RC2 128/128, RC2 40/128, RC2 56/128, RC4 128/128, RC4 40/128, RC4 56/128, RC4 64/128, Triple DES 168/168, NULL을 비활성화했습니다. MD5, 다중 프로토콜 통합 Hello, PCT 1.0, SSL 2.0, SSL 3.0 및 TLS 1.0/1.1레지스트리에서 수동으로(보다KB245030). TLS_FALLBACK_SCSV(다운그레이드 공격)는 현재까지 IIS에서 방지할 수 없기 때문에 TLS 1.0 및 TLS 1.1 프로토콜을 비활성화했습니다. 이로 인해 A+ 등급을 받을 수 없습니다.www.ssllabs.com. 단점으로 보는데 TLS 1.2는 현재 매우 광범위하게 지원됩니다. 그런데 을 사용할 수 있지만 TLS 1.0 및 TLS 1.1의 경우입니다 DisabledByDefault: 1
. Enabled: 1
컴퓨터에서 SQL Server 2008/2012를 실행하면 도움이 될 수 있습니다. 웹 서버는 TLS 1.0 및 TLS 1.1을 사용하지 않지만 SQL Server는 사용합니다.
시간이 많이 걸리고 주요 문제인 가장 중요한 단계는 Cipher Suites를 구성하는 것입니다.를 이용하여 만들었습니다 gpedit.msc
. "컴퓨터 구성" \ "관리 템플릿" \ "네트워크" \ "SSL 구성 설정"을 선택하고 "SSL Cipher Suite Order" 값을 다음과 같이 구성했습니다.
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
위의 순서는 최적이 아닐 수 있으며 위의 모든 프로토콜이 IIS 7.5에서 지원되는지 확실하지 않습니다(Windows 10의 IIS 10.0을 사용했습니다). 그럼에도 불구하고 귀하의 문제는 Cipher Suite 목록과 관련이 있다고 확신합니다. Cipher Suite 목록을 실험하는 동안 설명한 것과 똑같은 문제가 있었기 때문입니다.
어쨌든 그룹 정책에서 위의 설정을 구성한 후컴퓨터 재부팅 중( gpupdate /force /target:computer
내 테스트에서는 충분하지 않았습니다.) A+ 등급을 받았으며 "핸드셰이크 시뮬레이션" 부분에 대한 다음 테스트 결과 목록을 받았습니다.
다음 클라이언트에 대해 iOS가 성공적으로 지원되는 것을 볼 수 있습니다.
Safari 6 / iOS 6.0.1
Safari 7 / iOS 7.1
Safari 8 / iOS 8.4
Safari 9 / iOS 9
TLS 1.2를 지원하지 않는 클라이언트는 지금은 그다지 중요하지 않은 것 같으며 위의 구성은 레거시 클라이언트 지원과 안전한 프로토콜 사용 간의 적절한 절충안이라고 생각합니다.
답변2
IIS 암호화 이미지가 최근인 경우 설정을 그대로 유지하되 SHA, Diffie-Hellman 및 PKCS를 활성화하세요. 이렇게 하면 A 등급을 받게 되지만 iOS 8 이하에서는 연결할 수 있습니다.
답변3
나는 며칠 동안 이것 때문에 어려움을 겪었습니다. 특히 OAuth2 Bearer 토큰 인증을 통해 ASP.NET Web Api 2 나머지 서비스에 연결하기 위해 Xamarin Forms PCL을 사용하여 iOS 앱에서 연결했습니다.
결국 나에게 도움이 된 것은 IIS Crypto의 모범 사례를 사용하는 것이었습니다. 그런 다음 암호 제품군 순서에 대해 설정된 레지스트리 키를 편집합니다.
KEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\00010002\Function
다음 값으로 성공했습니다.
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P521,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384,TL S_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P521,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P2 56,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P521,TLS_ECDHE_RSA_WITH_AES_128_CBC_S HA256_P384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256,TLS_ECDHE_RSA_WITH_AES_12 8_CBC_SHA_P521,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA2 56,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,TLS_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECD HE_ECDSA_WITH_AES_256_GCM_SHA384_P521,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P3 84,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P521,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_ SHA256_P384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P521, TLS_ECDHE_ECDSA_256_CBC _P3844, DSA_WITH_AES_256_CBC_SHA_P521, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P384, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256 256_P521, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256, TLS_ECDHE_ECDSA_SHAS_SAES_WISH_SAES_128_CBC 2 ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 SHA256, TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, TLS_DHE_DSS_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, TLSS_DHE_DSO_256. tls_dhe_dss_with_3des_ed_cbc_sha, tls_rsa_with_rc4_128_sha, tls_ecdhe_ecdsa_with_aes_256_gcm_sha384, tls_ecdhe_ecdsa_ith_ith_shm 5, ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_RC4_128_MD5,TLS_RSA_WITH_DES_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
마지막 항목은 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256을 자동으로 협상하는 Charles Proxy를 사용하여 발견되었습니다. 나를 이끈 것은 Charles Proxy를 사용하여 (시뮬레이터 인증서가 설치된 상태에서) 연결이 성공했지만 그렇지 않으면 실패했다는 것입니다. 협상에 사용된 제품군을 추가하면 성공했습니다. 프록시가 내 서버에서 지원하지만 iOS 클라이언트에서는 지원하지 않는 서비스를 사용하여 내 나머지 서비스와 재협상하고 있는 것으로 보입니다.
많은 암호화 제품군은 다양한 iOS/OSX 장치에 대한 ssllabs의 기본 제품군 사양에서 얻은 것입니다. 위의 값은 XP에서 IE 6을 제외한 모든 것과 핸드셰이크해야 합니다.ssllabs에 따르면 A 등급입니다.