使用Web应用程序访问客户端证书智能卡

时间:2019-01-09 11:46:45

标签: asp.net asp.net-mvc web

我需要获取证书,并希望获取客户端,并且没有服务器,所以我可以这样做:

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();
        }

2 个答案:

答案 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对数字进行数字签名并进行哈希签名……