인디노트

OS X 에서 HTTPS 사이트의 접속 테스트 본문

개발 플랫폼 및 언어

OS X 에서 HTTPS 사이트의 접속 테스트

인디개발자 2022. 12. 9. 10:50

iOS 9 부터 관련 개발을 하다보면 네트워크 접속에 있어서 다음과 같은 에러를 만날때가 있다. 

Error : Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSErrorFailingURLStringKey=https://dev.otpkey.org/, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <664D4150-8314-4BA3-8D69-3320338D9CE2>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=( ---- 어쩌구 저쩌구....

/usr/bin/nscurl --ats-diagnostics --verbose https://dev.otpkey.org

이럴때 체크 해 보면 어떤 문제인지 확인에 도움이 될 수 있다.

기본적으로 ATS 관련 조건은 다음과 같다.

The server certificate must meet at least one of the following trust requirements:
Issued by a certificate authority (CA) whose root certificate is incorporated into the operating system
Issued by a trusted root CA and installed by the user or a system administrator
The negotiated Transport Layer Security version must be TLS 1.2
The negotiated TLS connection cipher suite must support forward secrecy (FS) and be one of the following:
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
The leaf server certificate must be signed with one of the following types of keys:
Rivest-Shamir-Adleman (RSA) key with a length of at least 2048 bits
Elliptic-Curve Cryptography (ECC) key with a size of at least 256 bits
In addition, the leaf server certificate hashing algorithm must be Secure Hash Algorithm 2 (SHA-2) with a digest length of at least 256 (that is, SHA-256 or greater).

 

이를 무시하도록 하려면 plist 에 관련 설정을 하면 되지만... 내 경우에 잘 되지 않는것 같다. (iOS 13 이상)

App Transport Security Settings

이를 무시하고 이전 버전과 호환성을 유지하려면 다음 페이지에서 Apple 의 Cocoa Keys 들을 확인 할 수 있다.

https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html

하지만, 다음과 같은 내용에 있어서 App Store 리뷰시 근거를 제공해야 한다.

ATS에 대한 App Store 검토
특정 앱 전송 보안(ATS) 키를 사용하면 앱에 대한 추가 App Store 검토가 트리거되며 근거를 제시해야 합니다. 이러한 키는 다음과 같습니다.

NSAllowsArbitraryLoads
NSAllowsArbitraryLoadsForMedia
NSAllowsArbitraryLoadsInWebContent
NSExceptionAllowsInsecureHTTPLoads
NSExceptionMinimumTLSVersion
고려할 수 있는 정당성의 몇 가지 예는 다음과 같습니다.

보안 연결을 지원하지 않는 다른 엔터티에서 관리하는 서버에 연결해야 합니다.
보안 연결을 사용하도록 업그레이드할 수 없고 공용 호스트 이름을 통해 액세스해야 하는 장치에 대한 연결을 지원해야 합니다.
NSAllowsArbitraryLoadsInWebContent다양한 소스의 임베디드 웹 콘텐츠를 제공해야 하지만 키 에서 지원하는 클래스를 사용할 수 없음
앱은 암호화되고 개인화된 정보가 포함되지 않은 미디어 콘텐츠를 로드합니다.
App Store에 앱을 제출할 때 앱이 기본적으로 보안 연결을 할 수 없는 이유를 판단할 수 있도록 App Store에 충분한 정보를 제공하십시오.

따라서, 가능하면 해당 서버의 TLS 버전 및 TLS 알고리즘 등의 지원으로 해결하는게 합리적이라 할 수 있다.

나의 경우에는 TLS v1.3 지원의 문제였다. (서버가 TLS v1.2 까지만 제공하도록 설정되어 있었다.)

Nginx 에 다음을 추가하여 해결하고

ssl_protocols TLSv1.2 TLSv1.3;

앱 Core 의 OpenSSL 코어에 다음과 같은 키교환 알고리즘을 추가하여 해결 하였다.

SSL_CONF_cmd(CCTX, "Curves", "P-521:P-384:P-256");

SSL_CONF_cmd(CCTX, "SignatureAlgorithms", "RSA-PSS+SHA256:RSA+SHA256:RSA+SHA512:ECDSA+SHA512:AEAD-AES128-GCM-SHA256:AEAD-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:AES256-SHA");

반응형
Comments