데이터를 활용하기 위해 자체 웹 서버 중 하나에 부딪히는 iOS 앱을 작성 중입니다. IIS 웹 서버는 공개적으로 액세스 할 수 있으며 유효한 암호화 인증서를 가지고 있으며 TLS 1.2를 사용합니다. 필자의 지식으로는 App Transport Security를 사용하여 스너프를 처리해야합니다. 앱에서 웹 요청을 할 때 요청 시간이 초과되었지만보다 흥미롭게도이 메시지는 "NSURLSession/NSURLConnection HTTP로드 실패 (kCFStreamErrorDomainSSL, -9806)"로 기록됩니다.iOS의 웹 요청을 클라이언트 인증서를 허용하는 웹 서버로 변경
이 IIS 서버는 일 수 있습니다. 모바일 응용 프로그램을 포함하지 않는 별도의 유스 케이스에 대한 X509 클라이언트 인증서를 수락하십시오. 설정을 으로 변경하면을 무시하면 iOS 앱이 서버를 정상적으로 종료합니다. 서버에서 클라이언트 인증서를 요청하는 메시지가 나타나고 응답이 없기 때문에 시간 초과가 발생한다고 가정합니다. 클라이언트 인증서가 으로 설정되어 있지 않습니다. 참고로이 필요합니다. iOS 앱을 멋지게 재생하고 서버에서 클라이언트 인증서를 요청할 때 계속 수행하는 방법을 잘 모르겠습니다.
iOS에서 작동하도록하려면 IIS 서버를 허용하는 방법이 있습니까 클라이언트 인증서를 수락 하시겠습니까? 나는 info.plist에 hacky 제외를 추가하여 ATS를 줄이고 싶지 않습니다.
나는 그것이 적절하다고 생각하지 않지만, C#의 Xamarin.IOS에서 iOS 응용 프로그램을 개발 중입니다. 요청은 이런 식입니다 :
using (var client = new WebClient())
{
client.Headers.Add(Constants.RequestHeaders.RequestId, nonce.RequestId.ToString());
client.Headers.Add(Constants.RequestHeaders.Signature, Convert.ToBase64String(nonce.DigitalSignature));
client.Headers.Add(HttpRequestHeader.ContentType, "application/json");
var resultJson = client.UploadString("https://foo.com/Api/Register", json);
}
편집 :
내가 NuGet을 통해 사용할 수있는 라이브러리 ModernHttpClient를 사용하여이 문제를 해결할 수 있었다. API 사이트는 클라이언트 인증서를 허용하지만 인증서는 필요하지 않습니다. 대부분의 브라우저에서는 브라우저에서 사용하려는 인증서를 지정하라는 메시지가 한 번 표시됩니다. 그러나 iOS에서 기본적으로 프로그래밍 방식의 웹 요청을하면 프롬프트가 표시되지 않으며 제공 할 인증서가없는 서버에 알려주지 않습니다. 따라서 요청이 단순히 타임 아웃되었습니다. ModernHttpClient를 사용하여 자동으로 해결하도록이 동작을 설정하는 방법을 찾았습니다.
var handler = new NativeMessageHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Automatic;
using (var client = new HttpClient(handler))
{ ...
이제 제대로 작동합니다. 나는이 특별한 목적을 위해 라이브러리를 포함 할 필요가 없다는 것을 선호하지만 작동한다. 아마도이 특정 기능은 라이브러리를 사용하지 않고 몇 줄의 코드로 추출 될 수 있습니까? 그럼에도 불구하고 ModernHttpClient가이 문제를 해결해 준 것에 감사드립니다. iOS 특질을 지원하기 위해 서버 동작을 변경하는 것은 정말 해킹입니다.