无法查询SecKeyChain的身份

时间:2014-11-29 03:33:13

标签: ios ssl xamarin.ios xamarin certificate

我正在向SecKeyChain添加身份,然后我尝试使用SecKeyChain.QueryAsConcreteType将其恢复。但是对于任何SecRecord查询,我都会获得SecStatusCode.Param。看起来问题是,当我使用新的SecRecord(SecKind.Identity)时,它不会将kSecClass放入可以添加但是查询失败的字典。

public SecRecord(SecKind secKind) { 
   IntPtr num = SecClass.FromSecKind(secKind); 
   if (num == SecClass.Identity) this._queryDict = new NSMutableDictionary(); 
   else this.queryDict = NSMutableDictionary.LowlevelFromObjectAndKey(num, SecClass.SecClassKey); 
}

如果我错了,请解释我如何向SecKeyChain添加身份然后检索它。 谢谢!

1 个答案:

答案 0 :(得分:0)

注意:从bug report复制粘贴,从这里谷歌会更容易

与其他类不同,API对SecIdentity不对称。此外,在这种情况下,返回值(SecStatusCode)不值得信任。

当前的最佳(不使用太多IntPtr或反射)方式来检索SecIdentity,请执行以下操作:

using (SecRecord rec = new SecRecord (SecKind.Identity)) {
    // the next line is the workaround
    (rec.ToDictionary () as NSMutableDictionary) ["class"] = new NSString ("idnt");

    SecStatusCode code;
    var match = SecKeyChain.QueryAsConcreteType (rec, out code);
    Assert.That (code, Is.EqualTo (SecStatusCode.Success), "QueryAsRecord-2");
    Assert.NotNull (match, "match-2");
}

这将在执行查询之前回退class并返回标识。

XI的未来版本将确保更简单的

using (SecRecord rec = new SecRecord (SecKind.Identity)) {
    ...
}

可用于向密钥链添加和查询SecIdentity。