4 messaggi dal 17 agosto 2017
Buongiorno,

o un web service che mi è stato fornito esterno che dovrei utilizzare.
Il web service funziona certificato pfx.

Passando il certificato al service reference :
trasmisione.ClientCredentials.ClientCertificate.Certificate = x509;

funziona correttamente.
Fallisce nel momento in cui vado a chiamare il web service restituendomi l'errore:

Richiesta annullata: Impossibile creare un canale sicuro SSL/TLS.

Alcune note.
Il certificato non è di una CA attendibile.
Nel browser mi chiede conferma di voler accedere, ma poi riesce ad accedere e visualizzare il messaggio.
Il web server è scritto in Axis2.

Non riesco a trovare nessuna soluzione !!!!
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao e benvenuto nel forum!

Il certificato non è di una CA attendibile.

Ok, questo è un grosso indizio. Probabilmente la richiesta al webservice non va a buon fine a causa di questo problema. Per risolverlo, dovresti farti dare il certificato di root della CA da chi ha realizzato il webservice ed installarlo nella tua macchina. A quel punto, dato che quella CA sarà diventata "attendibile", non dovresti avere più problemi ammesso che gli altri certificati siano validi (es. ancora entro la data di validità).

Qui trovi delle istruzioni per installare il certificato di root.
http://www.thewindowsclub.com/manage-trusted-root-certificates-windows

Se non ti forniscono il certificato di root, sappi che esiste un'alternativa ma considerala come provvisoria. Dovresti fare il possibile per convincere chi ha scritto il servizio a sanare questa situazione, oltretutto perché oggi, grazie a Let's Encrypt, è possibile ottenere certificati SSL gratuiti con CA attendibile.

Vediamo l'alternativa:

Nel browser mi chiede conferma di voler accedere, ma poi riesce ad accedere e visualizzare il messaggio.

Ok, il browser ti ha segnalato l'errore ma tu hai scelto di visitare comunque quel sito. Il problema quindi è stato aggirato con il tuo esplicito consenso. Puoi fare la stessa cosa anche via codice. Se il tuo client usa lo stack di WCF, ecco come puoi farlo affidando una tua callback al delegate ServicePointManager.ServerCertificateValidationCallback:
https://stackoverflow.com/questions/3764317/how-to-stop-certificate-errors-temporarily-with-wcf-services#answer-3766535

Questo ti dà l'opportunità di esaminare il certificato via codice e decidere se accettarlo oppure no.

ciao,
Moreno
Modificato da BrightSoul il 17 agosto 2017 13.03 -

Enjoy learning and just keep making
4 messaggi dal 17 agosto 2017
Grazie della risposta

Anche io credo che tutto dipenda dalla fatto della CA non riconosciuta.

ho già caricato il certificato e cercato di utilizzarlo caricandolo tramite il codice :

ServiceReference1.SdITrasmissioneFileClient trasmisione = new ServiceReference1.SdITrasmissioneFileClient();

trasmisione.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindByIssuerName, "nome del certificato");

Seguendo le indicazioni che ci sono scritte per installare il certificato di root le ho seguite ma mi sono perso in fondo nell'ultimo comando.


Mentre per il serverCertificateValidationCallBack ho provato inserendo il codice :
System.Net.ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(customXertificateValidation);


Ma non cambia nulla, anzi nella funzione customXertificareValidation non entra proprio....

Forse perché uso dei service Reference ?
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


ho già caricato il certificato e cercato di utilizzarlo caricandolo tramite il codice :

Il certificato che carichi da codice è un certificato client che ti servirà per autenticarti al servizio e non c'entra in questo caso. Qui il problema è a monte e riguarda il certificato server. Riesaminiamo il testo dell'errore:


Impossibile creare un canale sicuro SSL/TLS.


Questo errore significa che il server sta esponendo il servizio su un indirizzo HTTPS e, per farlo, sta usando un certificato SSL che al tuo client risulta non valido. Quindi, il tuo client sta avendo problemi anche soltanto a stabilire un collegamento a quel webservice. Abbiamo detto che, probabilmente, gli manca il certificato di root della CA.

Il problema si risolve in uno dei due modi che ti dicevo prima: installando il certificato di root o impostando la ServerCertificateValidationCallback.


nella funzione customXertificareValidation non entra proprio....

Domanda: stai usando WCF per consumare il servizio? In questo caso, se l'indirizzo è https, la callback dovrebbe esserti invocata. In altre situazioni mi è capitato di risolvere in quel modo.

Segui fedelmente l'esempio che trovi nella discussione su StackOverflow oppure, ma solo se puoi/vuoi divulgarlo, dimmi qual è l'URL del servizio così provo anch'io (basta l'URL, senza credenziali e senza i certificati in tuo possesso).

ciao,
Moreno

Enjoy learning and just keep making
4 messaggi dal 17 agosto 2017
Usando il certificato client riesco da browser riesco a interagire con il server.

Sto usando WPF in visual studio 2015.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Sto usando WPF in visual studio 2015.

No, volevo sapere se per il tuo client stai usando lo stack di WCF. Riformulo la domanda: come hai aggiunto il riferimento al servizio nel tuo progetto?
Hai usato il comando "Aggiungi riferimento al servizio..." di Visual Studio, cioè questo?
https://i-msdn.sec.s-msft.com/dynimg/IC566138.png

Oppure hai cliccato il tasto "Avanzate" che vedi là in basso nell'immagine e poi hai fatto "Aggiungi riferimento web"?

Se hai seguito la prima procedura, allora stai usando lo stack di WCF e la callback ti verrà senz'altro invocata. Metti un breakpoint all'interno della funzione e vedrai che l'esecuzione passerà di lì.

Ti condivido questo progetto che consuma un webservice esposto su HTTPS. Se metti un brekpoint nella funzione "ValidationCallback" in "MainWindow.xaml.cs", vedrai che l'esecuzione passerà di lì. Nota come la callback sia stata registrata PRIMA di eseguire richieste al webservice.
https://1drv.ms/u/s!Ao4rhSdtDw8rgekBL_2Ybv0yEUppTA

ciao,
Moreno

Enjoy learning and just keep making
11.886 messaggi dal 09 febbraio 2002
Contributi
Prova anche ad impostare esplicitamente TLS 1.2 come protocollo di comunicazione prima di inviare la richiesta.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;


ciao,
Moreno

Enjoy learning and just keep making
4 messaggi dal 17 agosto 2017
Confermo che impostando il protocollo TLS 1.2 funziona il web service e passa anche dalla funzione di ServerCertificateValidationCallback.

Per informazione come hai fatto a determinare che andava cambiato il protocollo, e quale fosse il giusto protocollo?


Grazie Tante

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.