gpt4 book ai didi

swift - 在alamofire管理器类swift中添加公钥固定

转载 作者:行者123 更新时间:2023-12-01 11:33:51 26 4
gpt4 key购买 nike

这是我的alamofire管理员,如何在上面添加公钥固定?请帮助我,我在代码中不知道该怎么做,如果可能的话,我需要逐步说明如何使用具有所有请求的AFManager

class AFManager : NSObject{


///without headers (post)
//used this to registration
class func requestPOSTURL(_ strURL : String, params : [String :
AnyObject]?, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void){
URLCache.shared.removeAllCachedResponses()
Alamofire.request(strURL, method: .post, parameters: params, encoding: URLEncoding.httpBody).responseJSON { (responseObject) -> Void in

//print(responseObject)

if responseObject.result.isSuccess {
let resJson = JSON(responseObject.result.value!)
success(resJson)
}
if responseObject.result.isFailure {
let error : Error = responseObject.result.error!
failure(error)
}
}
}


///// response string (post)
//used this in login // used in change password
class func strRequestPOSTURL(_ strURL : String, params : [String : String]?, headers : [String : String]?, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void){
URLCache.shared.removeAllCachedResponses()
Alamofire.request(strURL, method: .post, parameters: params, encoding: URLEncoding.httpBody, headers: headers).responseJSON { (response) in
//print(response)

if response.result.isSuccess {
let resJson = JSON(response.result.value!)
success(resJson)
}
if response.result.isFailure {
let error : Error = response.result.error!

failure(error)
}

}

}

}

我看到了此示例,但不知道如何执行以及将代码放在哪里,请参见下面的链接:
https://infinum.co/the-capsized-eight/ssl-pinning-revisited

最佳答案

安全

与服务器和Web服务进行通信时使用安全的HTTPS连接是保护敏感数据的重要一步。默认情况下,Alamofire将使用安全框架提供的Apple内置验证来评估服务器提供的证书链。虽然这可以确保证书链有效,但不能防止中间人(MITM)攻击或其他潜在漏洞。为了减轻MITM攻击,处理敏感客户数据或财务信息的应用程序应使用ServerTrustPolicy提供的证书或公钥固定。

ServerTrustPolicy

通过安全的HTTPS连接连接到服务器时,ServerTrustPolicy枚举评估通常由URLAuthenticationChallenge提供的服务器信任。

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

