2016-08-12 2 views
1

TLS를 사용하여 웹 서버와 통신하는 iOS 응용 프로그램을 만들고 있습니다. 웹 서버에 액세스하면 내 장치에 인증서가 표시되고 신뢰할 수 있음을 확인하고 싶습니다.수동으로 TLS 인증서 유효성 검사 (ios objective-c)

내 xcode 프로젝트에 der 파일로 포함 된 루트 인증서가 있습니다. 지금까지 NSURLConnection의 인증 위임 기능에 대한 두 인증서의 NSString 버전을 얻은 코드가 있습니다.

수동으로 확인하는 방법에 대한 아이디어가 있으십니까? 나는이 글이 당신의 목적을 해결할 생각

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { 
NSLog(@"Certificate challenge"); 
if (self.stageNum==0) { 
    id <NSURLAuthenticationChallengeSender> sender=challenge.sender; 
    NSURLProtectionSpace *protectionSpace=challenge.protectionSpace; 
    SecTrustRef trust=[protectionSpace serverTrust]; 

    //Get server certificate 
    SecCertificateRef certificate=SecTrustGetCertificateAtIndex(trust, 0); 
    NSData *serverCertificateData=(__bridge NSData *)SecCertificateCopyData(certificate); 
    NSString *serverBase64Certificate=[serverCertificateData base64EncodedStringWithOptions:0]; 

    //Get our certificate 
    NSData *certData1 = [[NSData alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"SUMOSRoot" ofType:@"der"]]; 
    NSString *certBase64=[certData1 base64EncodedStringWithOptions:0]; 

    //Heres where I need to compare the certificates 
    // 
    // 

    [sender useCredential:[NSURLCredential credentialForTrust:protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; 
} 
} 

답변

1

:

여기에 내 현재 코드입니다. 아름답게 쓰고 설명했다. 링크를 열 너무 게으른

http://www.techrepublic.com/blog/software-engineer/use-https-certificate-handling-to-protect-your-ios-app/

사람들은 내가 포스트에서 여기 몇 가지 설명을 추가 할 수 있습니다.

enter image description here

+1

인증서가 결국 만료되어 재생성되어 더 이상 기대되는 해시와 일치하지 않기 때문에 정상적으로 작동하지 않습니다. 신뢰 객체에서 공개 키를 가져 와서 예상 된 키와 비교하는 것이 좋습니다. 그렇게하면 관리자가 cert를 재생성 한 후에도 서버를 계속 신뢰하게됩니다 (관리자가 키를 변경하지 않는다고 가정 할 때). – dgatwood

+0

링크를 제공해 주셔서 감사합니다! 나는 모양을 볼 것이다 –

+0

이 링크가 작동 했습니까? – Harsh

1

나는 당신이 NSString 표현을 얻을 싶어 이유를 모르겠어요. 일단 SecTrustRef이 있으면 SecTrustCopyPublicKey으로 전화를 걸어 공개 키를 SecKeyRef에 복사 한 다음 원본 키 데이터 (원시 바이트)와 비교할 수 있습니다. 공개 키가 일치하면 인증서를 수락해야합니다.

이 기술은 "인증서 고정"이라고하며이 용어를 검색하면 전체 코드 샘플을 제공 할 수있는 스택 오버플로에 대한 답변이 많이있을 것입니다.

표면 상으로는 인증서를 비교할 수도 있지만, 인증서가 주기적으로 만료되어 업데이트되어야하기 때문에 원치 않는 작업 일 수 있습니다. 키를 비교하면 동일한 개인 키/공개 키 쌍으로 재생성한다고 가정하고 인증서를 재생성하더라도 키가 계속 작동합니다.

또는 수명이 긴 특정 개인용 루트 인증서에 연결하려는 경우 신뢰할 수있는 앵커 목록에 해당 인증서를 추가하고 신뢰할 수있는 개체를 다시 평가할 수 있습니다.이 경우 개인 루트 인증서가 만료됩니다. 다른 한편, 키를 고정하면 어떤 이유에서든 개인 키를 변경해야하는 경우 중단됩니다 ... 그래서 절충안입니다.

물론 가능한 가장 일반적인 선택은 실제 CA 인증서를 얻는 것이고 체인 유효성 검사를 망칠 필요는 없지만 이것이 가능하지 않다고 가정합니다 (예 : 서버가 .local 도메인에 있거나, 인터넷 액세스 또는 다른 유사한 이유없이 자체 인증서를 생성하는 물리적 장치에 있기 때문에). 로컬 네트워크상의 임의의 하드웨어와의 보안 통신과 같은 경우에는 키 고정이 가장 좋은 방법입니다. 키가 일치하지 않으면 사용자가 새 키로 장치를 추가해야합니다.

+0

답변 해 주셔서 감사합니다. 나는 인증서 피닝에 대해 더 연구 할 것이다. 그리고 당신이 맞습니다,이 상황에 대한 실제 CA 인증서를 사용할 수 없습니다 –