除了用于 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/