Domanda

Quindi ho un ServiceReference aggiunto a un'applicazione C # console che chiama un servizio Web che è esposto da Oracle.

Ho impostato tutto e funziona come le pesche quando non sta usando SSL (http). Sto cercando di configurarlo utilizzando SSL ora, e sto correndo in problemi con aggiungendolo ai riferimenti di servizio (o anche riferimenti Web). Ad esempio, l'URL (https) che il servizio viene esposto su, non restituisce i metodi web appropriati quando provo ad aggiungere in Visual Studio.

  

La connessione sottostante chiusa: un errore imprevisto in un invio.   Ricevuto EOF imprevisto o 0 byte dal flusso di trasporto.   Metadati contiene un riferimento che non può essere risolta: ' https://srs204.mywebsite.ca:7776 / somedirectory / MyWebService? WSDL '

Un altro dilemma che ho è per quanto riguarda la gestione e la distribuzione dei certificati. Ho circa 1000 siti dei clienti esterni che dovranno utilizzare questo piccolo programma di utilità e avranno bisogno il certificato installato nel negozio cert appropriata al fine di connettersi al servizio Web. Non è sicuro l'approccio migliore per la gestione di questo. Non hanno bisogno di essere nell'archivio principale?

Ho passato un bel paio di ore sul web alla ricerca su varie opzioni, ma non riesco a ottenere una buona risposta pulita ovunque.

In sintesi, ho un paio di domande qui:

1) Qualcuno ha alcuni buoni collegamenti su come configurare i servizi Web in Visual Studio che utilizzano SSL?

2) Come dovrei registrare il certificato? Quale negozio dovrebbe esistere in? Posso usare qualcosa come CertMgr registrarlo?

Ci deve essere un buon libro / tutorial / qualunque cosa che mi mostrerà buone pratiche comuni su come impostare qualcosa di simile a questo. Io proprio non riesco a trovarlo!

È stato utile?

Soluzione

Bene, ho capito questo. Mi c'è voluto molto più a lungo di quanto mi piaccia parlare, ma ho voluto condividere la mia soluzione in quanto si tratta di un piccolo cruccio enorme di mine per vedere lo standard. "Oh, ho fissato! Grazie!" i messaggi che lasciano tutti appesi su ciò che è realmente accaduto.

.

Il problema principale era che di default di Visual Studio 2008 utilizza TLS per l'handshake SSL e il servizio Web basato Oracle / Java che stavo cercando di connettersi a stava usando SSL3.

Quando si utilizza il "Add Service Reference ..." in Visual Studio 2008, si dispone di c'è modo di specificare che il protocollo di sicurezza per il gestore punto di servizio dovrebbe essere SSL3.

A meno.

Si prende un documento WSDL statico e Wsdl.exe per generare una classe proxy .

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

Quindi è possibile utilizzare la C Sharp compilatore a sua volta che classe proxy in una libreria (dll) e aggiungerlo ai tuoi progetti .Net "Riferimenti".

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

A questo punto è anche necessario fare in modo che avete incluso System.Web.Services nel vostro "Riferimenti" pure.

Ora si dovrebbe essere in grado di chiamare il servizio web senza un problema nel codice. Per rendere più lavoro si sta andando ad avere bisogno di una linea magica di codice aggiunto prima di un'istanza del servizio.

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

Va bene, così mi sentivo abbastanza impressionato con me stesso come test era grande sulla mia casella di dev. Poi ho schierato ad un'altra scatola cliente e non sarebbe connettersi di nuovo a causa di un / problema di un'autorità di autorizzazioni. Questo puzzava certificati a me (quello che profumano). Per risolvere questo, ho usato Certmgr.exe per registrare il certificato per il sito alla radice attendibile sulla macchina locale.

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

Questo mi permette di distribuire il certificato ai nostri siti client e installare automaticamente per gli utenti. Io non sono ancora sicuro di come "sicurezza friendly" le diverse versioni di Windows saranno per quanto riguarda le registrazioni di certificati automatici come questo, ma è funzionato grande finora.

La speranza questa risposta aiuta alcune persone. Grazie a blowdart troppo per tutto il vostro aiuto su questo e di fornire qualche informazione.

Altri suggerimenti

Sembra che il servizio Web utilizza un certificato autofirmato. Francamente questo non è l'approccio migliore.

Supponendo che sei una grande organizzazione ed è interno è possibile impostare il proprio un'autorità di certificazione attendibile, questo è particolarmente facile con Directory attiva. Da quel CA server che ospita il servizio di Oracle potrebbe richiedere un certificato ed è possibile utilizzare la politica dC fidarsi certificato principale del CA interna ponendolo nella radice di fiducia del negozio macchina. Questo eliminerebbe la necessità di fidarsi o accettare il certificato sul servizio web manualmente.

Se le macchine client sono esterni, allora si sta andando ad avere per ottenere la gente che espongono il servizio per acquistare un certificato di "reale" da una delle autorità di certificazione ben noti come Verisign, Thawte, GeoTrust ecc o come parte di il vostro bundle install il certificato pubblico e installarlo in autorità di certificazione radice attendibili a livello macchina su ogni macchina. Questo ha dei problemi, ad esempio, non c'è modo di revocare il certificato, ma rimuovere la richiesta.

Grazie per questo grande punta, ha preso un rapido sguardo intorno alla vostra roba e hai un sacco di buone idee in corso. Ecco la mia po 'da aggiungere - Sto cercando di capire webMethods ed ha gli stessi problemi come l'application server Oracle collegato a (SSL3 invece di TLS) (sorpresa!). Il tuo approccio ha funzionato grande, ecco la mia addendum.

Dato classe statica "Factory", fornire questi due elementi a portata di mano-dandy:

/// <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 { }
    }
  }
}

E poi a consumare questa roba (come si deve senza dubbio già indovinato, ma mette un rullo di tamburi in qui comunque):

    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);
    });

Che fa il trucco -. Quando avrò più tempo sarò risolvere il problema di threading (o non)

Poiché non ho alcuna reputazione di commentare, vorrei ricordare che di Mat Nadrofsky risposta e codice di esempio per forzare SSL3 è anche la soluzione per un errore simile a

  

Si è verificato un errore durante rendendo il   richiesta HTTP https: // xxxx / qualunque cosa .   Questo potrebbe essere dovuto al fatto che la   certificato del server non è configurato   correttamente con HTTP.SYS in HTTPS   Astuccio. Questo potrebbe anche essere causato da un   mancata corrispondenza del titolo vincolante   tra il client e il server.

Basta usare

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

come detto da Mat. Testato con un server SAP NetWeaver PI in HTTPS. Grazie!

Mat,

ho avuto questi problemi troppo e ho un modo per evitare di usare Certmgr.exe per aggiungere i certificati di radice di fiducia su una macchina remota.

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

L' 'oggetto del certificato' può essere creato in questo modo:

X509Certificate2 certificate = new X509Certificate2("Give certificate location path here");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top