Frage

Also habe ich ein Servicereference habe zu einer C # Konsole-Anwendung, die einen Webdienst aufruft, die von Oracle ausgesetzt ist.

Ich habe alles Setup bekam und es funktioniert wie Pfirsiche, wenn es nicht SSL (http) verwendet wird. Ich versuche es jetzt mit SSL einzurichten, und ich laufe in Probleme mit ihm den Service Referenzen Hinzufügen (oder sogar Web Referenzen). Zum Beispiel kann die URL (https), dass der Dienst ausgesetzt auf wird, Rückkehr ist nicht die entsprechenden Web-Methoden, wenn ich versuche, es in Visual Studio hinzuzufügen.

  

Die zugrunde liegende Verbindung wurde geschlossen: Ein unerwarteter Fehler bei einem senden.   Hat einen unerwarteten EOF oder 0 Bytes aus dem Transportstrom.   Metadaten enthält eine Referenz, die nicht gelöst werden können: ‚ https://srs204.mywebsite.ca:7776 / somedirectory / MyWebService? WSDL "

Ein weiteres Dilemma ich habe ist in Bezug auf die Zertifikatsverwaltung und Bereitstellung. Ich habe über 1000 externe Client-Sites bekommen, die dieses kleine Programm verwenden müssen, und sie werden das Zertifikat in den entsprechenden Zertifikat-Store, um den Web-Service verbinden installiert sein. Nicht sicher über den besten Ansatz, um dies zu handhaben. Sie benötigen sie im Root-Speicher sein?

Ich habe schon einige Stunden im Web verbracht verschiedene Optionen mit Blick auf, kann aber nicht eine gute, saubere Antwort überall.

Um es zusammenzufassen, ich habe ein paar Fragen bekam hier:

1) Wer über die Einrichtung Web Services in Visual Studio einige gute Verbindungen haben, die SSL verwenden?

2) Wie sollte ich mich registrieren um das Zertifikat? Welche Speicher sollte es existieren in? Kann ich nur so etwas wie CertMgr verwenden Sie es registrieren?

Es muss ein gutes Buch / tutorial sein / was auch immer, dass mir gemeinsam bewährtes Verfahren zeigen, um etwas wie diese auf Einstellung. Ich kann einfach nicht scheinen, um es zu finden!

War es hilfreich?

Lösung

Nun, ich habe dies herausgefunden. Es dauerte viel länger als ich kümmere mich um zu sprechen, aber ich wollte, dass meine Lösung teilen, da es ein großes Haustier ärgert von mir ist, den Standard zu sehen. „Oh, ich regelte es! Danke!“ Beiträge, die jeder hängen lassen, was wirklich passiert ist.

So.

Das eigentliche Problem war, dass Visual Studio 2008 standardmäßig TLS für das SSL-Handshake verwendet und die Oracle / Java-basierten Webservice, die ich zu verbinden versuche SSL3 wurde mit.

Wenn Sie den "Dienstverweis hinzufügen ..." in Visual Studio 2008, haben Sie keine Möglichkeit, festzulegen, dass das Sicherheitsprotokoll für den Service-Point-Manager SSL3 sein sollte.

Falls nicht.

Sie nehmen ein statisches WSDL-Dokument und Verwendung wsdl.exe eine Proxy-Klasse zu generieren .

wsdl /l:CS /protocol:SOAP /namespace:MyNamespace MyWebService.wsdl

Dann können Sie die C Sharp Compiler verwenden dass die Proxy-Klasse in einer Bibliothek (DLL) drehen und es auf Ihre .NET-Projekte „Referenzen“ hinzufügen.

csc /t:library /r:System.Web.Services.dll /r:System.Xml.dll MyWebService.cs

An diesem Punkt müssen Sie auch sicherstellen, dass Sie System.Web.Services in Ihren „Referenzen“ auch enthalten haben.

Nun sollten Sie in der Lage sein, Ihren Web-Service im Code ohne ein Problem zu nennen. Um es Arbeit Sie gehen eine magische Codezeile hinzugefügt müssen, bevor Sie den Dienst instanziiert.

// We're using SSL here and not TLS. Without this line, nothing workie.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

Okay, also war ich mit mir selbst ziemlich beeindruckt das Gefühl, als Tests auf meine Dev-Box groß war. Dann entfalten ich zu einer anderen Client-Box und es würde nicht wieder verbindet aufgrund einer Berechtigung / Behörde Problem. Das roch wie Zertifikate mir (was auch immer sie riechen). Um dies zu beheben, ich verwendet certmgr.exe registrieren Sie das Zertifikat für die Website der Trusted Root auf dem lokalen Rechner.

certmgr -add -c "c:\someDir\yourCert.cer" -s -r localMachine root

Dies ermöglicht es mir, um das Zertifikat zu unseren Kunden-Websites zu verteilen und automatisch für die Benutzer installieren. Ich bin immer noch nicht sicher, wie „Sicherheit freundlich“ die verschiedenen Versionen von Windows in Bezug auf automatisierte Zertifikat Registrierungen wie diese sein wird, aber es hat super funktioniert so weit.

Hope diese Antwort einige Leute hilft. Dank blowdart auch für alle Ihre Hilfe auf diesem und bietet einen kleinen Einblick.

Andere Tipps

Es klingt wie die Web-Service ist ein selbst signiertes Zertifikat. Ehrlich gesagt ist dies nicht der beste Ansatz.

