如何在 Swift 中固定 certificate.pem 和 private_key.pem 文件以签署 http 请求

Posted

技术标签:

【中文标题】如何在 Swift 中固定 certificate.pem 和 private_key.pem 文件以签署 http 请求【英文标题】:How to pin certificate.pem and private_key.pem files to sign http request in Swift 【发布时间】:2018-04-17 08:06:09 【问题描述】:

我有这两个文件(certificate.pemprivate_key.pem),它们由我使用的 API 提供。我需要使用这些文件在 Swift 项目中签署我的 http 请求。

我可以用 Postman 做到这一点。我在 Postman 的 Add Client Certificate 选项卡中添加了 certificate.pem 作为 CRT 文件和 private_key.pem 作为 KEY 文件。当我在 Postman 上发送带有标头和参数的 PUT 请求时,我会从 Web 服务器收到成功消息。

但是当我在 Xcode 中使用 Swift3 和 Alamofire 尝试所有这些事情时,我总是收到错误消息。您能帮我如何将这个 PEM 文件固定到 http 请求吗?

【问题讨论】:

您是否正在尝试使用证书进行 SSL pining? 是的,我想是的 :) 这是为 Teller 还是 Plaid API 准备的? 是的@FernandoB,它是针对 Teller API 的……很高兴看到有人在 2 年后遇到类似问题 :) 【参考方案1】:

Alamofire 不直接支持 PEM 文件。您需要先将它们转换为 DER 文件,这在 here 中进行了解释。然后,您需要将新的 DER 文件添加到您的应用目标。最后,按照 README 的 Security 部分中的说明启用服务器信任策略。

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
    )
)

ServerTrustPolicy.certificates() 调用可以在 here 中找到,它从捆绑包中加载 CERDER 文件中的所有数据并将它们用于固定。

希望这可以帮助您继续前进。 ?

【讨论】:

实际上,我已经尝试过这样做。但据我了解,由于使用了两个证书(我的意思是证书和 private_key),我遇到了麻烦。 @cnoon 我也收到此错误。 CredStore - copyIdentPrefs - 复制身份凭据时出错。错误=-25300,查询= class= idnt; labl = "api.teller.io:443"; “r_Ref” = 1;

以上是关于如何在 Swift 中固定 certificate.pem 和 private_key.pem 文件以签署 http 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中固定背景图像的大小和位置?

如何更改 Shiny Dashboard 中固定控制栏的颜色

如何在 Mac 催化剂中固定窗口的位置?

如何在文件中固定数量的字符后插入换行符

如何在ipad和iphone中固定背景图像不滚动位置固定[重复]

如何在 DraggableScrollableSheet 小部件中固定前两个最顶部的小部件?