.NET Mutual SSL рукопожатие «Аутентификация клиента»

3

Я работал над этой проблемой последние пару дней и никуда не денусь.

Сценарий таков:

Приложение iOS в поле будет называть мой REST Service (.NET). Моя служба REST будет вызывать веб-службу Apache с помощью рукопожатия Mutual SSL. Какие бы данные я не получил, я должен передать их на iOS-устройства в полевых условиях.

Единственная проблема - это вторая часть взаимодействия между My REST Service и Apache Web service.

Сертификаты клиента были подписаны с использованием ключей аутентификации клиента, цифрового сертификата, шифрования ключей. Корневые подписчики моего сертификата были размещены на сервере Apache. Если мы попытаемся использовать веб-браузер, мы сможем выполнить рукопожатие без каких-либо проблем.

Пример кода, который я использую для аутентификации с использованием SslStream. Используя этот метод, я получаю сообщение об ошибке

The message received was unexpected or badly formatted

и ребята, которые управляют веб-сервером Apache, говорят, что они могут видеть поступающий запрос, но, по их словам, они не получают сертификат с этим.

var certificate = @"certificate.cer";
var hostAddress = "hostAddress";
var certificates = new X509Certificate2Collection(new X509Certificate2(certificate));
RunClient(hostAddress, 1316, certificates);

static void RunClient(string hostName, int port, X509Certificate2Collection certificates)
{
    TcpClient client = new TcpClient(hostName, port);
    SslStream sslStream = new SslStream(client.GetStream(), false, ValidateServerCertificate);
    try
    {
        sslStream.AuthenticateAsClient(hostName, certificates, SslProtocols.Ssl3, true);
        Write("authenticated.");
    }
    catch (AuthenticationException ex)
    {
        Write("Inner: " + ex.InnerException.Message);                
    }
    catch (Exception ex)
    {
        Write(ex.Message);
    }
}

Пример кода, который я использую для аутентификации с использованием HttpWebRequest. Использование этого метода дает мне следующую проблему

The request was aborted: Could not create SSL/TLS secure channel.

var certificate = @"certificate.cer";
var hostAddress = "hostAddress";
var certificates = new X509Certificate2Collection(new X509Certificate2(certificate));
public static T Post(string url, string body, X509Certificate2 cert)
{
    var webRequest = FBJsonRequestService.CreateRequest(url, cert, WebRequestMethods.Http.Post, body);
    using (var webResponse = webRequest.GetResponse())
    {
        return CreateResponse(webResponse);
    }
}
var webRequest = (HttpWebRequest) WebRequest.Create(url);
webRequest.ClientCertificates.Add(cert);
//webRequest.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested;
webRequest.Credentials = CredentialCache.DefaultNetworkCredentials;
webRequest.Method = method;
webRequest.ContentType = "application/json; charset=utf-8";
if (body != null)
{
    using (var streamWriter = new StreamWriter(webRequest.GetRequestStream()))
    {
        streamWriter.Write(body);
    }
}
return webRequest;

Я надеюсь это имеет смысл. Все, что я хочу знать, это то, что я делаю правильно или я делаю это неправильно.

Теги:
authentication
ssl

3 ответа

3
Лучший ответ

Я думаю, что содержимое файла certificate.cer неверно. Расширение.cer, на мой взгляд, содержит только сертификат, но не закрытый ключ.

Вы должны использовать cert.p12 или certificate.pfx, который также содержит закрытый ключ. Эти расширения представляют собой стандарт PKCS # 12. В эти файлы также может быть целая цепочка сертификатов.

Вы можете загрузить файл p12 с помощью другого конструктора класса X509Certificate2. Посмотрите на эту документацию.

0

Другая причина исключения "Запрос был прерван: не удалось создать безопасный канал SSL/TLS" - это то, что сервер может не поддерживать тип протокола безопасности.

Другой тип протокола - TLS, который более безопасен, чем SSL3. Следующий код может помочь вам

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
0

Спасибо Pepo,

Я понял, что использовал неправильный файл. Мне пришлось использовать файл PFX вместо CER. Мой вопрос оказался совсем другим. Это было ограничение безопасности самого сертификата. Прежде чем публиковать это, я даже не был уверен, что я поступаю правильно.

Я создал следующий блог для кого-то, кто в будущем нуждается в какой-либо помощи в этом отношении.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню