MacOS中SecKeyRawSign不可用,如何使用该函数签名CSR?
在macOS上替代SecKeyRawSign实现CSR签名的方案
我刚好处理过类似的跨平台签名场景,iOS上的SecKeyRawSign在macOS里已经被更现代的SecKeyCreateSignature API替代了,下面是具体的实现思路和代码示例,能帮你快速迁移:
核心差异说明
SecKeyRawSign是iOS早期的底层签名API,macOS现在推荐使用基于SecKey框架的SecKeyCreateSignature,它不仅支持更多安全算法,还和现代Apple安全生态的设计更统一,用法也更简洁。
具体实现步骤
1. 替换签名函数
把iOS里调用SecKeyRawSign的逻辑换成下面的代码,这里以RSA + SHA256签名为例(和你之前iOS代码的算法保持一致即可):
import Security /// 对CSR的待签名数据进行签名 /// - Parameters: /// - tbsCSRData: CSR的TBS(To Be Signed)部分数据 /// - privateKey: 用于签名的私钥 /// - Returns: 签名后的二进制数据 /// - Throws: 签名过程中出现的错误 func signCSRTBSData(_ tbsCSRData: Data, with privateKey: SecKey) throws -> Data { // 指定签名算法,对应iOS上的SHA256withRSA let signatureAlgorithm = SecKeyAlgorithm.rsasignatureMessagePKCS1v15SHA256 // 先校验私钥是否支持该算法 guard SecKeyIsAlgorithmSupported(privateKey, .sign, signatureAlgorithm) else { throw NSError(domain: "CSRSignError", code: -1, userInfo: [NSLocalizedDescriptionKey: "私钥不支持指定的签名算法"]) } // 执行签名操作 var signError: Unmanaged<CFError>? guard let signatureData = SecKeyCreateSignature(privateKey, signatureAlgorithm, tbsCSRData as CFData, &signError) as Data? else { throw signError!.takeRetainedValue() as Error } return signatureData }
2. 复用原有CSR生成逻辑
你之前在iOS上用的CSR生成代码(比如构建ASN.1结构、提取TBS部分)大部分可以直接复用,只需要把签名步骤替换成上面的函数即可。
3. 私钥获取(可选)
如果需要从钥匙串获取私钥,macOS上的逻辑和iOS几乎一致,示例如下:
/// 从钥匙串获取指定标签的私钥 /// - Parameter tag: 私钥的应用标签 /// - Returns: 获取到的私钥 /// - Throws: 钥匙串访问错误 func getPrivateKeyFromKeychain(tag: String) throws -> SecKey { let query: [CFString: Any] = [ kSecClass: kSecClassKey, kSecAttrKeyClass: kSecAttrKeyClassPrivate, kSecAttrApplicationTag: tag.data(using: .utf8)!, kSecReturnRef: kCFBooleanTrue! ] var keyItem: CFTypeRef? let status = SecItemCopyMatching(query as CFDictionary, &keyItem) guard status == errSecSuccess, let privateKey = keyItem as? SecKey else { throw NSError(domain: "KeychainError", code: Int(status), userInfo: [NSLocalizedDescriptionKey: "从钥匙串获取私钥失败"]) } return privateKey }
注意事项
- 算法一致性:确保使用的签名算法和你iOS代码中的完全匹配,比如如果之前用的是SHA1(不推荐,已不安全),对应macOS的
SecKeyAlgorithm.rsasignatureMessagePKCS1v15SHA1;如果是ECDSA算法,也有对应的枚举值。 - 沙盒权限:如果你的macOS应用启用了沙盒,需要在
Info.plist中添加钥匙串访问权限,否则会无法读取私钥。 - TBS数据正确性:签名的必须是CSR的TBS部分,不要直接对整个CSR数据签名,这部分逻辑和iOS上保持一致即可。
内容的提问来源于stack exchange,提问作者zealer
相关产品推荐
相关产品推荐

