Laden...

SSL + WCF: HTTP.SYS nicht ordnungsgemäß konfiguriert?

Erstellt von punkdevil vor 11 Jahren Letzter Beitrag vor 11 Jahren 6.619 Views
P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 11 Jahren
SSL + WCF: HTTP.SYS nicht ordnungsgemäß konfiguriert?

Hallo,

ich habe einen simplen Webservice, welchen ich mit SSL verschlüsseln möchte (Client und Server befinden sich auf dem gleichen Rechner).
Dazu habe ich mit httpcfg ein Zertifikat für meine IP und den Port registriert.

Wenn ich den Webservice aufrufe bekomme ich folgende Exception: > Fehlermeldung:

System.ServiceModel.CommunicationException: An error occurred while making the HTTP request to
>
. This could be due to the fact that the server certificate is not configured properly with HTTP.SYS in the HTTPS case. This could also be caused by a mismatch of the security binding between the client and the server. ---> System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send. ---> System.IO.IOException: Authentication failed because the remote party has closed the transport stream.
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
at System.Net.TlsStream.CallProcessAuthentication(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.ConnectStream.WriteHeaders(Boolean async)
--- End of inner exception stack trace ---
at System.Net.HttpWebRequest.GetResponse()
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
--- End of inner exception stack trace ---

Server stack trace:
at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason)
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

HRESULT: -2146233087

Wenn ich mit httpcfg query ssl die HTTP.SYS Konfiguration abrufe bekome ich folgendes:
IP : 172.30.35.51:10443
Hash : a8908c aca5bb21cffe1e212b4c880a3c3dd60e6
Guid : {00000000-0000-0000-0000-000000000000}
CertStoreName : (null)
CertCheckMode : 0
RevocationFreshnessTime : 0
UrlRetrievalTimeout : 0
SslCtlIdentifier : (null)
SslCtlStoreName : (null)
Flags : 0

Ich habe zum Testen mal einen Server mit TcpListern aufgesetzt, da funktioniert die Verbindung.

Ich habe auch bereits den Netzwerktrace geloggt vom Client und Server und kann ihn auf wunsch hier posten.

Wie kann ich die Ursache des Problems ermitteln? Gibt es noch weitere Traces?

6.911 Beiträge seit 2009
vor 11 Jahren

Hallo punkdevil,

die Konfigurationen für WCF sind auf SSL angepasst? Poste die mal.

(Client und Server befinden sich auf dem gleichen Rechner)

Wenn es sich nur um Testzwecke handelt ok, sonst würde ich hier NamedPipes verwenden und mir über die Übertragungssicherheit keine Gedanken machen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 11 Jahren

Ja sind angepasst.
Hier die ServiceHost.exe.config:


<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v2.0.50727"/></startup>
  <system.serviceModel>
	<bindings>
      <basicHttpBinding>
        <binding name="BasicSecure">
          <security mode="Transport" />
        </binding>
      </basicHttpBinding>
    </bindings>
	<behaviors>
  <serviceBehaviors>
    <behavior name="SimpleServiceBehavior">
      <serviceMetadata httpsGetEnabled="True"/>
    </behavior>
  </serviceBehaviors>
</behaviors>	 
    <services>
      <service name="Webservice.ServiceInstance" behaviorConfiguration="SimpleServiceBehavior">
		 <host>       <baseAddresses>         <add baseAddress="https://172.30.35.51:10443/Webservice"/>       </baseAddresses>     </host>
        <endpoint 
            address="" 
            binding="basicHttpBinding"
            contract="Webservice.IServiceContract" 
			bindingConfiguration="BasicSecure"
        />
		 <endpoint address="mex"
              binding="mexHttpsBinding"
              contract="IMetadataExchange" />

      </service>
    </services>    
		<diagnostics wmiProviderEnabled="true">
            <messageLogging logEntireMessage="true" logMalformedMessages="true"
                logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true"
                maxMessagesToLog="100000" maxSizeOfMessageToLog="2621440" />
        </diagnostics>
  </system.serviceModel>
