【发布时间】:2017-05-28 22:12:18
【问题描述】:
我有一个独立的 CA,我需要使用 C# 按证书序列号搜索来获取完整的证书 base64 字符串。
已经尝试使用 X509Store,尝试使用 CA 名称、主机名\ca-name 以及所有 StoreName 和 StoreLocation 可能的变体
store = new X509Store("my-ca");
store.Open(OpenFlags.ReadOnly);
ret += "Count: " + store.Certificates.Count;
foreach (X509Certificate2 cert in store.Certificates)
{
ret += "cert.SerialNumber: " + cert.SerialNumber;
}
也试过CCertView/CCertRequest,这个方法是返回信息,但不是完整的证书,当我从CA手动导出时字符串不相等。
public string GetCertificateBase64Original(string certificateSerialNumber)
{
string certificateBase64 = string.Empty;
try
{
CCertView certView = new CCertViewClass();
certView.OpenConnection(this.nameCA);
certView.SetResultColumnCount(2);
int requestIDColumnIndex = certView.GetColumnIndex(0, "RequestID");
int certificateSerialNumberColumnIndex = certView.GetColumnIndex(0, "SerialNumber");
certView.SetResultColumn(requestIDColumnIndex);
certView.SetResultColumn(certificateSerialNumberColumnIndex);
object objSerialNumber = certificateSerialNumber;
certView.SetRestriction(certificateSerialNumberColumnIndex, CVR_SEEK_EQ, CVR_SORT_NONE, ref objSerialNumber);
IEnumCERTVIEWROW rowsEnum;
rowsEnum = certView.OpenView();
IEnumCERTVIEWCOLUMN objCol;
rowsEnum.Reset();
int requestID = 0;
while (rowsEnum.Next() != -1)
{
objCol = rowsEnum.EnumCertViewColumn();
while (objCol.Next() != -1)
{
if (objCol.GetName() == "RequestID")
{
try
{
requestID = SafeConvert.ToInt(objCol.GetValue(PROPTYPE_STRING));
}
catch
{
}
}
}
}
if (requestID > 0)
{
CCertRequest certRequest = new CCertRequest();
certRequest.GetIssuedCertificate(this.nameCA, requestID, certificateSerialNumber);
certificateBase64 = SafeConvert.ToString(certRequest.GetFullResponseProperty(FR_PROP_FULLRESPONSE, 0, PROPTYPE_BINARY, CR_OUT_BASE64));
}
}
catch
{
}
return (certificateBase64);
}
根本没有成功。
【问题讨论】:
-
相对于 CA,您的代码在哪里运行?
-
添加了代码示例。 @CamiloTerevinto
-
@bartonjs 此代码在我的 ca 的同一台机器上的 web 服务上运行。
标签: c# certificate x509certificate