Могу ли я самостоятельно разместить службу HTTPS в WCF без хранилища сертификатов и без использования netsh http add sslcert? - PullRequest
4 голосов
/ 23 декабря 2011

Я пытаюсь разместить службу, которая обслуживает основной веб-контент (HTML, javascript, json), используя WebHttpBinding с минимальным участием администратора.

Пока я добился успеха, единственные необходимые привилегии администратора - во время установки (зарегистрируйте резервирование http для учетной записи службы и для создания самой службы). Однако сейчас у меня проблемы с SSL. В идеале я хотел бы поддержать сертификат за пределами хранилища сертификатов Windows. Я нашел эту статью - http://www.codeproject.com/KB/WCF/wcfcertificates.aspx - которая, кажется, указывает, что вы можете указать сертификат на хосте службы, однако во время выполнения при переходе браузера к https://localhost/Dev/MyService получается 404.

[ServiceContract]
public interface IWhoAmIService
{
    [OperationContract]
    [WebInvoke(
        Method = "GET",
        UriTemplate = "/")]
    Stream WhoAmI();
}

public class WhoAmIService : IWhoAmIService
{
    public Stream WhoAmI()
    {
        string html = "<html><head><title>Hello, world!</title></head><body><p>Hello from {0}</p></body></html>";
        html = string.Format(html, WindowsIdentity.GetCurrent().Name);

        WebOperationContext.Current.OutgoingResponse.ContentType = "text/html";

        return new MemoryStream(Encoding.UTF8.GetBytes(html));
    }
}

static void Main(string[] args)
{
    ServiceHost host = new ServiceHost(typeof(WhoAmIService), new Uri("https://localhost:443/Dev/WhoAmI"));
    host.Credentials.ServiceCertificate.Certificate = new X509Certificate2(@"D:\dev\Server.pfx", "private");

    WebHttpBehavior behvior = new WebHttpBehavior();
    behvior.DefaultBodyStyle = WebMessageBodyStyle.Bare;
    behvior.DefaultOutgoingResponseFormat = WebMessageFormat.Json;
    behvior.AutomaticFormatSelectionEnabled = false;

    WebHttpBinding secureBinding = new WebHttpBinding();
    secureBinding.Security.Mode = WebHttpSecurityMode.Transport;
    secureBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;

    ServiceEndpoint secureEndpoint = host.AddServiceEndpoint(typeof(IWhoAmIService), secureBinding, "");
    secureEndpoint.Behaviors.Add(behvior);

    host.Open();
    Console.WriteLine("Press enter to exit...");
    Console.ReadLine();
    host.Close();
}

Если я поменяю безопасность привязки на none и базовый URI, чтобы начать с http, все будет хорошо. Похоже, в этом посте указывается, что для регистрации сертификата с портом с помощью netsh необходимо выполнить дополнительную команду (http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/6907d765-7d4c-48e8-9e29-3ac5b4b9c405/).. Когда я пытаюсь это сделать, происходит сбой с некоторой непонятной ошибкой (1312).

C:\Windows\system32>netsh http add sslcert ipport=0.0.0.0:443 certhash=0b740a29f
29f2cc795bf4f8730b83f303f26a6d5 appid={00112233-4455-6677-8899-AABBCCDDEEFF}

SSL Certificate add failed, Error: 1312
A specified logon session does not exist. It may already have been terminated.

Как разместить эту службу с использованием HTTPS без хранилища сертификатов Windows?

1 Ответ

7 голосов
/ 23 декабря 2011

Это невозможно. HTTPS предоставляется на уровне ОС (драйвер ядра http.sys) - это то же самое, что предоставление HTTP-резервирования и сертификат уровня требований ОС в хранилище сертификатов. Вы должны использовать netsh, чтобы назначить сертификат выбранному порту и разрешить доступ к закрытому ключу.

В статье используются сертификаты из файлов, поскольку она не использует HTTPS. Он использует безопасность сообщений, а безопасность сообщений невозможна (если вы не разработали свой собственный, не совместимый с) сервисы REST и webHttpBinding.

Единственный способ заставить эту работу работать с HTTPS - это не использовать встроенную обработку HTTP, зависящую от http.sys = либо вам придется реализовать весь HTTP самостоятельно и подготовить новый канал HTTP для WCF, либо вам нужно будет найти такую ​​реализацию .

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