我需要获取证书,并希望获取客户端,并且没有服务器,所以我可以这样做:
public static X509Certificate2 EscolherCertificado(string serial)
{
var store = new X509Store("MY", StoreLocation.CurrentUser);
var Key = new RSACryptoServiceProvider();
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
X509Certificate2Collection collection = store.Certificates;
X509Certificate2Collection fcollection = collection.Find(X509FindType.FindBySerialNumber, serial, false);
if (fcollection.Count == 1)
{
return fcollection[0];
}
else { cod = "00000"; msgm = "not found"; return null; }
}
但是当我在服务器上发布时,它不起作用。有什么办法可以做到吗?
我无法获得客户端证书,它返回错误,因为在服务器上没有注册的证书。
编辑
我已经被告知有可能,我只是不知道该怎么做,我尝试的方法不起作用。
编辑
遵循此link,我确实遵守了规定,但是它不起作用,也并不总是可以找到。我该怎么做才能解决这个问题?
public static X509Certificate2 EscolherCertificado(string serial)
{
X509Store userCaStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
try
{
userCaStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certificatesInStore = userCaStore.Certificates;
X509Certificate2Collection findResult = certificatesInStore.Find(X509FindType.FindBySerialNumber, serial, true);
X509Certificate2 clientCertificate = null;
if (findResult.Count == 1)
{
clientCertificate = findResult[0];
}
else
{
throw new Exception("Unable to locate the correct client certificate.");
}
cod = "0000"; msgm = clientCertificate.ToString(); return clientCertificate;
}
catch
{
throw;
}
finally
{
userCaStore.Close();
}
答案 0 :(得分:0)
据我所知,您无法访问客户端证书存储。 为此,您必须为每个浏览器平台编写一个专有插件,并为客户端提供正确的访问权限。 这是一个非常痛苦的任务。 祝你好运。 以我为例,我们最终开发了可以完全访问客户端硬件和平台功能的EXE。
代码如下:
private void ElegirCert()
{
System.Security.Cryptography.X509Certificates.X509Store store = new System.Security.Cryptography.X509Certificates.X509Store("MY", System.Security.Cryptography.X509Certificates.StoreLocation.CurrentUser);
store.Open(System.Security.Cryptography.X509Certificates.OpenFlags.ReadOnly);
System.Security.Cryptography.X509Certificates.X509Certificate2Collection collection = (System.Security.Cryptography.X509Certificates.X509Certificate2Collection)store.Certificates;
System.Security.Cryptography.X509Certificates.X509Certificate2Collection fcollection = (System.Security.Cryptography.X509Certificates.X509Certificate2Collection)collection;//.Find(System.Security.Cryptography.X509Certificates.X509FindType.FindByTimeValid, DateTime.Now, false);
try
{
Cert = System.Security.Cryptography.X509Certificates.X509Certificate2UI.SelectFromCollection(fcollection, "Elegir", "Seleccione el certificado que desea utilizar", System.Security.Cryptography.X509Certificates.X509SelectionFlag.SingleSelection)[0];
}
catch (Exception e)
{
}
store.Close();
}
答案 1 :(得分:0)
我仍然认为仅使用浏览器功能不可能获得客户端证书列表。 有一种方法,它涉及创建与执行“艰苦工作”的可执行本机文件通信的扩展。这意味着获取证书的完整列表并将其公开给用户。 我认为在那之后,用户选择一个,然后EXE要求提供证书存储密码(如果有一个),然后EXE对数字进行数字签名并进行哈希签名……