<system.diagnostics>
    <sources>
	 <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
                <listeners>
                    <add type="System.Diagnostics.DefaultTraceListener" name="Default">
                        <filter type="" />
                    </add>
                    <add name="ServiceModelMessageLoggingListener">
                        <filter type="" />
                    </add>
                </listeners>
            </source>
            <source name="System.ServiceModel" switchValue="Warning,ActivityTracing"
                propagateActivity="true">
                <listeners>
                    <add type="System.Diagnostics.DefaultTraceListener" name="Default">
                        <filter type="" />
                    </add>
                    <add name="ServiceModelTraceListener">
                        <filter type="" />
                    </add>
                </listeners>
            </source>
      <source name="System.Net" tracemode="includehex" maxdatasize="1024">
        <listeners>
          <add name="System.Net"/>
        </listeners>
      </source>
      <source name="System.Net.Sockets">
        <listeners>
          <add name="System.Net"/>
        </listeners>
      </source>
      <source name="System.Net.Cache">
        <listeners>
          <add name="System.Net"/>
        </listeners>
      </source>
    </sources>
    <switches>
      <add name="System.Net" value="Verbose"/>
      <add name="System.Net.Sockets" value="Verbose"/>
      <add name="System.Net.Cache" value="Verbose"/>
    </switches>
    <sharedListeners>
		 <add initializeData="c:\temp\echowebservice\messages.svclog"
                type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
                name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp">
                <filter type="" />
            </add>
            <add initializeData="c:\temp\echowebservice\tracelog.svclog"
                type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
                name="ServiceModelTraceListener" traceOutputOptions="Timestamp">
                <filter type="" />
            </add>
      <add name="System.Net"
        type="System.Diagnostics.TextWriterTraceListener"
        initializeData="c:\temp\echowebservice\network_server.log"
      />
    </sharedListeners>
    <trace autoflush="true"/>
  </system.diagnostics>
</configuration>

Hier die Client.exe.config:

<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v2.0.50727"/></startup>
  <system.serviceModel>
  <client>
    <endpoint address="https://geyalap:10443/Webservice"
      binding="basicHttpBinding" 
      contract="Webservice.IServiceContract"
bindingConfiguration="BasicSecure"
      name="SubsystemServer" 
/>	
  </client>
	<bindings>
      <basicHttpBinding>
        <binding name="BasicSecure">
          <security mode="Transport" />
        </binding>
      </basicHttpBinding>
    </bindings>
  </system.serviceModel>
  <system.diagnostics>
    <sources>
      <source name="System.Net" tracemode="includehex" maxdatasize="1024">
        <listeners>
          <add name="System.Net"/>
        </listeners>
      </source>
      <source name="System.Net.Sockets">
        <listeners>
          <add name="System.Net"/>
        </listeners>
      </source>
      <source name="System.Net.Cache">
        <listeners>
          <add name="System.Net"/>
        </listeners>
      </source>
    </sources>
    <switches>
      <add name="System.Net" value="Verbose"/>
      <add name="System.Net.Sockets" value="Verbose"/>
      <add name="System.Net.Cache" value="Verbose"/>
    </switches>
    <sharedListeners>
      <add name="System.Net"
        type="System.Diagnostics.TextWriterTraceListener"
        initializeData="c:\temp\echowebservice\network_client.log"
      />
    </sharedListeners>
    <trace autoflush="true"/>
  </system.diagnostics>
</configuration>

6.911 Beiträge seit 2009
vor 11 Jahren

Hallo punkdevil,

ich hatte nicht früher Zeit eine Antwort zu schreiben, daher erst jetzt.

Die Konfiguration schaut gut aus, daher vermute ich dass das Zertifikat keinem Port zugewiesen ist. Prüfe das mittels

netsh http show sslcert

Wenns nicht zugewiesen, so kannst du das mit netsh zuweisen:


netsh http add sslcert ipport=0.0.0.0:{port} certhash={fingerabdruck vom zertifikat ohne leerzeichen} appid={irgendeine GUID} 

wobei die { } nicht einzugeben sind.

(wie es mit httpcfg geht weiß ich nicht, aber netsh ist ab Vista dabei)

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 11 Jahren

Betriebssystem ist Windows XP, deshalb muss ich httpcfg verwenden.
Gibt es vielleicht irgendweclhe Sicherheitseinstellungen, die die Kommunikation verhindert? Obwohl, kann eigentlich nicht sein, da sie ja mit TcpListener funktioniert...

6.911 Beiträge seit 2009
vor 11 Jahren

Hallo punkdevil,

und für httpcfg hat du keine Äquivalent zu obigen Befehlen gefunden?
Guckst du: How to: Configure a Port with an SSL Certificate - da stehts für beide Variante beschrieben.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 11 Jahren

Hallo gfoidl,

genauso habe ich das Zertifikat konfiguriert. Mit "httpcfg query ssl" sehe ich auch das konfigurierte Zertifikat (siehe erstes Posting).

P
punkdevil Themenstarter:in
992 Beiträge seit 2007
vor 11 Jahren

Jat noch jemand eine Idee woran das liegen kann?
Gibt es vielleicht irgendwelche Sicherheitseinstellungen, welche ich kontrollieren könnte?