在我的情况下,使用便捷方法 ServerTrustPolicy.certificatesInBundle() 似乎无法正常工作
// MARK: - Bundle Location
/**
Returns all certificates within the given bundle with a `.cer` file extension.
- parameter bundle: The bundle to search for all `.cer` files.
- returns: All certificates within the given bundle.
*/
public static func certificatesInBundle(bundle: NSBundle = NSBundle.mainBundle()) -> [SecCertificate] {
var certificates: [SecCertificate] = []
let paths = Set([".cer", ".CER", ".crt", ".CRT", ".der", ".DER"].map { fileExtension in
bundle.pathsForResourcesOfType(fileExtension, inDirectory: nil)
}.flatten())
for path in paths {
if let
certificateData = NSData(contentsOfFile: path), // <-- we get the data of the certificate in bundle
certificate = SecCertificateCreateWithData(nil, certificateData) // <-- The problem is here, the certificate is not set neither errors.
{
certificates.append(certificate) // <-- this doesn't run
}
}
return certificates
}
可能与自签名证书的格式有关。我完全使用了这篇博文中的#tip 5。 Five Tips for Using Self Signed SSL Certificates with iOS
问题是 SecCertificateCreateWithData 方法的限制是什么,可以接受哪些证书格式?更好的是,我可以在哪里阅读有关此特定问题的更多信息。
我的代码似乎是正确的,没什么特别的,可能是最常用的片段之一
let defaultManager:Alamofire.Manager = {
let serverTrustPolicies: [String: ServerTrustPolicy] = [
"localhost": .PinCertificates(
certificates: ServerTrustPolicy.certificatesInBundle(),
validateCertificateChain: true,
validateHost: true
)
]
let configuration = NSURLSessionConfiguration.ephemeralSessionConfiguration()
configuration.HTTPAdditionalHeaders = Alamofire.Manager.defaultHTTPHeaders
return Alamofire.Manager(
configuration: configuration,
serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
)
}()
Best Answer-推荐答案 strong>
SecCertificateCreateWithData 返回 nil 的最可能原因是该文件是 PEM 而不是 DER 格式。
根据 documentation , 数据应包含
A DER (Distinguished Encoding Rules) representation of an X.509
certificate
如果您的数据以“-----BEGIN...”开头,则格式错误。 PEM 可以使用 OpenSSL 转换为 DER(反之亦然) - 这是一个方便的引用 https://www.sslshopper.com/article-most-common-openssl-commands.html .
此外,如果是自签名证书(由“localhost”判断),validateCertificateChain 属性应为 false。否则请求将失败并返回“cancelled” NSError。
此外,从 iOS9 开始,应将 App Transport Security 设置设置为允许任意加载(在 Info.plist 中)。这是唯一允许您的应用评估自签名证书的设置。没有它,Alamofire 信任策略机制将无法发挥作用。
关于ios - certificateInBundle 不附加自签名证书,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/34630539/
|