簡體   English   中英

在 iOS 中使用 AFNetworking 進行 SSL 固定不起作用

[英]SSL Pinning using AFNetworking in iOS not working

我正在使用 AFnetworking。 我的應用程序網絡服務器在 TLS 1.2 中。 我想將證書固定添加到我的 iOS 應用程序。 我的代碼如下:

       AFHTTPSessionManager *manager=[[AFHTTPSessionManager manager] initWithBaseURL:serviceURL];

    NSSet *certificates = [AFSecurityPolicy certificatesInBundle:[NSBundle mainBundle]];
    AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:certificates];
    policy.validatesDomainName = YES;
    policy.allowInvalidCertificates = YES;
    opManager.securityPolicy = policy;

我的捆綁包中有有效的服務器證書,並且使用此代碼,Web 服務工作正常。 但是,當我嘗試使用不正確的示例證書進行相同操作時,網絡服務也在工作。 我什至嘗試在捆綁中沒有證書,那個時候網絡服務也工作正常。 誰能解釋一下? AppTransportSecurity 在我的應用程序中打開。

    <key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
</dict>

我找到了解決這個問題的方法。 請在下面找到我用來替換現有代碼的代碼。 它按預期工作。

        AFHTTPSessionManager *opManager=[[AFHTTPSessionManager manager] initWithBaseURL:baseUrl];
    opManager.requestSerializer = [AFHTTPRequestSerializer serializer];
    opManager.responseSerializer = [AFHTTPResponseSerializer serializer];

    // SSL Pinning
    NSString *certificatePath = [[NSBundle mainBundle] pathForResource:@"xxxxxxxx.com" ofType:@"der"];
    NSData *certificateData = [NSData dataWithContentsOfFile:certificatePath];

    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
    [securityPolicy setAllowInvalidCertificates:YES];
    [securityPolicy setPinnedCertificates:@[certificateData]];
    [opManager setSecurityPolicy:securityPolicy];

以下函數將為您執行公鑰證書固定:

- (AFHTTPSessionManager*) getSessionManager: (NSString *) serverUrl {
    AFHTTPSessionManager * sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString: serverUrl]];
    if ([serverUrl hasPrefix:@"https"]) {
        NSString *certificate = nil;
        NSString *cerPath = [[NSBundle mainBundle] pathForResource: certificate ofType:@"der"];
        if (cerPath != nil) {
            NSData *certData = [NSData dataWithContentsOfFile: cerPath];
            AFSecurityPolicy* policy = [AFSecurityPolicy policyWithPinningMode: AFSSLPinningModePublicKey];
            policy.pinnedCertificates = [NSSet setWithArray: @[certData]];
            [policy setValidatesDomainName: YES];
            [policy setAllowInvalidCertificates: NO];
            sessionManager.securityPolicy = policy;
        }
    }
    return sessionManager;
}

並調用這個函數使用:

AFHTTPSessionManager * sessionManager = [self getSessionManager: @"https://example.com"];

獲得證書正確的數據和格式非常重要。 您需要將以下 der 證書添加到您的項目中:

openssl s_client -connect example.com:443 </dev/null |openssl x509 -outform DER -out example.der

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM