在Swift中,我通过在一些原始的X509证书数据上调用SecTrustCopyPublicKey
创建了一个SecKeyRef
对象。这就是这个SecKeyRef
对象的外观。
Optional(<SecKeyRef algorithm id: 1,
key type: RSAPublicKey,
version: 3, block size: 2048 bits,
exponent: {hex: 10001, decimal: 65537},
modulus: <omitted a bunch of hex data>,
addr: 0xsomeaddresshere>)
基本上,这个SecKeyRef
对象包含了关于公钥的大量信息,但似乎没有办法将这个SecKeyRef
转换为字符串、NSData
或其他任何东西(我的目标只是获得一个base64公钥)。
然而,我有一个函数,可以传入一个modulus
和一个exponent
,它会计算出公钥。我已经通过传入从上述SecKeyRef
记录下来的数据进行了测试。
但是我不知道如何从SecKeyRef
对象中访问这些属性(例如我只能在控制台中看到整个对象;我不能执行SecKeyRef.modulus
或类似的操作,似乎没有任何方法可以实现)。
我的问题:如何访问SecKeyRef.modulus
,或者将这个SecKeyRef
转换为NSData
或类似的东西?谢谢
编辑
(更多信息)
我是通过以下函数动态创建我的SecKeyRef
:
func bytesToPublicKey(certData: NSData) -> SecKeyRef? {
guard let certRef = SecCertificateCreateWithData(nil, certData) else { return nil }
var secTrust: SecTrustRef?
let secTrustStatus = SecTrustCreateWithCertificates(certRef, nil, &secTrust)
if secTrustStatus != errSecSuccess { return nil }
var resultType: SecTrustResultType = UInt32(0) // result will be ignored.
let evaluateStatus = SecTrustEvaluate(secTrust!, &resultType)
if evaluateStatus != errSecSuccess { return nil }
let publicKeyRef = SecTrustCopyPublicKey(secTrust!)
return publicKeyRef
}
这个操作将证书的原始字节流(可以从硬件使用PKI广播)转换为SecKeyRef
。
编辑2
(截至2015年1月7日现有答案的评论)
这个方法不起作用:
let mirror = Mirror(reflecting: mySecKeyObject)
for case let (label?, value) in mirror.children {
print (label, value)
}
这导致控制台输出以下内容:
Some <Raw SecKeyRef object>
不确定字符串 "Some" 的含义。
此外,mirror.descendant("exponent")
(或 "modulus")的结果为 nil
,即使在控制台中打印原始对象时,我可以清楚地看到这些属性存在,并且实际上它们是已填充的。
另外,如果可能的话,我想避免保存到钥匙串,以NSData
读取,然后从钥匙串中删除。如悬赏说明所述,如果这是唯一可能的方法,请引用权威参考资料。感谢迄今为止提供的所有答案。
Obj-C
,但翻译起来并不困难。 - Caleb