none
Problemi di autenticazione su un web service non dotnet che utilizza il protocollo https e l'autenticazione con certificati

    Domanda

  • Il webservice in questione serve ad inviare una fattura e l'autenticazione deve avvenire tramite certificato client fornito da loro.
    La funzione di invio delle fatture deve essere integrata all'interno un gestionale web basato su ASP.NET 4.0 WebForms.
    Il certificato client ed il relativo certificato CA root sono stati correttamente installati nel sistema tramite Microsoft Manage Console, rispettivamente all'interno di "Personale->Certificati" e "Autorità di certificazione radice Attendibii"

    Il problema è che non riesco in alcun modo a farmi autenticare dal sistema. Mi spiego meglio: quando viene invocato il metodo "RiceviFile" ottengo questa eccezione:

    Richiesta HTTP vietata con lo schema di autenticazione client 'Anonymous'.
    Errore del server remoto: (403) Non consentito.

    Questo è il codice

                  Dim l_client As New wsSdiRiceviFile.SdIRiceviFileClient()
                l_client.ClientCredentials.ClientCertificate.Certificate = New X509Certificate2("Nome del file del certificato .pfx", "password")

                Dim l_file As New wsSdiRiceviFile.fileSdIBase_Type

                Dim l_result As wsSdiRiceviFile.rispostaSdIRiceviFile_Type = l_client.RiceviFile(l_file)

    Nel file App.config ho inserito questo

      <system.serviceModel>
        <bindings>
          <basicHttpBinding>
            <binding name="SdIRiceviFile_binding">
              <security mode="Transport">
                <transport clientCredentialType="Certificate"  />
              </security>
            </binding>
          </basicHttpBinding>
        </bindings>
        <client>
          <endpoint address="http://testservizi.fatturapa.it/ricevi_file" binding="basicHttpBinding"
            bindingConfiguration="SdIRiceviFile_binding" contract="wsSdiRiceviFile.SdIRiceviFile"
            name="SdIRiceviFile_port" >
          </endpoint>
        </client>
      </system.serviceModel>

    Quale può essere il problema?

    giovedì 4 maggio 2017 16:24

