You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:36:57