11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
all'inizio non mi era chiaro il perché la richiesta al webservice fallisse senza neanche entrare nella callback.
Quindi ho usato questo tool online per farmi venire un'idea. Ti dà informazioni su un server HTTPS e sul certificato che espone.
https://www.ssllabs.com/ssltest/index.html

Scorrendo il risultato, verso l'inizio, sono elencati i protocolli supportati e solo il TLS 1.2 risultava esserlo. Ho provato ad impostarlo esplicitamente e ha funzionato.

Col senno di poi, mi sarebbe dovuto venire in mente che il problema poteva essere il protocollo perché se la richiesta HTTPS fallisce con "Impossibile creare un canale sicuro SSL/TLS" senza che la callback venga chiamata, allora il problema non può che essere nella fase di negoziazione. Come vedi in questa immagine, il server manda il suo certificato solo dopo aver negoziato con il client le "security capabilities" tra cui la versione del protocollo da usare.

Non ci sono arrivato subito anche perché ci sono delle cose che ancora mi sono oscure, tipo: perché il client .NET non ha provato i vari protocolli che gli sono noti prima di dire che è "Impossibile creare un canale sicuro SSL/TLS"? Sarà che il valore di default di SecurityProtocol non include TLS 1.2? Bisognerebbe andarsi a guardare il sorgente per capire come funziona.
https://github.com/Microsoft/referencesource/blob/master/System/net/System/Net/ServicePointManager.cs

ciao,
Moreno

Enjoy learning and just keep making
3 messaggi dal 07 febbraio 2018
Ciao a tutti,
ho anche io il medesimo problema con lo stesso web service dello sdi.

Ho provato sia senza wcf aggiungendo un riferimento web al servizio, e non ho problemi con i certificati (in quanto la callback viene correttamente richiamata) quindi il web services viene invocato ma ottengo un errore di parsing nella risposta (in formato MTOM da quant ho capito) anche usando WSE ed impostando ReuireMTOM ci sono errori di parsig della risposta.

Sto riprovando ora con WCF quindi facendo aggiungi riferimento a servizio web. Ed ho lo stesso problema indicato nel presente post. Ho impostato il protocollo tls a 1.2 ma ottengo sempre

Connessione sottostante chiusa: Impossibile stabilire una relazione di trust per il canale sicuro SSL/TLS..

con una inner exception con il seguente messaggio

Il certificato remoto non è stato ritenuto valido dalla procedura di convalida

La callback sulla validità del certificato non viene mai richiamata anche se impostata ho visto gli esempi linkati

public static void SetCertificatePolicy()
{
ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;
}

/// <summary>
/// Certificate validation callback
/// </summary>
public static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error)
{
return true;
}

chiaramente richiamo il metodoSetCertificationPolicy prima di chiamare il servizio.

Volevo sapere poi come avevate risolto.

Grazie mille
1 messaggio dal 09 novembre 2016
Salve,

anche io sto tentando di autenticarmi al portale PST giustizia, ma incontro un problema che credo qualcuno di voi abbia già risolto.

Sono in possesso della chiavetta di un professionista abilitato al portale, me l'ha data appunto per verificare la fattibilità di un programmino che gli dovrebbe scaricare tutti gli allegati ai fascicoli sul suo pc senza doverli scaricare uno alla volta.

Tra la documentazione presa dal sito, e 6/7 mila pezzi di codice presi qua e la su StackOverflow ho buttato giù un po di codice che mi fa arrivare fino alla richiesta del pin ma poi si ferma sulla WebResponse con l'errore seguente:

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

Dai log ho tirato fuori la riga seguente, anche questa capitata a molti, ma da tutte le spiegazioni e soluzion trovate e provate in giro, sono orami due giorni che brancolo nel buio...

System.Net Information: 0 : [3892] InitializeSecurityContext(numero In-Buffer=2, lunghezza Out-Buffer=0, codice restituito=IllegalMessage).

Di seguito il codice
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.IO;
using System.Xml;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Security.Cryptography.X509Certificates;
using System.Diagnostics;
using System.Net.Security;

