草庐IT

ios - Alamofire ServerTrustPolicy 证书固定不阻止 Charles 代理 Swift 3

coder 2023-09-05 原文

我进行了广泛的搜索,但未能找到我的问题的答案。为了使我们的应用程序更安全,我们被告知使用“证书固定”。我们已经为所有 API 调用使用了 Alamofire 库,因此使用包含的 ServerTrustPolicyManager 作为实现证书固定的方法似乎很自然。我在我的应用程序包中包含了正确的证书,这里是我用来为 Alamofire 配置我的 SessionManager 的代码:

let url = "https://www.mycompany.com"

var manager: SessionManager? {

    let serverTrustPolicy = ServerTrustPolicy.pinCertificates(
        certificates: ServerTrustPolicy.certificates(),
        validateCertificateChain: true,
        validateHost: true
    )

    let serverTrustPolicies: [String: ServerTrustPolicy] = [
        url: serverTrustPolicy
    ]
    let config = URLSessionConfiguration.default

    return SessionManager(configuration: config, serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies))

}

现在当我想发出 API 请求时,我有这个方法:

func request(routerRequest request: URLRequestConvertible) -> DataRequest {
    assert(url != "", "A base URL string must be set in order to make request")
    print("URL: \(url) : \(request)")
    return (manager ?? SessionManager.default).request(request)
}

现在我遇到的问题是,当我使用诸如 Charles 代理之类的东西时,它仍然有效……所有请求仍在进行中。证书固定不应该因为证书不匹配而阻止像 Charles 代理这样的东西工作吗?

我已经测试了其他正确使用证书固定的应用程序,它们会阻止任何类型的代理(Charles 或其他)建立连接。如果我在启用 Charles 的情况下尝试运行像 Uber 或我的 Wells Fargo 银行应用程序这样的应用程序,每个请求都会被拒绝,我会看到一条错误消息,如“无法完成请求,ssl 证书无效”(那是不是逐字的)。

我觉得在配置我的 SessionManager 后我缺少了一个步骤。我读过和帮助过的大多数文档似乎都暗示,在将管理器配置为启用证书固定后,它应该拒绝任何证书无效的请求。谁能帮我?我错过了什么?

我感谢所有的帮助。提前致谢!

最佳答案

我要回答我自己的问题,只是因为我想在未来帮助其他人解决同样的问题。当我配置上面的 serverTrustPolicies 时,您创建了一个 String : ServerTrustPolicy 的字典,我的错误在于服务器名称的 String

let serverTrustPolicies: [String: ServerTrustPolicy] = [
    url: serverTrustPolicy
]

我的 url 属性是我们用于 API 的 baseURL,即 https://www.mycompany.com/api - 这导致了我所有的问题。一旦我将其调整为域 www.mycompany.com,固定就如预期的那样工作了!现在,当我在启用固定的情况下运行 Charles Proxy 时,我的所有请求都被拒绝了,并且 Charles 发出了一条错误消息“没有发出请求,可能是 SSL 证书被拒绝了。”

我不必进行任何严肃的字符串操作,而是添加此扩展以供将来使用 - 如果您有多个需要从中提取域的 baseURL:

extension String {
    public func getDomain() -> String? {
        guard let url = URL(string: self) else { return nil }
        return url.host
    }
}

现在你可以这样做:

let serverTrustPolicies: [String: ServerTrustPolicy] = [
    url.getDomain() ?? url : serverTrustPolicy
]

希望这对以后的其他人有帮助!祝你好运

关于ios - Alamofire ServerTrustPolicy 证书固定不阻止 Charles 代理 Swift 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44296271/

有关ios - Alamofire ServerTrustPolicy 证书固定不阻止 Charles 代理 Swift 3的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  3. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  4. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  5. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  6. ruby - 在 Ruby 中将整数格式化为固定长度的字符串 - 2

    有没有一种简单的方法可以将给定的整数格式化为具有固定长度和前导零的字符串?#convertnumberstostringsoffixedlength3[1,12,123,1234].map{|e|???}=>["001","012","123","234"]我找到了解决方案,但也许还有更聪明的方法。format('%03d',e)[-3..-1] 最佳答案 如何使用%1000而不是进行字符串操作来获取最后三位数字?[1,12,123,1234].map{|e|format('%03d',e%1000)}更新:根据theTinMan的

  7. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  8. ruby - HTTP 请求中的用户代理,Ruby - 2

    我是Ruby的新手。我试过查看在线文档,但没有找到任何有效的方法。我想在以下HTTP请求botget_response()和get()中包含一个用户代理。有人可以指出我正确的方向吗?#PreliminarycheckthatProggitisupcheck=Net::HTTP.get_response(URI.parse(proggit_url))ifcheck.code!="200"puts"ErrorcontactingProggit"returnend#Attempttogetthejsonresponse=Net::HTTP.get(URI.parse(proggit_url)

  9. ruby-on-rails - capybara poltergeist - 覆盖用户代理 - 2

    有人知道如何将capybarapoltergeist的用户代理覆盖到移动用户代理以进行测试吗?我发现了一些有关为seleniumwebdriver配置它的信息:http://blog.plataformatec.com.br/2011/03/configuring-user-agents-with-capybara-selenium-webdriver/这在capybara闹鬼中怎么可能? 最佳答案 请参阅poltergeistgithub页面上的链接:https://github.com/teampoltergeist/polte

  10. ruby - 如何配置 Ruby Mechanize 代理以通过 Charles Web 代理工作? - 2

    我正在使用Ruby/Mechanize编写一个“自动填写表格”应用程序。它几乎可以工作。我可以使用精彩CharlesWeb代理以查看服务器和我的Firefox浏览器之间的交换。现在我想使用Charles查看服务器和我的应用程序之间的交换。Charles在端口8888上代理。假设服务器位于https://my.host.com。.一件不起作用的事情是:@agent||=Mechanize.newdo|agent|agent.set_proxy("my.host.com",8888)end这会导致Net::HTTP::Persistent::Error:...lib/net/http/pe

随机推荐