服务器信任评估有许多不同的情况,使您可以完全控制验证过程:
  • performDefaultEvaluation:使用默认的服务器信任评估
    同时允许您控制是否验证提供的主机
    通过挑战。
  • pinCertificates:使用固定的证书来验证服务器
    相信。如果固定其中之一,则认为服务器信任有效
    证书与服务器证书之一匹配。
  • pinPublicKeys:使用固定的公钥来验证服务器
    相信。如果固定其中之一,则认为服务器信任有效
    公共(public)密钥与服务器证书公共(public)密钥之一匹配。
  • disableEvaluation:禁用所有评估,然后将始终
    认为任何服务器信任都是有效的。
  • customEvaluation:使用关联的闭包来评估
    服务器信任的有效性,从而使您可以完全控制
    验证过程。请谨慎使用。

  • 服务器信任策略管理器

    ServerTrustPolicyManager负责存储服务器信任策略到特定主机的内部映射。这使Alamofire可以根据不同的服务器信任策略评估每个主机。
    let serverTrustPolicies: [String: ServerTrustPolicy] = [
    "test.example.com": .pinCertificates(
    certificates: ServerTrustPolicy.certificates(),
    validateCertificateChain: true,
    validateHost: true
    ),
    "insecure.expired-apis.com": .disableEvaluation
    ]

    let sessionManager = SessionManager(
    serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
    )

    确保保留对新SessionManager实例的引用,否则当您释放sessionManager时,您的请求将全部被取消。
    这些服务器信任策略将导致以下行为:

    test.example.com将始终使用具有证书链和主机验证功能的证书固定,因此需要满足以下条件才能使TLS握手成功:
    证书链必须有效。
    证书链必须包括固定证书之一。
    质询主机必须与证书链的叶证书中的主机匹配。
    insecure.expired-apis.com将永远不会评估证书链,并且将始终允许TLS握手成功。
    所有其他主机将使用Apple提供的默认评估。
    子类化服务器信任策略管理器

    如果您发现自己需要更灵活的服务器信任策略匹配行为(即通配域),则子类化ServerTrustPolicyManager并使用您自己的自定义实现覆盖serverTrustPolicyForHost方法。
    class CustomServerTrustPolicyManager: ServerTrustPolicyManager {
    override func serverTrustPolicy(forHost host: String) -> ServerTrustPolicy? {
    var policy: ServerTrustPolicy?

    // Implement your custom domain matching behavior...

    return policy
    }
    }

    验证主机

    .performDefaultEvaluation,.pinCertificates和.pinPublicKeys服务器信任策略均采用validateHost参数。将该值设置为true将导致服务器信任评估来验证证书中的主机名是否与质询的主机名匹配。如果它们不匹配,则评估将失败。 validateHost值为false仍将评估完整的证书链,但不会验证叶证书的主机名。

    建议在生产环境中始终将validateHost设置为true。
    验证证书链

    固定证书和公用密钥都可以选择使用validateCertificateChain参数来验证证书链。通过将此值设置为true,除了对固定的证书或公钥执行字节相等性检查之外,还将评估完整的证书链。值为false将跳过证书链验证,但仍将执行字节相等性检查。

    在某些情况下,禁用证书链验证可能很有意义。禁用验证的最常见用例是自签名证书和过期证书。在这两种情况下,评估总是会失败,但是字节相等性检查仍将确保您从服务器收到了期望的证书。

    建议在生产环境中将validateCertificateChain始终设置为true。
    应用程序传输安全

    通过在iOS 9中添加应用程序传输安全性(ATS),可能无法将自定义ServerTrustPolicyManager与多个ServerTrustPolicy对象一起使用。如果持续看到CFNetwork SSLHandshake失败(-9806)错误,则可能是您遇到了此问题。除非您在应用程序的plist中配置ATS设置以禁用足够多的ATS设置以允许您的应用程序评估服务器信任度,否则Apple的ATS系统将覆盖整个挑战系统。

    如果遇到此问题(使用自签名证书的可能性很高),则可以通过将以下内容添加到Info.plist中来解决此问题。
    <dict>
    <key>NSAppTransportSecurity</key>
    <dict>
    <key>NSExceptionDomains</key>
    <dict>
    <key>example.com</key>
    <dict>
    <key>NSExceptionAllowsInsecureHTTPLoads</key>
    <true/>
    <key>NSExceptionRequiresForwardSecrecy</key>
    <false/>
    <key>NSIncludesSubdomains</key>
    <true/>
    <!-- Optional: Specify minimum TLS version -->
    <key>NSTemporaryExceptionMinimumTLSVersion</key>
    <string>TLSv1.2</string>
    </dict>
    </dict>
    </dict>
    </dict>

    是否需要将NSExceptionRequiresForwardSecrecy设置为NO取决于您的TLS连接是否使用允许的密码套件。在某些情况下,需要将其设置为“否”。为了允许SessionDelegate接收质询回调,必须将NSExceptionAllowsInsecureHTTPLoads设置为YES。一旦质询回调被调用,ServerTrustPolicyManager将接管服务器信任评估。如果尝试连接到仅支持TLS版本小于1.2的主机,则可能还需要指定NSTemporaryExceptionMinimumTLSVersion。

    建议在生产环境中始终使用有效的证书。
    通过本地网络使用自签名证书

    如果您尝试连接到本地主机上运行的服务器,并且正在使用自签名证书,则需要将以下内容添加到Info.plist中。
    <dict>
    <key>NSAppTransportSecurity</key>
    <dict>
    <key>NSAllowsLocalNetworking</key>
    <true/>
    </dict>
    </dict>

    根据Apple文档,将NSAllowsLocalNetworking设置为YES可以加载本地资源,而无需为应用程序的其余部分禁用ATS。

    引用:-
    https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md

    有关实现的详细信息,请参阅测试。
    https://github.com/Alamofire/Alamofire/blob/master/Tests/TLSEvaluationTests.swift#L290-L450

    关于swift - 在alamofire管理器类swift中添加公钥固定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55023487/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com