代码之家  ›  专栏  ›  技术社区  ›  Abu Ul Hassan

无法将“seccertificate”类型的值转换为预期的参数类型“unsafemutablepointer<unsaferawpointer”?>!

  •  0
  • Abu Ul Hassan  · 技术社区  · 6 年前

    我尝试执行HTTPS请求,但当我尝试匹配本地和远程SSL证书时,xcode显示了上述错误。我附上了一个错误的图像,也代码如下,任何帮助都将感谢提前。

    enter image description here

    以下是的完整委托方法 URLSessionDelegate .

      func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
        if challenge.protectionSpace.authenticationMethod == (NSURLAuthenticationMethodServerTrust) {
    
    
            let serverTrust:SecTrust = challenge.protectionSpace.serverTrust!
            let certificate: SecCertificate = SecTrustGetCertificateAtIndex(serverTrust, 0)!
            let remoteCertificateData = CFBridgingRetain(SecCertificateCopyData(certificate))!
            let cerPath: String = Bundle.main.path(forResource: "xxxxx", ofType: "der")!
            let localCertificateData = NSData(contentsOfFile:cerPath)!
            print(localCertificateData.length)
            let result  = remoteCertificateData.isEqual(localCertificateData as Data)
            let certDataRef = localCertificateData as! CFData
            var cert: SecCertificate = SecCertificateCreateWithData(nil, certDataRef)!
            let certArrayRef = CFArrayCreate(nil, cert, 1, nil)
            SecTrustSetAnchorCertificates(serverTrust, certArrayRef)
    
            SecTrustSetAnchorCertificatesOnly(serverTrust, false)
            print(result)
            var trustResult: SecTrustResultType = SecTrustResultType.invalid
            SecTrustEvaluate(serverTrust, &trustResult)
            if (trustResult == SecTrustResultType.unspecified ||
                trustResult == SecTrustResultType.proceed)
            {
                let credential:URLCredential = URLCredential(trust: serverTrust)
                challenge.sender?.use(credential, for: challenge)
                completionHandler(URLSession.AuthChallengeDisposition.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
    
            } else {
    
                completionHandler(URLSession.AuthChallengeDisposition.cancelAuthenticationChallenge, nil)
            }
        }
        else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodClientCertificate
        {
            let path: String = Bundle.main.path(forResource: "client", ofType: "p12")!
            let PKCS12Data = NSData(contentsOfFile:path)!
            let identityAndTrust:IdentityAndTrust = self.extractIdentity(certData: PKCS12Data);
            let urlCredential:URLCredential = URLCredential(
                identity: identityAndTrust.identityRef,
                certificates: identityAndTrust.certArray as? [AnyObject],
                persistence: URLCredential.Persistence.forSession);
            completionHandler(URLSession.AuthChallengeDisposition.useCredential, urlCredential);
        }
        else
        {
            completionHandler(URLSession.AuthChallengeDisposition.cancelAuthenticationChallenge, nil);
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   OOPer    6 年前

    导致错误的行,用于创建 CFArray .

    创建一个 碳纤维阵列 ,是用桥接雨燕 Array 碳纤维阵列 .

    尝试更改行:

    let certArrayRef = CFArrayCreate(nil, cert, 1, nil)
    

    到:

    let certArrayRef = [cert] as CFArray