C# Клиентский сертификат RestSharp получает исключение «Не удалось установить соединение SSL» - PullRequest
0 голосов
/ 05 января 2020

Я программирую на C#. Net Core 3.1 и. Net Стандартная библиотека, в которую помещен этот код.

Я не получаю свои http-запросы с RestSharp с сертификатом клиента, который НЕ является установлен на сервере / компьютере. У меня не будет доступа к серверу / компьютеру, на котором он будет запущен позже ..

Мой код:

                // Create a RestSharp RestClient objhect with the base URL
                var client = new RestClient(_baseAPIUrl);

                // Create a request object with the path to the payment requests
                var request = new RestRequest("swish-cpcapi/api/v1/paymentrequests");

                // Create up a client certificate collection and import the certificate to it
                X509Certificate2Collection clientCertificates = new X509Certificate2Collection();
                clientCertificates.Import(_certDataBytes, _certificatePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);

                // Add client certificate collection to the RestClient
                client.ClientCertificates = clientCertificates;

                //X509Certificate2 certificates = new X509Certificate2(_certDataBytes, _certificatePassword);

                //client.ClientCertificates = new X509CertificateCollection() { certificates };

                // Add payment request data
                request.AddJsonBody(requestData);

                var response = client.Post(request);
                var content = response.Content;

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

Я протестировал набор TLS 1.1 или TLS 1.2 для тестирования, они указали TLS 1.1 на собственных примерах curl.

Кто-нибудь что-нибудь понял?

Обновление 2020-01-08 - я получил информацию от службы технической поддержки, что они видят, что я отправляю только один сертификат, но когда я пытаюсь отладить и проверить X509Certificate2Collection, я нашел 3 сертификата. Но они говорят, что видят только одного?

1 Ответ

1 голос
/ 05 января 2020

ИМХО, если служба, к которой вы пытаетесь обратиться, защищена с помощью SSL-сертификата с ожидаемым открытым / 1018 * ключом / секретным ключом, то без сертификата вы не сможете получить к нему доступ. Если это цель защищаемой службы, я думаю, что вы можете проверить только проверку работоспособности службы или на макс. Проверить, доступна ли служба (без сертификата клиента)

Но так же, как HTTPS затем вы можете попытаться загрузить сертификат из браузера, если у вас есть доступ к URL-адресу службы из вашего браузера, скажем, для доступа к их мета или простому GET или чему-то еще. В chrome перед URL-адресом может отображаться символ блокировки (значок безопасности). щелкните по нему, и вы, возможно, сможете загрузить сертификат Publi c. Вы можете установить это на свою машину и попробовать.

В случае, если эта служба имеет сертификат паба и доступ не требует сертификата клиента, то вышеуказанная опция может работать. и я надеюсь, что вы устанавливаете CERT и получаете доступ к нему через свой код из учетной записи, которая имеет доступ к сертификату. Допустим, вы устанавливаете сертификат в LocalSystem, тогда вам может потребоваться доступ администратора из кода / решения для доступа к этому пути сертификата. Или установите сертификат по пути current_user.

В качестве первого шага я бы проверил, могу ли я получить доступ к службе из браузера.

Это только из того, что я понял из вашего вопроса. Опять же, если вы можете объяснить, является ли служба защищенной службой на основе открытого / 1021 * ключа / личного ключа, вам необходимо иметь доступ / сертификат для использования этой службы.

ОБНОВЛЕНИЕ: Я попробовал несколько вариантов с моей стороны, создав демо-API и демо-клиент для использования клиентских сертификатов. Исходя из того, что я понял из вашего запроса, я предполагаю, что ниже могут быть некоторые из ваших вариантов, чтобы попробовать.

// --- using the cert path if you have the path (instead of the byte[])
var myCert = new X509Certificate2("<path to the client cert.cer/.pfx>", "secure-password", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
X509CertificateCollection clientCerts = new X509CertificateCollection();
clientCerts.Add(myCert);

ИЛИ

var certStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine); //replace with appropriate values based on your cert configuration
certStore.Open(OpenFlags.ReadOnly);

//option 1 (ideally a client must have the cert thumbprint instead of a password 
var cert = certStore.Certificates.Find(X509FindType.FindByThumbprint, "<cert Thumbprint>", false);

//option 2 (explore other options based on X509NameTypes
var cert = certStore.Certificates.OfType<X509Certificate2>()
                    .FirstOrDefault(cert => cert.GetNameInfo(X509NameType.DnsName, false) == "mycompany.dns.name.given in the cert");

client.ClientCertificates = new X509CertificateCollection(cert);
...