Tutte le risposte

  • ciao potresti provare cosi':

    pero' questo e' il servizio SDICoop - Trasmissione versione 2.0 

    var sslBinding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
    sslBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
    sslBinding.MessageEncoding = WSMessageEncoding.Mtom;
    
    var endPoint = new EndpointAddress(_endPointURI);
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
    
    var clientCertificate = new X509Certificate2(_certificateFullPath, "", X509KeyStorageFlags.MachineKeySet);
    
    RispostaFile_Type risposta = null;
    ReturnResult ret = null;
    
    using (var client = new SdITrasmissioneFileClient(sslBinding, endPoint))
    {
        client.ClientCredentials.ClientCertificate.Certificate = clientCertificate;
    
        var file = new File_Type();
        file.File = contenutoFile;
        file.NomeFile = nomeFile;
        file.TipoFile = tipoFile;
    
        risposta = client.Trasmetti(file);
    }


    giovedì 11 maggio 2017 07:25
  • ciao,

    grazie per il suggerimento.

    Ho provato come mi ha suggerito, ma l'errore rimane lo stesso.

    Forse sbaglio a installare i certificati.

    Io ho installato il certificato client che mi hanno mandato nei certificati Personali e il caentrate.cer tra le Autorità di certificazione radice attendibili.

    Così è sufficiente o devo fare qualcos'altro?


    venerdì 12 maggio 2017 10:11
  • Ciao, 

    anche io sto cercando di autenticarmi al servizio SdICoop, ma ottengo lo stesso preblema Richiesta HTTP vietata con lo schema di autenticazione client 'Anonymous'.
    Errore del server remoto: (403) Non consentito..

    di seguito il file config:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
        </startup>
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="SdITrasmissioneFile_binding">
    <security mode="Transport">
    <transport clientCredentialType="Certificate" />
    </security>
                    </binding>
                </basicHttpBinding>
            </bindings>
            <client>
                <endpoint address="https://servizi.fatturapa.it/dati-fattura"
                    binding="basicHttpBinding" bindingConfiguration="SdITrasmissioneFile_binding"
                    contract="SdITrasmissioneFile.SdITrasmissioneFile" name="SdITrasmissioneFile_port" />
            </client>
        </system.serviceModel>
    </configuration>

    invocazione del WS:

    X509Certificate2 clientCertificate = new X509Certificate2("C:\\Users\\Desktop\\Personale\\Fattura PA\\web service SdI\\Chiavi pubbliche\\sdi_client_test.pfx", "", X509KeyStorageFlags.MachineKeySet);

    File_Type file = new File_Type();

    SdITrasmissioneFileClient SdI = new SdITrasmissioneFileClient();
    SdI.ClientCredentials.ClientCertificate.Certificate = clientCertificate;
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
    ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;


    file.TipoFile = ".xml";
    file.NomeFile = "IT09876543210_00001";
    byte[] doc = File.ReadAllBytes("c://temp//IT09876543210_00001.xml");
    file.File = doc;
    SdI.Trasmetti(file);

    Qualcuno ha risolto?
    • Modificato Lama91ì giovedì 2 novembre 2017 20:33
    giovedì 2 novembre 2017 20:32
  • Anch'io ho avuto lo stesso problema.

    Non so se è stato risolto, ma sono un passo avanti.

    Per l'authenticazione ho dovuto modificare il "EndPoint":

                    

    var clientCertificate = new X509Certificate2(_certificateFullPath, "", X509KeyStorageFlags.MachineKeySet);
    var identity = new X509CertificateEndpointIdentity(clientCertificate);

    var endPoint = new EndpointAddress(new Uri(_endPointURI), identity);

    Ma adesso ricevo questo errore:

    "Could not establish trust relationship for the SSL/TLS secure channel with authority 'testservizi.fatturapa.it'."

    Anche voi avete avuto questo problema?

    mercoledì 21 febbraio 2018 11:37
  • Ciao,

    anche io sto avendo lo stesso problema. Ho configurato un client SOAP che utilizza il certificato da loro fornito e la chiave privata da me generata per effettuare l'autenticazione. E' una cosa che ho già fatto in mille altre implementazioni simili ma con Sogei non funziona. Mi chiedo se non ci sia qualcosa che loro non dicono.

    Ho fatto le seguenti prove :

     - no certificati -> da "403 forbidden" e risponde una pagina HTML

     - certificati client con intera catena fino al root -> da "403 authentication" e risponde una servlet

     - certificati client senza catena -> idem come sopra

     - certificati server -> Idem come sopra

     - certificati client+ WS-Security X509 auth enc+sig-> idem come sopra

     - certificati client + WS-Security sername token con miaPI -> idem come sopra

    E da sogei non rispondono.

    Tu sei riuscito a fare passi avanti ?

    giovedì 10 maggio 2018 06:47
  • Buongiorno signori,

    mi accodo al problema :)

    anche a me dà Richiesta HTTP vietata con lo schema di autenticazione client 'Anonymous'.
    Errore del server remoto: (403) Non consentito.

    tra l'altro, del kit dei certificati che ho scaricato

    caentrate.cer

    CAEntratetest.cer

    SDI-Partita IVA CLIENT.cer

    SDI-Partita IVA SERVER.cer

    servizi.fatturapa.it.cer

    SistemaInterscambioFatturaPA.cer

    SistemaInterscambioFatturaPATest.cer

    testservizi.fatturapa.it.cer

    non mi è chiaro quale devo passare alla funzione

    X509Certificate2 clientCertificate = new X509Certificate2("C:\\Users\\Desktop\\Personale\\Fattura PA\\web service SdI\\Chiavi pubbliche\\sdi_client_test.pfx", "", X509KeyStorageFlags.MachineKeySet);

    tutti i certificati ricevuti li ho messi sia in Personale che nella root, servono altrove?

    grazie mille,

    Andrea

    giovedì 10 maggio 2018 07:32
  • NarutoQuantistico sai almeno darmi la dritta su quale sia il certificato da utilizzare per 'presentarsi 'al server sogei?

    grazie mille

    Andrea

    giovedì 10 maggio 2018 11:57
  • Ciao a tutti, sto soffrendo anch'io con Sogei. La situazione è ferma da MESI perché non rispondono oppure se rispondono lo fanno con settimane di ritardo e a monosillabi, tipo "Riprovi ora" (ma la situazione è invariata).

    Nel mio caso sto avendo a che fare col portale delle vendite pubbliche ma la situazione è più o meno la stessa presentata dagli altri sviluppatori in questo thread.

    Alcune info utili:

    - Se l'assistenza di Sogei non risponde, andate a far presente il problema a qualcuno del Team Digitale su https://forum.italia.it/. Già che ci siete, vedete se qualcun altro ha postato informazioni utili in merito al vostro problema.

    - Vi condivido il codice che sto usando io per inviare la richiesta. Ecco qui:

    https://gist.github.com/BrightSoul/a97741be6844b76019a41991e7175e2c

    Al momento ho risolto il problema del "Could not establish trust relationship for the SSL/TLS secure channel" ma sono comunque fermo su un errore 500 lato loro. Sicuramente sto sbagliando qualcosa nella richiesta ma non ho modo di capire cosa perché il servizio non è standard e non mi sta restituendo una Soap Fault.

    >> quale sia il certificato da utilizzare per 'presentarsi 'al server sogei?

    Dipende. Nel mio caso hanno voluto che gli inviassi la chiave pubblica del certificato SSL usato per il dominio in cui è pubblicato il sito web che deve integrarsi con il loro webservice. Quindi, come certificato client devo usare il pfx che contiene la chiave privata che corrisponde alla chiave pubblica che ho inviato loro. Nel vostro caso però potrebbero avervi inviato loro stessi il .pfx, che contiene la chiave privata protetta da password.

    NarutoQuantistico, per favore, puoi far vedere come abiliti WS-Security prima di inviare la richiesta con WCF?

    Moreno


    domenica 13 maggio 2018 12:34
  • Beh almeno non mi sento solo. Io ho lo stesso problema esattamente come il tuo.

    Ho installato (in locale per utente su mmc) il certificato client e quelli rilasciati una volta accreditato il canale di trasmissione.

    Ho provato di tutto ma anche a me da sempre

    Impossibile stabilire un canale sicuro per SSL/TLS con l'autorità 'testservizi.fatturapa.it'.

    oppure

    Impossibile stabilire un canale sicuro per SSL/TLS con l'autorità 'servizi.fatturapa.it'.


    Se provo ad andare su https://testservizi.fatturapa.it/ricevi_file oppure su https://servizi.fatturapa.it/ricevi_file e provo a guardare il certificato, mi trovo

    - Firefox -> Connessione sicura

    - Chrome -> Connessione NON sicura -> NET::ERR_CERT_COMMON_NAME_INVALID

    - Edge -> Connessione sicura

    - IE -> L'errore (HTTP 403 - accesso negato) indica che è stato possibile connettersi al sito Web tramite Internet Explorer, ma che non si dispone delle autorizzazioni per visualizzare la pagina Web.

    lunedì 14 maggio 2018 12:39
  • Impossibile stabilire un canale sicuro per SSL/TLS con l'autorità 'testservizi.fatturapa.it'.

    oppure

    Impossibile stabilire un canale sicuro per SSL/TLS con l'autorità 'servizi.fatturapa.it'.

    Prova a crearti un custom binding, a me ha funzionato. Vedi qui:

    https://gist.github.com/BrightSoul/a97741be6844b76019a41991e7175e2c

    Oggi Sogei mi ha inviato un esempio di richiesta (una novità assoluta) e incredibilmente funziona! L'ho mandata tale e quale usando HttpClient. Ora sto cercando di capire in cosa è differente dalla mia e quindi riprodurla usando lo stack di WCF. Se riesco a venirne a capo vi condivido il codice.

    Moreno


    lunedì 14 maggio 2018 17:29
  • ciao Moreno, ciao ragazzi

    grazie per la partecipazione alla discussione.

    Moreno, puoi intanto girare il codice che ti ha dato sogei? giusto per avere la piacevole sensazione di vederlo funzionare :) 

    grazie mille e buon lavoro

    Andrea

    martedì 15 maggio 2018 13:53
  • Ciao, purtroppo non ho avuto codice, ho solo auto il contenuto XML di una richiesta SOAP. Io la invio con HttpClient e il server mi risponde correttamente. Purtroppo non sono ancora riuscito a capire cosa sto sbagliando nel comporre la mia richiesta. Probabilmente non gli va bene la firma perché non ho ancora capito quali parti del messaggio SOAP vanno firmate. Probabilmente il Body ma... il contenuto? Tutto l'elemento? Ho smanettato tutto il giorno anche con SoapUI che mi permette di selezionare con esattezza le parti da firmare ma nulla di fatto.

    Sto cominciando a diventare paranoico e a pensare che sia importante persino dare gli stessi nomi ai prefissi dei namespace XML. Comunque, io sono sul Portale delle Vendite Pubbliche, non su fattura PA. Se trovo l'inghippo vi faccio sapere. Nel fratempo... avete provato con il custom binding?

    martedì 15 maggio 2018 18:08
  • ciao Moreno, grazie per la risposta.

    Non ho provato il custom binding perchè l'errore che ricevo non è relativo al canale sicuro, ma 'Richiesta HTTP vietata con lo schema di autenticazione client 'Anonymous'.

    In sostanza, gli passo il certificato p12 ma è come se il certificato non fosse corretto, come se non mi identificasse. Tale certificato l'ho generato con openssl per windows, passandogli come parametri la mia chiave privata, il certificato client che mi hanno fornito (trasformato in .pem) ed il certificato CAEntrateTest.cer...ma niente da fare.

    Siccome ho il dubbio che il certificato che ho generato non sia corretto, per la tua esperienza mi confermi che se tale certificato fosse corretto, e lo caricassi tra i certificati del browser, mettendo nel browser l'indirizzo https://testservizi.fatturapa.it/ricevi_file dovrebbe rispondermi con l'elenco dei metodi messi a disposizione, anzichè errore 403 forbidden? se così fosse almeno avrei un modo per verificarne la correttezza, per poi smanettare eventualmente lato codice .

    grazie e buon lavoro

    Andrea

    mercoledì 16 maggio 2018 07:42
  • mi confermi che se tale certificato fosse corretto, e lo caricassi tra i certificati del browser, mettendo nel browser l'indirizzo https://testservizi.fatturapa.it/ricevi_file dovrebbe rispondermi con l'elenco dei metodi messi a disposizione, anzichè errore 403 forbidden?

    Esatto, è una prova che ho fatto anch'io per verificare che il certificato fosse valido. Il server nel mio caso NON ha risposto con l'elenco dei metodi ma mi ha dato un errore "Method not allowed", ed è normale che sia così perché l'URL è stato invocato con una richiesta GET anziché una richiesta POST. Comunque, anche il "Method not allowed" è una chiara indicazione che la fase di autenticazione con certificato è stata superata con successo.

    L'elenco dei metodi ti verrebbe restituito solo visitando l'URL del WSDL ma non è detto che tale URL esista. Infatti, Sogei può scegliere di non pubblicare affatto il WSDL e di spedirtelo invece via e-mail, come è stato nel mio caso.

    In sostanza, gli passo il certificato p12 ma è come se il certificato non fosse corretto, come se non mi identificasse.

    Beh, tu hai mandato la chiave pubblica a Sogei? Non so come funzioni nel caso di FatturaPA, ma penso che tu debba comunicare o via e-mail o via un pannello web di gestione (se esiste) che la tua chiave pubblica è quella che hai generato. Altrimenti l'accesso sarebbe libero a chiunque abbia generato un certificato client autofirmato.

    Sei davvero sicuro di dover genere tu il certificato client? Non è che per caso te l'ha mandato Sogei un file .pfx da usare come certificato client?

    Ciao,
    Moreno

    mercoledì 16 maggio 2018 09:48
  • Grazie per il consiglio Moreno,

    ho provato a seguire il link che mi hai fornito e ho fatto le modifiche in base alla chiamata che devo fare.

    Quello che sto cercando di implementare è la trasmissione della fattura elettronica verso l'SdI.

    Quindi mi sono stati forniti i seguenti endpoint per i test di interoperabilità

    Endpoint: https://servizi.fatturapa.it/ricevi_file
    Endpoint di test: https://testservizi.fatturapa.it/ricevi_file

    Dato che avevo il problema comune "Could not establish trust relationship for the SSL/TLS secure channel with authority 'testservizi.fatturapa.it'." ho aperto una segnalazione spiegando che c'era qualcosa che non andava FORSE dal loro lato, perchè nonostante l'installazione dei certificati forniti da loro, da Chrome si vedeva chiaramente che la connessione non era sicura a causa di problemi di certificato.

    Oggi mi hanno risposto che "hanno risolto".

    Ora, sia con il codice che ho creato e sia con il custom binding fornito da Moreno, mi ritorna sempre il seguente errore

    ExceptionData: System.Collections.ListDictionaryInternal
    ExceptionMessage: Internal Error
    ExceptionStackTrace: 
    Server stack trace: 
       in System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
       in System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
       in System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
       in System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

    A questo punto credo chi il problema sia il file passato.

    Dalla documentazione mi pare di aver capito che il file deve essere uno ZIP contenente la fattura elettronica (o più di una). Tale archivio ZIP deve essere convertito in Base64Binary per essere passato al metodo RiceviFile del WS.

    Attualmente io mi leggo il contenuto del file ZIP, lo converto tramite il metodo

    Convert.ToBase64String(filebytes, Base64FormattingOptions.InsertLineBreaks)


    e il risultato in ByteArray tramite il metodo

    Encoding.UTF8.GetBytes(encodedData);

    Quindi infine all'oggetto fileSdIBase_Type gli setto NomeFile con il nome file ZIP e poi la proprietà File con la conversione spiegata sopra.

    Avete qualche idea?

    P.S.: E' necessario firmare elettronicamente il file ZIP o la fattura elettronica che metto all'interno del file ZIP?

    Grazie mille e buon lavoro.

    In un modo o nell'altro combiniamo :)

    venerdì 25 maggio 2018 12:50
  • Ora, sia con il codice che ho creato e sia con il custom binding fornito da Moreno, mi ritorna sempre il seguente errore

    Ok, a parte il testo dell'eccezione, riesci a vedere il contenuto della risposta che ti sta restituendo il server? Cioè, qual è lo status code HTTP, le intestazioni e il testo della risposta? Lì dentro potrebbero esserci ulteriori informazioni utili a capire il problema. Se stai usando WCF, puoi loggare i messaggi SOAP tra client e server usando un IClientMessageInspector tipo questo, oppure abilitare il message tracing come vedi qui.

    Io a un certo punto ho abbandonato WCF perché stavo perdendo troppo tempo per capire come comporre precisamente la richiesta. Mi hanno mandato una richiesta SOAP di esempio e stavo faticando a riprodurla fedelmente. Neanche con SOAP UI sono riuscito, perché per esempio se metti degli a-capo nel BinarySecurityToken (previsto dalla specifica) qualcosa da loro si rompe. A forza di provare con gli encoder di WCF sono diventato scemo e non ho ottenuto il risultato voluto.

    Oggi mi hanno risposto che "hanno risolto".

    Spero che nel tuo caso sia vero perché davano risposte del tipo "Riprovi ora" anche a me ma il problema non era stato affatto risolto. Ora per fortuna il progetto del Portale delle Vendite Pubbliche è passato di mano e questi nuovi tecnici sono molto più "umani", alla mano e rispondono con competenza a stretto giro. Quindi col loro aiuto sono riuscito a risolvere in pochi giorni. 

    Dalla documentazione mi pare di aver capito che il file deve essere uno ZIP

    Per questo bisogna leggere accuratamente la documentazione. Puoi condividere il link al PDF? Io ho trovato questo e a pagina 9 scrivono: "Allegato contenente il file fatturaPA, ovvero il file archivio, convertito in base64Binary conforme allo schema xsd della FatturaPA1." La parola "archivio" è fraintendibile, non so se intendono proprio uno zip. Forse vogliono proprio il contenuto del file XML, dato che deve essere "conforme allo schema xsd". Boh.

    Quindi infine all'oggetto fileSdIBase_Type gli setto NomeFile con il nome file ZIP e poi la proprietà File con la conversione spiegata sopra.

    Mmmh… non credo che la conversione sia corretta. 1. Prova a non mettere i line break e 2. non devi fare GetBytes. Prova semplicemente con:

    var encodedData = Convert.ToBase64String(filebytes, Base64FormattingOptions.None)
    Il valore della variabile encodedData è quello che assegni alla proprietà file nella richiesta SOAP (presumo, bisognerebbe vedere che dice la documentazione).

    E' necessario firmare elettronicamente il file ZIP o la fattura elettronica che metto all'interno del file ZIP?

    Non ne ho idea, dev'essere scritto sulla documentazione.

    Hai provato a fare queste domande anche su forum.italia.it? Lì ci sono persone che ti sanno rispondere. Il progetto FatturaPA è sotto l'ala del Team Digitale, quindi penso che qualcuno in grado di fornirti risposte corrette lo trovi.

    https://forum.italia.it/c/fattura-pa


    ciao,
    Moreno


    P.S. L'editor di questo forum pare uscito dal 1997.
    sabato 26 maggio 2018 12:48
  • P.S.: E' necessario firmare elettronicamente il file ZIP o la fattura elettronica che metto all'interno del file ZIP?

    in base alle specifiche ho letto che devono essere firmati tutti i file contenuto nel file zip

    mentre l'archivio .zip non deve essere firmato

    venerdì 1 giugno 2018 09:56
  • Buongiorno Bruno,

    hai risolto?

    io sono fermo da un mese sull'errore: Impossibile stabilire un canale sicuro per SSL/TLS con l'autorità 'testservizi.fatturapa.it'.

    da browser il ws risponde correttamente, da codice no.

    posto il codice completo utilizzato, se mi date una mano a capire dove sbaglio ve ne sono grato:

            private void button4_Click(object sender, EventArgs e)
            {
                FatturaPA_SdIRiceviFile.SdIRiceviFileClient srv = new FatturaPA_SdIRiceviFile.SdIRiceviFileClient();
                FatturaPA_SdIRiceviFile.RiceviFileRequest srvReq = new FatturaPA_SdIRiceviFile.RiceviFileRequest();
                FatturaPA_SdIRiceviFile.RiceviFileResponse srvResp = new FatturaPA_SdIRiceviFile.RiceviFileResponse();
    
                var binding = CreateMultiFactorAuthenticationBinding();
    
    
                ServicePointManager.ServerCertificateValidationCallback = ValidationCallBack;
    
                var certificate = new X509Certificate2("C:\\Users\\fabio\\Desktop\\client_SDI-[PIVA].pfx");
                var address = new EndpointAddress(new Uri("https://testservizi.fatturapa.it/ricevi_file")); 
    
                var factory = new ChannelFactory<FatturaPA_SdIRiceviFile.SdIRiceviFileChannel>(binding, address);
                factory.Credentials.ClientCertificate.Certificate = certificate;
                factory.Endpoint.Contract.ProtectionLevel = ProtectionLevel.Sign;
                factory.Credentials.ServiceCertificate.DefaultCertificate = new X509Certificate2("C:\\Users\\fabio\\Desktop\\testservizi.fatturapa.it.cer");
                factory.Credentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication
                {
                    CertificateValidationMode = X509CertificateValidationMode.None,
                    RevocationMode = X509RevocationMode.NoCheck
                };
    
                var channel = factory.CreateChannel();
                try
                {
                    srvReq.fileSdIAccoglienza = new FatturaPA_SdIRiceviFile.fileSdIBase_Type();
    
                    byte[] f = System.IO.File.ReadAllBytes("C:\\Users\\fabio\\Desktop\\IT[PIVA]_00895.zip");
                    byte[] x = Convert.FromBase64String(Convert.ToBase64String(f, 0, f.Length));
                    srvReq.fileSdIAccoglienza.File = x;
                    srvReq.fileSdIAccoglienza.NomeFile = "IT[PIVA]_00895.zip";
    
                    srvResp = channel.RiceviFile(srvReq);
                }
                catch (Exception exc)
                {
                    Console.WriteLine(exc.ToString());
                }
    
    
                Console.ReadLine();
            }
    
    
            public static System.ServiceModel.Channels.Binding CreateMultiFactorAuthenticationBinding()
            {
                System.ServiceModel.Channels.AsymmetricSecurityBindingElement asbe = new AsymmetricSecurityBindingElement();
    
                asbe.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10;
                asbe.InitiatorTokenParameters = new X509SecurityTokenParameters();
                asbe.RecipientTokenParameters = new X509SecurityTokenParameters();
                asbe.ProtectTokens = true;
                asbe.MessageProtectionOrder = MessageProtectionOrder.SignBeforeEncrypt;
    
                asbe.SecurityHeaderLayout = SecurityHeaderLayout.Strict;
                asbe.EnableUnsecuredResponse = true;
                asbe.IncludeTimestamp = false;
                asbe.SetKeyDerivation(false);
                asbe.DefaultAlgorithmSuite = SecurityAlgorithmSuite.Basic128Rsa15;
    
                CustomBinding myBinding = new CustomBinding();
                myBinding.Elements.Add(asbe);
                myBinding.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap12, Encoding.UTF8));
    
                HttpsTransportBindingElement httpsBindingElement = new HttpsTransportBindingElement();
                httpsBindingElement.RequireClientCertificate = true;
                myBinding.Elements.Add(httpsBindingElement);
                
    
                return myBinding;
            }
    
    

    Grazie.
    Ciao.


    martedì 3 luglio 2018 08:17
  • Fabio, dovresti impostare il protocollo TLS 1.2 altrimenti non potrà essere stabilito un collegamento sicuro con il server. Sul browser funziona perché usa tale protocollo, da codice no perché probabilmente il framework preimposta TLS 1.0 o 1.1.

    Prova a mettere questa riga di codice subito dopo aver impostato la ValidationCallback

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

    Ecco un problema simile.

    http://forum.aspitalia.com/forum/post/419294/Download-File-Remoto.aspx?PageIndex=1

    martedì 3 luglio 2018 19:42
  • Grazie Moreno,

    adesso mi da un "InternalError" senza alcun dettaglio / codice errore,

    credo sia lo stesso postato sopra da bruno.piccinin.

    il file fattura contenuto nel file zip è corretto perchè è una fattura reale inviata ad una pa.

    credi sia un problema lato server da segnalare a sogei?

    Grazie.

    giovedì 5 luglio 2018 07:58
  • Ok Fabio, questo vuol dire che vieni autenticato correttamente dal servizio di Sogei. Adesso hai quell'errore perché la tua richiesta SOAP non è valida, o nel corpo o più probabilmente nella header.

    Io ho sbattuto MESI su questo problema, perché Sogei NON restituisce una FaultException contenente i dettagli del problem ma si limita a dare un fastidiosissimo errore 500 generico che non ti lascia capire cosa stai sbagliando.
    Auguri, perché ottenere un'assistenza significativa da Sogei è sempre un terno al lotto. Fagli questa sola domanda semplice: chiedi di avere un "esempio di busta SOAP corretta", così che tu possa vedere come è fatta una richiesta SOAP valida e poi lavorare per rendere la tua uguale in tutte le sue parti.

    Io ho lavorato al servizio del Portale delle Vendite Pubbliche, e non a FatturaPA, quindi non ti so aiutare per questo caso specifico. Comunque, ti condivido una richiesta SOAP valida per il Portale delle Vendite. Almeno la header dovrebbe essere simile se non uguale nelle sue parti costituenti e penso sia quella che stai sbagliando.

    https://gist.github.com/BrightSoul/4a258725c8a0e3b580ed0ba7cf20c2cc

    Io avevo iniziato a fare il client con lo stack di WCF ma ad un certo punto mi sono arreso perché non riuscivo a ricreare la richiesta come la volevano loro. Neanche con SOAP UI sono riuscito. Non dico che sia impossibile farlo con WCF, sia chiaro, ma il tempo richiesto per configurarlo a puntino è indeterminabile. Io, data la frustrazione, ho preferito costruire la richiesta SOAP a mano come un amanuense, altrimenti non potevo dare garanzia di riuscita al cliente che continuava a pressarmi.

    Per citare uno dei problemi: la specifica prevede che la signature del messaggio (che è una lunga serie di caratteri base64) possa essere rappresentata su più righe per facilitarne la leggibilità. Questa cosa non è gradita a Sogei, che la vuole tutta su una riga. Per questo motivo mi falliva anche la richiesta con SOAP UI.

    A meno che qualche altro sviluppatore non ti condivida il suo codice già funzionante, io ti consiglio di prendere il toro per le corna e studiare come deve essere generata la header del messaggio SOAP. Studia in particolar modo come funziona la canonicalizzazione del corpo, che è poi la base per il calcolo della signature.

    Qui alcuni link utili.

    https://www.di-mgt.com.au/xmldsig-c14n.html
    https://www.w3.org/TR/xmldsig-core1/#sec-Overview

    Per prima cosa, io ti consiglio di andare a chiedere qui, dove è più probabile che trovi sviluppatori che si siano già scontrati con il problema. Se sei fortunato, magari ti mandano codice funzionante.

    https://forum.italia.it/

    ciao,
    Moreno

    giovedì 5 luglio 2018 09:07
  • Grazie per la disponibilità.

    Ciao.


    giovedì 5 luglio 2018 09:25
  • Ho visto dopo aver postato la lunghezza del Thread, e vedo che il problema è comune. consiglio ugualmente a tutti, se non lo avete già fatto senza risultati, di provare a usare il POSTMAN per testare come autenticarvi e come farvi rispondere dal servizio per poi traslare il necessario sul vostro codice.


    https://www.getpostman.com/

    Questo programma è fatto per testare i servizi REST e io lo trovo comodissimo quando devo lavorarvi e chiamare servizi da .NET infatti, Postman ti permette di fare le chiamate al servizio REST ed ha ogni tipo di configurazione per creare POST, GET e passare il necessario x l'autenticazione ed i parametri ai metodi.

    Una volta che sei riuscito ad eseguire il login con Postman è molto facile capire come traslare il necessario sull'HTTP client di .Net

    Saluti


    Sabrina C. - http://www.dotnetwork.it


    • Modificato Sabrina C._MVP giovedì 5 luglio 2018 12:45 Modifica e premessa
    giovedì 5 luglio 2018 12:41
  • Ciao Moreno,

    ecco la gentile risposta di SOGEI alla richiesta di un messaggio SOAP corretto:

    in merito alla Sua richiesta La invitiamo a verificare che la chiamata SOAP implementata sia corretta secondo le specifiche tecniche del servizio SDICoop. Sogei non può fornire alcun tipo di assistenza, né correggere le chiamate SOAP effettuate utilizzando client di terze parti.

    lunedì 9 luglio 2018 09:13
  • Ok, è valso un tentativo.
    Vedi se per caso hanno messo un esempio di richiesta SOAP nella documentazione PDF.

    In mancanza di altri aiuti dovrai procedere da solo, purtroppo, così come è toccato a me.

    • Installa e apri Fiddler, poi invia la tua richiesta con WCF. Vedrai passare il corpo integrale della richiesta SOAP. Copialo e incollalo in un file di testo in modo da avercelo sempre a portata di mano;
    • Installa e apri SOAP UI. Importa il WSDL del loro servizio e così potrai vedere quali operazioni ci sono all'interno. Nell'operazione che ti interessa, incolla la richiesta SOAP che avevi catturato con Fiddler ma della soap:Header svuota tutto il contenuto e mantieni solo il nodo <soap:Header />
    • Configura la WS-Security con SOAP UI come vedi qui: https://www.soapui.org/soapui-projects/ws-security.html
    • Ora prova ad inviare la richiesta e facci sapere se ha successo o no (presumo di no, ma poi ti darò altre istruzioni)
    lunedì 9 luglio 2018 12:25
  • Ciao Moreno,

    senza contenuto Header, il file è stato ricevuto.

    con Header mi ritorna l'errore:

    500 Internal Server Error
    
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
       <soapenv:Body>
          <soapenv:Fault xmlns:axis2ns1="http://schemas.xmlsoap.org/soap/envelope/">
             <faultcode>axis2ns1:Server</faultcode>
             <faultstring>Internal Error</faultstring>
             <detail/>
          </soapenv:Fault>
       </soapenv:Body>
    </soapenv:Envelope>


    lunedì 9 luglio 2018 21:06

  • senza contenuto Header, il file è stato ricevuto.

    Ok, bene, quindi confermi che sei riuscito a inviare correttamente la richiesta con SOAP UI?
    Tieni presente che quando hai lasciato il tag header vuoto così: <soap:Header />, in realtà SOAP UI l'ha riempito per te. Lo puoi verificare cliccando la linguetta "Raw" che si trova in alto a sinistra nel Request Editor.

    Confermi che il soap:Header è stato riempito da SOAP UI?

    martedì 10 luglio 2018 07:17
  • No, rimane vuoto.
    martedì 10 luglio 2018 11:14
  • Quindi Sogei sta accettando la tua richiesta anche senza soap:Header?
    martedì 10 luglio 2018 11:38
  • non riesco a postare immagini, come faccio a verificare l'account?

    ho impostato il certificato in SOAP ui preferences - SSL settings,

    puoò dipendere da questo?

    martedì 10 luglio 2018 12:22
  • adesso ho fatto la configurazione come indicato da te in un link precedente,

    adesso in header mi aggiunge questo:

    <s:Header><wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"/></s:Header>

    e il file non viene inviato

    html><head>
    <title>403 Forbidden</title>
    </head><body>
    <h1>Forbidden</h1>
    <p>You don't have permission to access /SdI2AccoglienzaWeb/SdIRiceviFile_service
    on this server.</p>
    </body></html>


    martedì 10 luglio 2018 12:40
  • ho impostato il certificato in SOAP ui preferences - SSL settings,

    Non è sufficiente perché il certificato client va anche usato per firmare digitalmente la richiesta SOAP con WS-Security. Quindi fai anche questo:

    • In SOAP UI, dal menu ad albero a sinistra, fai tasto destro sulla cartellina del tuo progetto e clicca "Show Project View";
    • Vai nella tab "WS-Security Configurations";
    • Vai nella sottotab "KeyStores" e aggiungi il tuo file .pfx contenente chiave pubblica e privata del certificato client. Metti la password quando richiesto;
    • Sempre nella tab "WS-Security Configurations", vai nella sottotab "Outgoing WS-Security Configurations", clicca il + e metti un nome a caso, tipo "outgoing". Clicca l'altro + che si trova subito sotto e scegli signature. configuralo come vedi in questa immagine. Il namespace del body non si legge ma è http://schemas.xmlsoap.org/soap/envelope/

    • A questo punto chiudi e torna nel menu ad albero a sinistra. Fai tasto destro sulla richiesta e clicca "Show Request Editor"
    • Clicca la tab "Auth" che si trova nella parte bassa a sinistra della finestra;
    • Scegli "Basic". Lascia tutti i campi vuoti, tranne "Outgoing WSS" che va compilato con "outgoing" (o altro nome che avevi scelto prima.
    • Premi il tasto Play verde nella parte alta della finestra per inviare la richiesta. Che risultato ottieni?


    martedì 10 luglio 2018 13:24
  • non riesco a postare immagini, come faccio a verificare l'account?


    Non ne ho idea.

    Ti ho risposto con i passi dettagliati ma il mio commento è finito sopra alla tua ultima risposta.

    martedì 10 luglio 2018 13:26
  • perdonami, che password devo mettere?

    il certificato non ha password.

    martedì 10 luglio 2018 13:28
  • il certificato non ha password.

    Allora nessuna password. Sei sicuro che il pfx contenga sia la chiave pubblica che quella privata? Di solito quando contiene una chiave privata, viene protetta con password ma non obbligatoriamente.
    martedì 10 luglio 2018 13:35
  • niente da fare.

    invia solo se il certificato lo metto nelle preferenze generali

    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>403 Forbidden</title>
    </head><body>
    <h1>Forbidden</h1>
    <p>You don't have permission to access /SdI2AccoglienzaWeb/SdIRiceviFile_service
    on this server.</p>
    </body></html>

    martedì 10 luglio 2018 14:28
  • niente da fare.

    invia solo se il certificato lo metto nelle preferenze generali

    E' corretto che sia nelle preferenze generali. In quel punto serve per la mutua autenticazione con il server a livello di trasporto. Poi, però, il certificato serve anche per firmare digitalmente il corpo SOAP e per questo abbiamo configurato WS-Security con i passi che ti ho riportato prima.

    Puoi postare il contenuto della <soap:Header>? Ora dovrebbe essere molto più grosso di prima. Copialo dalla linguetta Raw di SOAP UI.



    martedì 10 luglio 2018 15:27
  • POST https://testservizi.fatturapa.it:443/SdI2AccoglienzaWeb/SdIRiceviFile_service HTTP/1.1
    Accept-Encoding: gzip,deflate
    Content-Type: multipart/related; type="application/xop+xml"; start="<rootpart@soapui.org>"; start-info="text/xml"; boundary="----=_Part_0_1503076.1531237531280"
    SOAPAction: "http://www.fatturapa.it/SdIRiceviFile/RiceviFile"
    MIME-Version: 1.0
    Content-Length: 4283
    Host: testservizi.fatturapa.it:443
    Connection: Keep-Alive
    User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
    
    
    ------=_Part_0_1503076.1531237531280
    Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"
    Content-Transfer-Encoding: 8bit
    Content-ID: <rootpart@soapui.org>
    
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    	<s:Header><wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"/>
    	</s:Header>
    	<s:Body u:Id="_1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    		<fileSdIAccoglienza xmlns="http://www.fatturapa.gov.it/sdi/ws/trasmissione/v1.0/types">
    			<NomeFile xmlns="">IT02627890839_00895.zip</NomeFile>
    			<File xmlns=""><inc:Include href="cid:http://www.soapui.org/762110363997025" xmlns:inc="http://www.w3.org/2004/08/xop/include"/></File>
    		</fileSdIAccoglienza>
    	</s:Body>
    </s:Envelope>
    

    cosi trasmette, nell'header non vedo certificati, ma ho di nuovo inserito il certificato nelle preferenze generali

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
       <soapenv:Body>
          <ns2:rispostaSdIRiceviFile xmlns:ns2="http://www.fatturapa.gov.it/sdi/ws/trasmissione/v1.0/types">
             <IdentificativoSdI>1274692</IdentificativoSdI>
             <DataOraRicezione>2018-07-10T17:45:32.350+02:00</DataOraRicezione>
          </ns2:rispostaSdIRiceviFile>
       </soapenv:Body>
    </soapenv:Envelope>

    martedì 10 luglio 2018 15:51
  • Ok, quindi se sei riuscito a mandare il file si può dire che il problema è risolto?
    Puoi tornare su C# e provare a mandare la stessa richiesta con HttpClient (in caso non si trovasse il modo di farlo con WCF).

    martedì 10 luglio 2018 18:15
  • Ciao Moreno, e anche agli altri che hanno problemi con l'autenticazione al Webservice.

    Ieri ho parlato di questo post con un collega che mi ha detto che sa quanto sia complicato fare questo aggancio ai webservice Sogei, e mi ha detto che conosce una persona che ha realizzato un software che li usa ed ha risolto il problema.

    Ho chiesto se fosse possibile chiedergli una mano e la persona si è resa disponibile. Pertanto chiunque di voi voglia che vi metta in contatto vada cortesemente sul mio Blog ed usi il modulo di contatto per mandarmi un messaggio ed io vi do modo di contattare questa persona. Scusate se non pubblico direttamente qui per ovvi problemi di SPAM.

    il mio blog lo trovate all'indirizzo:

    www.sabrinacosolo.com

    usate la Bustina, e vi ricontatto appena leggo il vostro messaggio.

    saluti


    Sabrina C. - http://www.dotnetwork.it

    mercoledì 11 luglio 2018 12:52
  • Link a un progetto GitHub dimostrativo, per cortesia, così che si possa diffondere anche su developers.italia.it e in modo che sia di beneficio a chiunque ne abbia bisogno.
    mercoledì 11 luglio 2018 18:38
  • Di questo devi parlare con la persona non con me se mi dai modo di mettervi in contatto poi vi accordate sul da farsi.

    Scusa ma al momento sono solo un "tramite"

    Saluti


    Sabrina C. - http://www.dotnetwork.it

    giovedì 12 luglio 2018 09:02