Ошибка рукопожатия TLS от ... tls: клиент не предоставил сертификат - PullRequest
0 голосов
/ 17 октября 2018

У меня есть клиент C # RestFull, пытающийся подключиться к серверу Go.Как только я достигаю этапа рукопожатия TLS, он терпит неудачу, потому что клиент не предоставил сертификат .

Я подтвердил, что сертификат клиента был связан с объектом RestClient до выполнения запроса.

// Initializing the client
RestClient client = new RestClient(Config.SERVER_DOMAIN);

// Adding client certificate (exported from a smart card with no private key attributes)
client.ClientCertificates = Global.cpf.getCertCollection();

// defining our request then executing it
var request = new RestRequest("users", Method.GET);
var response = await client.ExecuteTaskAsync(request);

Работает только в том случае, если сертификат был прочитан из файла .PFX, где находится частный компонент.Но когда я переключаюсь на сертификат смарт-карты (который не имеет атрибутов закрытого ключа, потому что смарт-карта не хочет, чтобы они у вас были), сервер не получает сертификат от клиента.

Я понимаю, что TLSнужен личный ключ для этапа рукопожатия, однако клиентский объект не видит никакого связанного личного ключа с данным сертификатом и поэтому не распознает сертификат как действительный для установления TLS.

Я знаю, что закрытые ключи не могут быть экспортированы со смарт-карты, и я знаю, что должен быть способ сообщить объекту RestClient, что для того, чтобы пройти этап рукопожатия, вы должны связаться со смарт-картойОднако я сдался!

Может ли кто-нибудь указать мне правильное направление?

1 Ответ

0 голосов
/ 19 октября 2018

Для большинства смарт-карт должен быть доступен мини-драйвер или автономный CSP (поставщик услуг криптографии).Эти компоненты действуют как драйверы, которые интегрируют карту с криптографической подсистемой Windows.Обычно они предоставляются поставщиком устройства, и вы сможете получить сертификат со ссылкой на правильный закрытый ключ в хранилище сертификатов Windows после правильной настройки.

Попробуйте использовать следующий метод:

private static X509Certificate2 GetCertificate()
{
    X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
    store.Open(OpenFlags.ReadOnly);

    try
    {
        // Note: X509Certificate2UI requires reference to System.Security
        X509Certificate2Collection certs = X509Certificate2UI.SelectFromCollection(store.Certificates, null, null, X509SelectionFlag.SingleSelection);
        if (certs != null && certs.Count > 0)
            return certs[0];
    }
    finally
    {
        store.Close();
    }

    return null;
}
...