当前位置: 首页 > 知识库问答 >
问题:

Swift和Alamofire SSL钉扎和处理挑战

喻选
2023-03-14

当我试图从我的内部web服务器获取json时,我需要处理这个挑战。我从前面的一个问题中得出了这个结论。这是我的密码

let defaultManager: Alamofire.SessionManager = {
            let serverTrustPolicies: [String: ServerTrustPolicy] = [
                "myhttpsinternaldomain.org": .disableEvaluation
            ]

            let configuration = URLSessionConfiguration.default
            configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders

            return Alamofire.SessionManager(
                configuration: configuration,
                serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
            )
        }()

        let url = URL(string: urlString)
        let username = "user"
        let password = "password"
        let header = ["user": username, "password": password]

        defaultManager.request(url!, method: .get, headers: header).responseJSON { response in
            switch response.result {
            case .success(let value):
                let json = JSON(value)
                print("JSON: \(json)")
            case .failure(let error):
                print(error)
            }
        }

这是我收到的错误

Error Domain=NSURLErrorDomain Code=-999"已取消"UserInfo={NSErrorFailingURLKey=https://myhttpsinternaldomain.org, NSLocalizeddescription ption=已取消, NSErrorFailingURLStringKey=https://myhttpsinternaldomain.org}

我找到了这个,但我的项目中没有令牌。我只想使用用户名和密码,或者忽略挑战

请任何帮助

共有2个答案

汪凌
2023-03-14

您不能像在邮递员中那样在标题中发送用户名和密码。你必须把它们改成bas64。这就是邮递员在后台将您的凭据添加到标题时所做的。

// Your hostname and endpoint
let hostname = "myhttpsinternaldomain.org"
let cert = "YOUR_CERT" // e.g. for cert.der, this should just be "cert"

// Set up certificates
let pathToCert = Bundle.main.path(forResource: cert, ofType: "der")
let localCertificate = NSData(contentsOfFile: pathToCert!)
let certificates = [SecCertificateCreateWithData(nil, 
localCertificate!)!]

// Configure the trust policy manager
let serverTrustPolicy = ServerTrustPolicy.pinCertificates(
certificates: certificates,
validateCertificateChain: true,
validateHost: true
)    
let serverTrustPolicies = [hostname: serverTrustPolicy]
let serverTrustPolicyManager = ServerTrustPolicyManager(policies: 
serverTrustPolicies)

// Configure session manager with trust policy
let defaultManager = Alamofire.SessionManager(
  configuration: URLSessionConfiguration.default,
  serverTrustPolicyManager: serverTrustPolicyManager
)

let url = URL(string: urlString)

let user = "user"

let password = "password"

let base64 = "\(user):\(password)".toBase64()



   let header = [

        "Authorization": "Basic \(base64)"
   ]

   //Added encoding type in the request. Change and try other types too. Like JSONEncoding.default
    defaultManager.request(url!, method: .get, encoding: URLEncoding.default ,headers: header).responseJSON { response in
        switch response.result {
        case .success(let value):
            let json = JSON(value)
            print("JSON: \(json)")
        case .failure(let error):
            print(error)
        }
    }

extension String {

   func toBase64() -> String {
       return Data(self.utf8).base64EncodedString()
   }
}
经炜
2023-03-14

知道了!或者更确切地说,我找到了正确的一页,让我找到了答案。Github页面服务器信任策略管理器,并使用Alamofire连接到自签名服务器

最初,在SSL拒绝我的身份验证之后,我会得到一个310错误。

然后我添加了我最初发布的manager类,并收到一个-999错误,表示该类已被“取消”。感谢上面的Github页面,原因是我需要

"请确保保留对新SessionManager实例的引用,否则当解除分配SessionManager时,您的请求将全部被取消。"

因此,由于第二个stackoverflow页面,我创建了一个NetworkManager类,并在alamofire请求中调用了它。

下面是工作的代码,希望这将节省某人很多时间。

// Network Manager outside view controller

        class NetworkManager {
        static let sharedInstance = NetworkManager()

        let manager: Alamofire.SessionManager = {
            let serverTrustPolicies: [String: ServerTrustPolicy] = [
                "https://mydomainthatwasdrivingmebananas.com": .pinCertificates(
                    certificates: ServerTrustPolicy.certificates(),
                    validateCertificateChain: true,
                    validateHost: true),
                "mydomainthatwasdrivingmebananas.com": .disableEvaluation
            ]

            let configuration = URLSessionConfiguration.default
            configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders

            return Alamofire.SessionManager(
                configuration: configuration,
                serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
            )
        }()
    }

然后阿拉莫菲尔呼叫

// Inside ViewController ViewDidLoad

NetworkManager.sharedInstance.manager.request("https://mydomainthatwasdrivingmebananas.com", method: .get).responseJSON{ response in
                switch response.result {
                                case .success(let value):
                                    let json = JSON(value)
                                    print("JSON: \(json)")
                                case .failure(let error):
                                    print(error)
                                }

        }

P. S JSON()方法是快速的JSON,以防有人混淆

 类似资料:
  • OWASP网站只包含Objective-C和NSURLConnection的示例。

  • 问题内容: 我正在尝试使用swift和firebase在iOS项目中创建用户按钮时添加错误处理: 这是按钮的代码: 我不确定switch语句中错误的语法是否正确! 因为当我在模拟器中对其进行测试时,它始终会给我提供默认情况,这是未知错误!+我在文档中找不到语法:https : //firebase.google.com/docs/auth/ios/errors 因此,使用新的firebase和sw

  • 我试图更准确地理解斯威夫特的“关闭”。 但是和太难理解了 我搜索了许多Swift帖子和官方文件,但我觉得这仍然不够。 这是官方文件的代码示例 听说使用< code>@escaping有两种方式和原因 第一个用于存储闭包,第二个用于异步操作目的。 以下是我的问题: 首先,如果执行,则将使用闭包参数执行,并且该闭包将保存在全局变量数组中。 我认为闭包是{self.x=100} {self.x=100}

  • 关键技术和挑战 从技术角度讲,区块链涉及到的领域比较杂,包括分布式、存储、密码学、心理学、经济学、博弈论、网络协议等,下面列出了目前认为有待解决或改进的关键技术点。 密码学技术 怎么防止交易记录被篡改? 怎么证明交易方的身份? 怎么保护交易双方的隐私? 密码学正是要提供解决这些问题的有效手段。传统方案包括 hash 算法,加解密算法,数字证书和签名(盲签名、环签名)等。区块链技术的应用将可能刺激密

  • 我正在浏览应用程序包 对于这两个应用程序,方法都是:公钥锁定 对于Android系统,我没有问题为两个不同的域名创建两个公钥,我必须握手。 这是我的问题,, 对于IOS react native,我可以包括两个。用于公钥固定的cer? 根据他们的IOS文档: (如果您正在使用证书锁定,请跳过此操作)无需额外的公钥锁定步骤,AFNetwork将从证书中提取公钥。 因此,公钥不需要额外的步骤,对于IO

  • 我有一个jsp页面和一个servlet,在jsp页面中我有两个表单,每一个都是选择输入类型,即选择class和选择student。当我从select下拉菜单中选择class时,通过onchange事件,它将转到abcServlet,从servlet中检索该类,并将其转发到jsp页面,转到jsp页面中的下一个表单,select student,它再次提交到同一个servlet,从他们的servlet