ios,alamofire 5 : need an equivalent of curl --key foo. key --cert foo,pem --location --request GET 'https://bar.baz/foo"

标签 ios alamofire public-key-encryption encryption-asymmetric

除了用于 pin 证书的公钥之外,我还有私钥。

如何向服务器进行身份验证?

$ file *
foo.der:         data
foo.private.der: data

使用 openssl 导出

foo.key: PEM RSA private key
foo.pem: PEM certificate

我需要的是一个与此等效的 alamofire:

curl --key foo.key --cert foo.pem --location --request GET 'https://somhostofmine/v1/welcome/'

$curl --key ./client_key.pem --cert ./client.pem --location --request GET 'https://someurl' “你好,世界!”

作品

$curl --cert ./client.pem --location --request GET 'https://someurl/v1/welcome/' curl: (58) 无法设置私钥文件: './client.pem' 类型 PEM

没有

因此,在没有私钥的情况下使用证书本身的建议不起作用。

我们是在这里处理证书固定还是考虑到私钥的存在,这是这里的其他内容???

最佳答案

您可以创建一个ServerTrustManager,将每个主机名作为参数传递给您的评估器。 对于公钥固定,请使用 PublicKeysTrustEvaluator,如下所示:

let evaluators: [String : ServerTrustEvaluating] = [
    "your.host.com": PublicKeysTrustEvaluator(performDefaultValidation: false, validateHost: false)
]
let serverTrustManager = ServerTrustManager(evaluators: evaluators)

对于证书固定,请使用 PinnedCertificatesTrustEvaluator,如下所示:

let evaluators: [String : ServerTrustEvaluating] = [
    "your.host.com": PinnedCertificatesTrustEvaluator(
        acceptSelfSignedCertificates: true,
        performDefaultValidation: false,
        validateHost: false
    )
]
let serverTrustManager = ServerTrustManager(evaluators: evaluators)

这两种方法都要求您的证书以 .cer.der 文件形式包含在 bundle 中。

创建 ServerTrustManager 后,将其传递给 Session 实例并将其用于您的请求:

let session = Session(serverTrustManager: serverTrustManager)

如果您希望在验证服务器方面有更复杂的逻辑,或者必须在域中使用通配符,则必须子类化 ServerTrustManager 并覆盖 serverTrustEvaluator(forHost:)功能:

class MyServerTrustManager: ServerTrustManager {
    init() {
        super.init(evaluators: [:])
    }
    
    override func serverTrustEvaluator(forHost host: String) throws -> ServerTrustEvaluating? {
        guard host.hasSuffix(".host.com") else {
            return try super.serverTrustEvaluator(forHost: host)
        }
        return PublicKeysTrustEvaluator(performDefaultValidation: false, validateHost: false)
    }
}

关于ios,alamofire 5 : need an equivalent of curl --key foo. key --cert foo,pem --location --request GET 'https://bar.baz/foo",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63846061/

相关文章:

ios - UIButton字体不流畅

ios - 搜索栏 subview 不工作,并且没有为搜索栏调用 UITextField 委托(delegate)方法

swift - 通过 Alamofire 集成 salesforce api?

ios - 如何使用 JSON 格式的参数在 byteArray 中发送图像 iOS swift4

java - 将公钥交换为序列化对象

SSL 客户端证书认证

ios - APNS 中的自定义负载未交付

ios - 更改 ios 的 facebook 登录按钮的背景颜色

ios - 我可以将 Alamofire 更新到版本 4 并在我的应用程序中仍然支持 iOS 8 吗?

使用私钥的Javascript RSA解密