2

iOS アプリで HTTPS POST を使用して社内の REST サービスに接続しています。このサービスには、基本的な HTTP 認証が必要です。

HTTPHeader で認証パラメーターを渡そうとすると、サーバーから「エラー ドメイン = NSURLErrorDomain コード = -1202」というエラーが返されました。このサーバーの証明書は無効です。「oiam.XXXX.com」になりすましたサーバーに接続している可能性があり、機密情報が危険にさらされる可能性があります。" UserInfo=0x8d1de60 {NSErrorFailingURLStringKey= https://oiam.xxxx.com/NSLocalizedRecoverySuggestion=よろしいですかとにかくサーバーに接続しますか?,"

いくつかの質問を読みましたが、証明書をインストールする必要があるようです。私は iOS シミュレーターを使用しているため、証明書をインストールできませんでした。

NSURLConnectionDelegate プロトコルを使用しようとしたところ、接続が機能しました。

私が持っている唯一の問題は、ユーザー名パスワードを渡すこの方法です。安全ですか?値をエンコードする必要がないのはなぜですか? ヘッダーで HTTPS Basic 認証を行いながら値を渡すためのエンコードを行っていました。

-(void)connection:(NSURLConnection *)connection       willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
if ([challenge previousFailureCount]) {
   [[challenge sender] cancelAuthenticationChallenge:challenge];
} else {
    NSURLCredential *credential = [NSURLCredential credentialWithUser:@"username1"
                                   password:@"password1"                                                     
                                   persistence:NSURLCredentialPersistenceForSession];
    [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}
}
4

1 に答える 1

3

NSURLRequest内部使用とテストのために、無効な証明書が受け入れられるように、クラス拡張を使用してプライベート API をオーバーライドできます。

#if DEBUG

@interface NSURLRequest (IgnoreSSL)

+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host;

@end

@implementation NSURLRequest (IgnoreSSL)

+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
    // ignore certificate errors only for this domain
    if ([host hasSuffix:@"oiam.XXXX.com"]) {
        return YES;
    }
    else {
        return NO;
    }
}

@end

#endif 

資格情報のセキュリティに関する質問については、ネットワーク経由で送信される前に必要に応じてエンコードされます。

于 2013-10-10T20:16:58.853 に答える