Wie kann ich ein ssl Wildcard-Zertifikat für beiden Seiten mehr WCF-Server über X509 zu authentifizieren?

StackOverflow https://stackoverflow.com/questions/1630968

  •  06-07-2019
  •  | 
  •  

Frage

Ich habe zwei WCF-Server erhalten, sowohl auf der Domain mydomain.com (fiktives Beispiel, wie IP sind unten!) Bzw. dem Namen server1 und server2.

Sie sind beide zugänglich durch ihre öffentlichen IP-Adressen (foo.1 und 2), sondern auch aus der privaten LAN sie sind auf (dh 192.168.0.1 und 192.168.0.2)

Ich besitze ein Wildcard SSL-Zertifikat für * .mydomain.com. Es ist richtig in den entsprechenden Geschäften installiert (dh Personal für die Verschlüsselung und Trusted Clients für die Authentifizierung)

Ich mag meine beiden Server miteinander auf ihren lokalen Netzwerkadressen mit meinem Wildcard-Zertifikat zur Authentifizierung verbinden.

\ Windows \ System32 \ drivers \ etc \ hosts Datei, um es so aussehen zu machen:

Ich habe die C aktualisiert

192.168.0.1     Server1.mydomain.com
192.186.0.2     Server2.mydomain.com

Das sind nicht die IP-Adressen, die ich, wenn ich Server1.mydomain.com lösen (ich würde eher foo.1 bekommen - 2)

Ich habe bearbeitet auch den Verbindungsspezifisches DNS-Suffix für meine IPV4 lokalen Schnittstellen zu „mydomain.com“

Mein Zertifikat bezeichnet wird diese Dateien in meinem Server.config mögen (ich alle Teile nicht auf der Authentifizierung im Zusammenhang habe gestrippt)

        <behavior name="ServerToServerBehavior" >
          <serviceCredentials>
            <clientCertificate>
              <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="Online"/>
            </clientCertificate>
            <serviceCertificate x509FindType="FindByThumbprint" findValue="13a41b3456e431131cd461de"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="myServerAsClientBehaviorConfiguration">
          <clientCredentials>
            <clientCertificate x509FindType="FindByThumbprint" findValue="13a41b3456e431131cd461de" storeLocation="LocalMachine"/>
            <serviceCertificate>
              <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="Online" trustedStoreLocation="LocalMachine"/>
            </serviceCertificate>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>

Das funktioniert perfekt auf meinem eigenen dev Computer mit lokal X509-Zertifikate erzeugt, aber in meiner Produktionsumgebung, hier ist was ich bekommen:

  

Server.Connect: Es konnte keine Verbindung zu   Server Server2:   System.ServiceModel.Security.MessageSecurityException:   Identitätsprüfung nicht bestanden für abgehende   Botschaft. Die erwartete DNS Identität   der Remote-Endpunkt war   ‚Server2.mydomain.com‘, aber die Fernbedienung   Endpunkt bereitgestellt DNS Anspruch   'Mydomain.com'. Wenn dies ein   legitim, können Sie Remote-Endpunkt   das Problem beheben, indem Sie explizit   Angabe DNS Identität ‚mydomain.com‘   als die Eigenschaft Identität von   EndpointAddress wenn Kanalerzeugungs   Proxy-Server.

Ich habe versucht, den Server zu bekommen Server2.mydomain.com statt nur mydomain.com, ohne Erfolg zu beantworten. Jeder Hinweis auf, wie dies zu tun?

Ich habe auch versucht, die Lösung in der Fehlermeldung vorgeschlagen, aber dies scheint überhaupt (andere Nutzer scheinen a href zu haben keine Wirkung zu haben <= "http://social.msdn.microsoft.com/forums/ en-US / wcf / thread / cee66e78-9ee4-49fb-bf8c-cd1e14237e95 /“rel = "nofollow noreferrer"> das gleiche Problem und ich habe noch eine Lösung zu finden). Jede Idee, wie dieses Problem beheben?

Edit: Ich habe überprüfen mit meinem Zertifikatanbieter, dass ich in die Tat es für X509-Authentifizierung verwenden kann.

War es hilfreich?

Lösung

Ich verstand schließlich, warum meine Identität Feld ignoriert wurde.

wurde mein Endpunkt wie folgt aufgebaut:

DistantServer = new ServiceReferenceServerToServer.ServerToServerClient("myServerBinding", "net.tcp://server.mydomain.com/Server");

, wenn die uri Parameter zur Verfügung gestellt, das DNS-Identitätsfeld (definiert in der app.config), wird auch außer Kraft gesetzt (auch wenn es leer ist, was der Fall ist, wenn wir einen String statt ein echtes URI-Objekt verwenden).

die Lösung ist es zu setzen programmatisch mit dem folgenden Code:

        System.ServiceModel.EndpointAddress uri = new System.ServiceModel.EndpointAddress(new Uri("net.tcp://server.mydomain.com/Server"),new System.ServiceModel.DnsEndpointIdentity("mydomain.com"),new System.ServiceModel.Channels.AddressHeader[0]);

        DistantServer = new ServiceReferenceServerToServer.ServerToServerClient("myServerBinding", uri );

Andere Tipps

Ich denke, der DNS Anspruch die Fehler außer Kraft spricht auf der Client-Seite angegeben werden würde, nicht der Server, so dass Sie nichts von dieser Aenderung eröffnen, außer, dass der Client auf jeden Server erfolgreich verbinden könnte in Ihrem Domain (wenn sie zuhörten). Der Fehler Sie sehen, ist ein bisschen wie die Nachrichtensicherheit Äquivalent eines Hostnamen Mismatch auf dem cert. Ich habe die Nachrichtensicherheit bekommen mit Wildcard certs nach viel Arbeit um Verschrauben, aber Sie könnten einige benutzerdefinierte Validierungsarbeiten zu tun haben, da Ihr cert wahrscheinlich nicht die Client-Authentifizierung Nutzung angegeben hat.

Gibt es Gründe, die Sie nicht Transportsicherheit mit? Viel einfacher zu bekommen arbeiten, wenn Sie Zwischen Layer7 Routing haben ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top