Con più domande
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?
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); }
-
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?
-
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
-
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?
-
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 ?
-
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
-
-
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
- Modificato Moreno Gentili domenica 13 maggio 2018 12:36
-
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.
-
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
- Modificato Moreno Gentili lunedì 14 maggio 2018 17:30
-
-
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?
-
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
-
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 -
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_fileDato 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 :)
-
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.- Modificato Moreno Gentili sabato 26 maggio 2018 12:49
-
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 zipmentre l'archivio .zip non deve essere firmato
-
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.
-
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
-
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.
-
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-OverviewPer 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.
ciao,
Moreno -
-
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
-
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.
-
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)
-
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>
- Modificato Fabio.Damico 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?
-
-
-
-
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>- Modificato Fabio.Damico martedì 10 luglio 2018 12:54
-
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?
- Modificato Moreno Gentili martedì 10 luglio 2018 13:34
-
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.
- Modificato Moreno Gentili martedì 10 luglio 2018 13:29
-
-
il certificato non ha password.
- Modificato Moreno Gentili 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>
-
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.
- Modificato Moreno Gentili martedì 10 luglio 2018 15:28
-
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>
-
-
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:
usate la Bustina, e vi ricontatto appena leggo il vostro messaggio.
Sabrina C. - http://www.dotnetwork.it
-
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.
- Modificato Moreno Gentili mercoledì 11 luglio 2018 18:40
-
-
Ciao a tutti, sto tentando anche io di sviluppare un servizio per la trasmissione delle fatture elettroniche. Sono ancora all'inizio e sto cercando di capire quali sono i passi da seguire.
Prima di tutto vorrei ottenere i certificati; da quello che ho capito per ottenerli bisogna accreditarsi all'indirizzo http://sdi.fatturapa.it/SdI2FatturaPAWeb/AccediAlServizioAction.do?pagina=accreditamento_canale_ws. Ho visto che nella procedura di registrazione vengono richiesti gli endpoint, si tratta degli ufficiali endpoint del servizio che dovrei sviluppare? Significa che devo stabilirli e comunicarli subito? ...anche se il web service non è ancora pronto?
Ho letto tutta la discussione ed ho capito che, dopo aver ottenuto i certificati, i problemi non finiscono; volevo solamente sapere se c'è qualcuno che sia riuscito a risolvere i problemi riportati e se disponibile a condividere del codice di esempio correttamente funzionante.
Grazie in anticipo per ogni informazione utile in merito.
- Modificato Luca Petrini giovedì 2 agosto 2018 13:34
-
Mi rispondo da solo...per gli endpoint ho capito che bisogna comunicare quelli ufficiali e fin lì ci sono; a questo punto però nella procedura di accreditamento vengono richieste le csr e li mi sono bloccato.
I miei dubbi sono:
- Devo semplicemente inviare il file csr che genero con il comando openssl? Perché nella pagina c’è scritto che “Il Sistema di Interscambio accetta CSR in formato .der, .pem e .arm”, quindi immagino che devo eseguire dei passi
ulteriori.
- Nella pagina di accreditamento inoltre viene richiesto un certificato CSR client ed uno server, cosa si intende esattamente? Significa che devo generare due CSR distinti?
Scusate le domande un po’ banali, ma non sono molto ferrato in ambito sistemistico ed avrei bisogno di qualche chiarimento.
Vi ringrazio in anticipo per ogni informazione utile a riguardo.
- Modificato Luca Petrini venerdì 3 agosto 2018 09:31
- Devo semplicemente inviare il file csr che genero con il comando openssl? Perché nella pagina c’è scritto che “Il Sistema di Interscambio accetta CSR in formato .der, .pem e .arm”, quindi immagino che devo eseguire dei passi
ulteriori.
-
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>
-