namespace CTU
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Execute();
            //CreateWebRequest("https://ext.processotelematico.giustizia.it/pda/pycons/GLRM/JPW_SICID");
        }

        /// <summary>
        /// Execute a Soap WebService call
        /// </summary>

        public static void Execute()
        {
            ServicePointManager.Expect100Continue = true;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault;
            /*
                                                   | SecurityProtocolType.Tls11
                                                   | SecurityProtocolType.Tls12
                                                   | SecurityProtocolType.Ssl3;
            */
            HttpWebRequest request = CreateWebRequest();
            SetCertificatePolicy();
            X509Certificate cert = FindCertByName("CERTIFICATO");
            request.ClientCertificates.Add(cert);
            request.ProtocolVersion = HttpVersion.Version10;
            XmlDocument soapEnvelopeXml = new XmlDocument();
            soapEnvelopeXml.LoadXml(@"<?xml version=""1.0"" encoding=""utf-8""?>
            <soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""
                           xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" 
                           xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
              <soap:Header>
                <ws:invocationDomain
                  xmlns:ws=""https://ext.processotelematico.giustizia.it/pda/pycons/GLRM/JPW_SICID""
                  soap:MustUnderstand=""true""
                  group=""jpwusers"" role=""JPW"" name=""JPW"">
                    </ws:invocationDomain>
              </soap:Header>
                <soap:Body>
                    <getServiceNames>
                        xmlns:m=""urn:CONS-SICC-BE""
                    </getServiceNames>
                </soap:Body>
            </soap:Envelope>");

            using (Stream stream = request.GetRequestStream())
            {
                soapEnvelopeXml.Save(stream);
            }

            WebResponse response = request.GetResponse(); <--------------------------------------------------- qui si ferma

            //using (WebResponse response = request.GetResponse())
            //{
                using (StreamReader rd = new StreamReader(response.GetResponseStream()))
                {
                    string soapResult = rd.ReadToEnd();
                    Console.WriteLine(soapResult);
                }
            //}
        }
        /// <summary>
        /// Create a soap webrequest to [Url]
        /// </summary>
        /// <returns></returns>
        public static HttpWebRequest CreateWebRequest()
        {
            //HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(@"https://ext.processotelematico.giustizia.it/pda/pycons/GLRM/JPW_SICID");
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(@"https://ext.processotelematico.giustizia.it");
            webRequest.Headers.Add(@"SOAP:Action");
            webRequest.ContentType = "text/xml;charset=\"utf-8\"";
            webRequest.Accept = "text/xml";
            webRequest.Method = "POST";
            return webRequest;
        }

        private static X509Certificate FindCertByName(string simpleName)
        {
            X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly);
            foreach (X509Certificate cert in store.Certificates)
            {
                if (cert.Subject.Contains("CN=" + simpleName))
                {
                    return cert;
                }
            }

            string msg = "Il certificato di sicurezza " + simpleName + " non è installato in questo sistema.";
            Debug.WriteLine(msg);
            return null;
        }

        /// <summary>
        /// Sets the cert policy.
        /// </summary>
        private static void SetCertificatePolicy()
        {
            ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;
        }

        /// <summary>
        /// Certificate validation callback 
        /// </summary>
        private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error)
        {
            if (error == SslPolicyErrors.None)
            {
                return true;   // already determined to be valid
            }

            switch (cert.GetCertHashString())
            {
                // thumbprints/hashes of allowed certificates (uppercase)
                case "5ACB8B01ED6B099C5B316A1F6E27C7089C70FFAC":

                    Debug.WriteLine("Trusting X509Certificate '" + cert.Subject + "'");
                    return true;

                default:
                    return false;
            }
        }

        public static HttpWebRequest CreateWebRequest(string url)
        {
            Uri uri = new Uri(url);
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);

            webRequest.ProtocolVersion = HttpVersion.Version10;
            webRequest.Proxy = null;
            webRequest.Headers.Add("SOAP:Action");
            webRequest.Headers.Add("X-WASP-User", "CODICEFISCALE");
            webRequest.KeepAlive = true;
            webRequest.ContentType = "text/xml;charset=\"utf-8\"";
            webRequest.Accept = "text/xml";
            webRequest.Method = "POST";
            webRequest.AuthenticationLevel = AuthenticationLevel.MutualAuthRequired;
            
            if (FindCertByName("CERTIFICATO") != null)
            {
                webRequest.ClientCertificates.Add(FindCertByName("CERTIFICATO"));
            }

            return webRequest;
        }
    }
}


Grazie a tutti per qualche spunto, dritta, pezzo di codice che funziona...

Stefano
Modificato da StephenSoftware il 06 agosto 2020 17:28 -

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.