Использование файла сертификата для подключения к веб-сервису через SSL - PullRequest
3 голосов
/ 06 января 2012

Я занимаюсь разработкой службы Windows на C #, которая вызывает методы веб-службы.Я должен использовать SSL для подключения к веб-сервису.Я получил от издателя p12 файл с сертификатом.Файл защищен паролем.Чтобы использовать метод импорта, чтобы использовать этот сертификат.Все работает нормально, но мне не нравится этот метод - у меня есть пароль в моем приложении.Когда издатель меняет сертификат, я должен переписать код (сменив пароль на новый).Можно ли как-то не кодировать пароль в файл .p12 или использовать другой параметр (файл .cer)?

Ответы [ 2 ]

5 голосов
/ 06 января 2012

То, что вы могли бы сделать, выглядит примерно так:

  1. Установите сертификат SSL в хранилище сертификатов на локальном компьютере (с помощью консоли управления Microsoft «MMC»)
  2. Извлечение отпечатка сертификата (например, "748681ca3646ccc7c4facb7360a0e3baa0894cb5")
  3. Используйте функцию, которая выбирает вам сертификат из локального хранилища сертификатов для данного отпечатка.
  4. Предоставьте сертификат SSL при вызове веб-службы.
private static X509Certificate2 GetCertificateByThumbprint(string certificateThumbPrint, StoreLocation certificateStoreLocation) {
    X509Certificate2 certificate = null;

    X509Store certificateStore = new X509Store(certificateStoreLocation);
    certificateStore.Open(OpenFlags.ReadOnly);


    X509Certificate2Collection certCollection = certificateStore.Certificates;
    foreach (X509Certificate2 cert in certCollection)
    {
        if (cert.Thumbprint != null && cert.Thumbprint.Equals(certificateThumbPrint, StringComparison.OrdinalIgnoreCase))
        {
            certificate = cert;
            break;
        }
    }

    if (certificate == null)
    {
        Log.ErrorFormat(CultureInfo.InvariantCulture, "Certificate with thumbprint {0} not found", certificateThumbPrint);
    }

    return certificate;
}

public string GetServiceResponse() {
    string WebSvcEndpointConfigurationName = "WebServiceEndpoint";
    Uri webSvcEndpointAddress = new Uri("http://www.example.com/YourWebService.svc");
    string webSvcCertificateThumbPrint = "748681ca3646ccc7c4facb7360a0e3baa0894cb5";

    string webSvcResponse = null;
    SomeWebServiceClient webServiceClient = null;

    try
    {
        webServiceClient = new SomeWebServiceClient(WebSvcEndpointConfigurationName, new EndpointAddress(webSvcEndpointAddress));
        webServiceClient.ClientCredentials.ClientCertificate.Certificate = GetCertificateByThumbprint(webSvcCertificateThumbPrint, StoreLocation.LocalMachine);

        webSvcResponse = webServiceClient.GetServiceResponse();
    }
    catch (Exception ex)
    {
    }
    finally
    {
        if (webServiceClient != null)
        {
            webServiceClient.Close();
        }
    }
    return webSvcResponse;
} 
1 голос
/ 06 января 2012

Файл PKCS # 12 предоставляется вам, поскольку это естественный способ передачи сертификатов вместе с закрытыми ключами.Вы можете использовать один из следующих способов:

  • преобразовать его в формат, который вам нравится, и сохранить его так, как вам нравится
  • преобразовать его в пароль без пароля PFX
  • импортировать его на компьютерхранение сертификата и использование его таким образом

Но все эти методы (вместе с сохранением жестко запрограммированного пароля) не обеспечивают реальной защиты закрытого ключа и, следовательно, не могут использоваться, если вы распространяете приложение за пределами вашегоорганизация.

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