Angenommen, Sie eine große Organisation sind und es ist intern Sie Ihre eigene vertrauenswürdige Zertifizierungsstelle Setup können, ist dies besonders einfach mit Active Directory . Von diesen CA könnte der Server den Oracle-Hosting-Service ein Zertifikat anfordern und Sie können AD-Richtlinie verwenden Ihrem internen CA Root-Zertifikat vertrauen, indem sie es in der vertrauenswürdigen Wurzel des Computerspeichers platzieren. Dies würde die Notwendigkeit manuell entfernen vertrauen oder das Zertifikat auf dem Web-Service übernehmen.

Wenn die Client-Rechner sind externe dann sind Sie gehen zu müssen, um die Leute zu bekommen den Service auszusetzen entweder zum Kauf eines „echten“ Zertifikat von einem der bekannten CAs wie Verisign, Thawte, GeoTrust usw. oder als Teil Ihre installieren sie das öffentliche Zertifikat bündeln und in Vertrauenswürdige Stammzertifizierungsstellen auf jeder Maschine auf der Maschinenebene installieren. Dies hat Probleme, zum Beispiel keine Möglichkeit, das Zertifikat zu sperren, sondern die Aufforderung entfernen.

Vielen Dank für diesen tollen Tipp, warf einen kurzen Blick um auf Ihre Sachen, und Sie haben viele gute Ideen geht. Hier ist mein wenig hinzuzufügen - ich herauszufinden, webMethods und es hat die gleichen Probleme wie die Oracle-Applikationsserver Sie verbunden (SSL3 statt TLS) (Überraschung!). Ihr Ansatz funktionierte großartig, hier ist mein Nachtrag.

Bei statischen Klasse "Fabrik", bieten diese beiden Handy-Dandy Artikel:

/// <summary>
/// Used when dispatching code from the Factory (for example, SSL3 calls)
/// </summary>
/// <param name="flag">Make this guy have values for debugging support</param>
public delegate void CodeDispatcher(ref string flag);

/// <summary>
/// Run code in SSL3 -- this is not thread safe. All connections executed while this
/// context is active are set with this flag. Need to research how to avoid this...
/// </summary>
/// <param name="flag">Debugging context on exception</param>
/// <param name="dispatcher">Dispatching code</param>
public static void DispatchInSsl3(ref string flag, CodeDispatcher dispatcher)
{
  var resetServicePoint = false;
  var origSecurityProtocol = System.Net.ServicePointManager.SecurityProtocol;
  try
  {
    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3;
    resetServicePoint = true;
    dispatcher(ref flag);
  }
  finally
  {
    if (resetServicePoint)
    {
      try { System.Net.ServicePointManager.SecurityProtocol = origSecurityProtocol; }
      catch { }
    }
  }
}

Und dann dieses Zeug zu konsumieren (wie Sie sicher schon erraten haben, aber hier ohnehin einen Trommelwirbel) setzen:

    var readings = new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading[] {
      new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading() {
        attrID = 1, created = DateTime.Now.AddDays(-1), reading = 17.34, userID = 2
      },
      new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading() {
        attrID = 2, created = DateTime.Now.AddDays(-2), reading = 99.76, userID = 3
      },
      new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading() {
        attrID = 3, created = DateTime.Now.AddDays(-5), reading = 82.17, userID = 4
      }
    };
    ArchG2.Portal.Utils.wmArchG201.Factory.DispatchInSsl3(ref flag, (ref string flag_inner) =>
    {
      // creates the binding, endpoint, etc. programatically to avoid mucking with
      // SharePoint web.config.
      var wsFireWmdReading = ArchG2.Portal.Utils.wmArchG201.Factory.Get_fireWmdReading(ref flag_inner, LH, Context);
      wsFireWmdReading.fireWmdReading(readings);
    });

Das funktioniert der Trick -. Wenn ich etwas mehr Zeit bekommen werde ich das Threading-Problem lösen (oder nicht)

Da ich keinen Ruf zu äußern, würde Ich mag zu erwähnen, dass Mat Nadrofsky Antwort und Codebeispiel SSL3 zu zwingen ist auch die Lösung für einen Fehler ähnlich

  

Ein Fehler ist aufgetreten, während der Herstellung   HTTP-Anfrage an https: // xxxx / was auch immer .   Dies könnte aufgrund der Tatsache, dass die   Serverzertifikat nicht konfiguriert ist   richtig mit HTTP.SYS in der HTTPS   Fall. Dies könnte auch durch ein verursacht werden   Nichtübereinstimmung der Sicherheitsbindung   zwischen dem Client und dem Server.

Verwenden Sie einfach

// We're using SSL here and not TLS. Without this line, nothing workie.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

wie von Mat erwähnt. Getestet mit einem SAP-NetWeaver-PI-Server in HTTPS. Dank!

Mat,

Auch ich hatte solche Probleme und ich habe einen Weg certmgr.exe zu vermeiden, mit Zertifikaten vertrauenswürdigen Stamm auf einem entfernten Rechner hinzuzufügen.

X509Store store;
store = new X509Store("ROOT", StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(certificate);

Das ‚Zertifikat Objekt‘ kann wie folgt erstellt werden:

X509Certificate2 certificate = new X509Certificate2("Give certificate location path here");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top