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