Доступ к смарт-карте сертификатов клиентов с помощью веб-приложения - PullRequest
0 голосов
/ 09 января 2019

Мне нужно получить сертификат, и я хотел бы получить клиент, и нет сервера, я мог бы сделать эту форму:

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

}

Но когда я публикую на сервере, это не работает. Есть ли способ, которым я могу это сделать?

Не могу получить сертификат клиента, он возвращает ошибку, потому что на сервере нет зарегистрированных сертификатов.

EDIT

Мне уже сказали, что это возможно, я просто не знаю, как это сделать, способы, которые я пробовал, не работают.

EDIT

По этой ссылке я согласился, но не работает, не всегда находит. Что я могу сделать, чтобы исправить эту проблему?

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

1 Ответ

0 голосов
/ 09 января 2019

Насколько я знаю, вы не можете связаться с клиентом хранилища сертификатов. Чтобы сделать это, вы должны написать собственный плагин для каждой платформы браузера и предоставить клиенту соответствующие права доступа. Это очень болезненная задача. Я желаю вам удачи с этим. В моем случае мы закончили разработку 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();

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...