func loadCertificate(from filepath: String) -> SecCertificate? {
do {
let pemString = try String(contentsOfFile: filepath)
let pattern = "-----BEGIN CERTIFICATE-----([\\s\\S]*)-----END CERTIFICATE-----"
let regex = try NSRegularExpression(pattern: pattern)
let nsRange = NSRange(pemString.startIndex..<pemString.endIndex, in: pemString)
let matches = regex.matches(in: pemString, options: [], range: nsRange)
guard let match = matches.first, match.numberOfRanges > 1 else {
return nil
}
var base64String = (pemString as NSString).substring(with: match.range(at: 1))
base64String = base64String.replacingOccurrences(of: "\r\n", with: "")
base64String = base64String.replacingOccurrences(of: "\n", with: "")
guard let base64Data = Data(base64Encoded: base64String) else {
return nil
}
guard let certificate = SecCertificateCreateWithData(nil, base64Data as CFData) else {
return nil
}
return certificate
} catch {
return nil
}
}
func certificateTrust() -> Bool {
guard let path = Bundle.main.path(forResource: "xxx", ofType: "pem") else {
return false
}
guard let certOrigin = loadCertificate(from: path) else {
return false
}
guard let issuerData = SecCertificateCopyNormalizedIssuerSequence(certOrigin) else {
return false
}
let query: [String: Any] = [
kSecClass as String: kSecClassCertificate,
kSecAttrIssuer as String: issuerData,
kSecReturnRef as String: kCFBooleanTrue!,
kSecMatchLimit as String: kSecMatchLimitAll
]
var result: CFTypeRef?
var status = SecItemCopyMatching(query as CFDictionary, &result)
guard status == errSecSuccess, let item = result
else
{
return false
}
if let certary = result as? [SecCertificate] {
}
let typeId = CFGetTypeID(item)
guard typeId == SecCertificateGetTypeID() else {
return false
}
let certificate = item as! SecCertificate
var trustResult: SecTrustResultType = .invalid
var trust: SecTrust?
let policy = SecPolicyCreateBasicX509()
status = SecTrustCreateWithCertificates(certificate,policy, &trust)
if status == errSecSuccess, let trustObject = trust
{
status = SecTrustEvaluate(trustObject, &trustResult)
}
else
{
return false
}
if status == errSecSuccess, trustResult == .proceed {
return true
}
return false
}