我正在C#上实现Windows / Mac OS X的应用程序,该应用程序使用证书对文件进行数字签名。为此,我使用的是BouncyCastle和iText库。在Windows上完美运行,无需任何特殊代码。我可以使用此代码读取计算机上存储的证书。
X509Store store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
foreach (X509Certificate2 certificate in store.Certificates)
{
if (certificate.HasPrivateKey && certificate.NotAfter >= DateTime.Now)
{
// USE CERTIFICATE
}
}
我面临的问题是对存储在钥匙串中的证书的访问。因为我可以获取证书的信息,但不能获取其私钥。我想应该有一种访问该信息的方法(在用户确认允许访问之后),但是我看不到如何。 我当前用于获取证书信息的实现是:
var query = new SecRecord(SecKind.Certificate)
{
MatchValidOnDate = DatetimeToNSDate(DateTime.Now),
CanSign = true,
};
var certList = Security.SecKeyChain.QueryAsRecord(query, 100, out var result);
foreach(var cert in certLis)
{
SecCertificate tempCertificate = new SecCertificate(cert);
X509Certificate2 certificateObj = tempCertificate.ToX509Certificate2();
}
此certificateObj
是有效的X509证书,但其privateKey为空。