Swift中无需第三方库获取SecCertificateRef证书信息与可读组织名称
刚好之前做过类似的需求,完全用纯Swift就能搞定,不需要第三方库、Objective-C代码,也不用碰OpenSSL的X509相关组件。下面分两部分详细说:
一、获取SecCertificateRef的基础证书信息
苹果的Security框架提供了原生API来读取证书信息,核心是SecCertificateCopyValues函数,它能把证书的各个字段转换成可读的字典结构。
举个简单的示例,假设你已经通过某种方式(比如从Data加载、从钥匙串获取)拿到了SecCertificateRef:
import Security func extractBasicCertificateInfo(certificate: SecCertificate) -> [String: Any]? { // 定义要提取的证书字段OID,这里列了几个常见的,你可以按需添加 let requestedFields = [ kSecOIDX509V1SerialNumber as String, kSecOIDX509V1ValidityNotBefore as String, kSecOIDX509V1ValidityNotAfter as String, kSecOIDX509V1SubjectName as String, kSecOIDX509V1IssuerName as String ] var error: Unmanaged<CFError>? guard let certificateValues = SecCertificateCopyValues(certificate, requestedFields as CFArray, &error) as? [String: Any] else { print("Failed to copy certificate values: \(error?.takeRetainedValue() ?? "Unknown error")") return nil } return certificateValues }
调用这个函数后,你会得到一个嵌套字典,里面包含了序列号、有效期起止时间、主题、颁发者等信息,大部分字段已经是可读格式,比如有效期会直接转成Date类型。
二、提取证书的组织名称(人类可读格式)
要获取组织名称,关键是从证书的**主题(Subject)**字段里解析出对应kSecOIDOrganization(组织OID)的值。主题字段是一个嵌套数组,我们可以通过遍历或者直接定位OID的方式提取:
func getCertificateOrganizationName(certificate: SecCertificate) -> String? { let subjectOID = kSecOIDX509V1SubjectName as String var error: Unmanaged<CFError>? guard let certificateValues = SecCertificateCopyValues(certificate, [subjectOID] as CFArray, &error) as? [String: Any], let subjectInfo = certificateValues[subjectOID] as? [String: Any], let subjectItems = subjectInfo[kSecPropertyKeyValue as String] as? [[String: Any]] else { print("Failed to parse subject info: \(error?.takeRetainedValue() ?? "Unknown error")") return nil } // 遍历主题项,找到组织名称对应的条目 for item in subjectItems { guard let oid = item[kSecPropertyKeyOID as String] as? String, oid == kSecOIDOrganization as String, let value = item[kSecPropertyKeyValue as String] as? String else { continue } return value } return nil }
这个函数会直接返回证书的组织名称字符串,如果证书里没有设置组织字段,就返回nil。整个过程完全用Swift实现,没有依赖任何第三方库,也不需要Objective-C桥接或者OpenSSL的X509相关方法。
内容的提问来源于stack exchange,提问作者Shamil
相关产品推荐
相关产品推荐

