Collegamento ai WS e certificati

Ciao, sono nella stessa vostra situazione. Ottengo “Internal Error” quando invoco il servizio con: srvResponse = channel.RiceviFile(srvRequest);
Per caso qualcuno ha risolto?

Dall’assistenza dicono di controllore le specifiche SOAP. Ma sembra tutto corretto.

Grazie in anticipo.

usi c# vedo.

Come fai la chiamata?

Si uso c#.
La chiamata la faccio con lo stesso codice già postato su questo forum.

EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity(“servizi.fatturapa.it”);
var address = new EndpointAddress(new Uri(“https://servizi.fatturapa.it/ricevi_file”), identity);

        var binding = Utils.CreateMultiFactorAuthenticationBinding();
        //ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        ServicePointManager.ServerCertificateValidationCallback = Utils.ValidateCallback;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

        var factory = new ChannelFactory<SdIRiceviFileChannel>(binding, address);
        var certificate = new X509Certificate2(@"Y:\FatturaPA B2C B2B\Test\certs\SDI-03702470927-client.pfx", "Idpostbox18!");
        factory.Credentials.ClientCertificate.Certificate = certificate;
        factory.Endpoint.Contract.ProtectionLevel = ProtectionLevel.Sign;
        factory.Credentials.ServiceCertificate.DefaultCertificate = new X509Certificate2(@"Y:\FatturaPA B2C B2B\Test\certs\servizi.fatturapa.it.cer");
        factory.Credentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication
        {
            CertificateValidationMode = X509CertificateValidationMode.None,
            RevocationMode = X509RevocationMode.NoCheck
        };
        var channel = factory.CreateChannel();
        
        srvRequest.fileSdIAccoglienza = new fileSdIBase_Type();
        srvRequest.fileSdIAccoglienza.File = x;
        srvRequest.fileSdIAccoglienza.NomeFile = valueOfFile;
        
        srvResponse = channel.RiceviFile(srvRequest);

Ci sono diversi problemi:

  1. il binding deve essere così:

System.ServiceModel.BasicHttpBinding newBind = new System.ServiceModel.BasicHttpBinding();
newBind.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.Transport;
newBind.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Certificate;
newBind.MessageEncoding = System.ServiceModel.WSMessageEncoding.Mtom;

  1. crei il client così:

SDI.RiceviFile.SdIRiceviFileClient sdiws = new SDI.RiceviFile.SdIRiceviFileClient(newBind, endpoint);

  1. i security protocols sono questi
    System.Net.ServicePointManager.SecurityProtocol = (System.Net.SecurityProtocolType)3072;

  2. il certificato va inserito così:
    var ccert = new System.Security.Cryptography.X509Certificates.X509Certificate2(certPath, “psw”);
    sdiws.ClientCredentials.ClientCertificate.Certificate = ccert;

Bonus:

poi ti crei le classi per la chiamata

SDI.RiceviFile.RiceviFileRequest sdirequest = new SDI.RiceviFile.RiceviFileRequest();
[Popoli il tutto (ricordati del base64)]
SDI.RiceviFile.rispostaSdIRiceviFile_Type sdiresponse = new SDI.RiceviFile.rispostaSdIRiceviFile_Type();
sdiresponse = sdiws.RiceviFile(sdirequest.fileSdIAccoglienza);
[Verifiche la risposta]

Spero ti sia utile.

Ciao Riccardo , il tuo consiglio è stato molto utile. Ho capito alcuni dubbi che avevo sulla creazione del binding e del client. Però quando invio la chiamata al ws SdiriceviFile mi da sempre lo stesso errore “Internal Error”. Ora mi sbatto un po’ sul codice e faccio debug sulla creazione della classe per vedere se capisco dove sto sbagliando.

Grazie.

figurati

tutti il resto che hai messo va tolto (tranne la callback per la validazione ssl che deve tornare sempre true).

solo le righe che ti ho messo vanno lasciate

questo è il codice di test che ho usato per l’accreditamento.

Copialo, prova e fammi sapere.

1 Mi Piace

Il codice che hai incollato è uguale al mio adesso. Però stesso errore “Internal Error”.
La callback per la validazione ritorna sempre true.
Ho provato anche a copiarlo uguale però sempre stesso errore.

quale file carichi?
lo firmi?
come lo firmi?

Sto caricando il file archivio ( .zip) contenente file fattura con codice destinatario rilasciato in fasce di accreditamento. Xml firmato con Cades.

nessuno zip
le fatture vanno in xml puro firmato in cades bes

quindi xml=>xml.p7m

invia quello

no zip

Buongiorno a tutti,
Qualcuno utilizzando .NET e client WCF per connettersi all’SDI, chiamando il Web-Service “RiceviFile” ha avuto a che fare con questo errore?:
“MTOM messages must have type 'application/xop+xml”

Ho già impostato il messageEncoding=“Mtom” non capisco dosa faccia fallire la chiamata

Buongiorno Riccardo, ho provato anche l’invio delle fatture in formato xml => xml.p7m però mi da ancora lo stesso errore generico.

Scusate la domanda, ma se accridito un canale sdiCoop , poi per far inviare le fatture dai miei clienti dovrò comunque farle firmare(o firmarle io)?

buongiorno,
sto cercando di accreditarmi sul canale SDI tramite un programma sviluppato in vb.net, ho ricevuto i certificati, li ho installati e da questo punto di vista sembra tutto OK.
ho creato un collegamento tramite “servizio WEB” al WS di SDI “RiceviFile” mi ha scaricato il wsdl e generato il codice vb.
passo tutti i parametri richiesti: Url, certificato, file, etc… ma al momento della chiamata del metodo “Ricevifile” ottengo un errore Soap “internal error”.
ho provato a scrivere il tuo codice ma all’istruzione (… sdiws = new sdi.ricevifile.sdiricevifileclient(newbind,endpoint) mi dice che devo indicare una interfaccia (che non saprei come creare per questo uso).
spero tanto in un aiuto perchè ho trovato tanto materiale ma molto frammentato e questo non mi ha fatto capire dove potrei sbagliare.
grazie
saluti

Ciao Giulio, mi trovo dopo qualche mese nella tua identica situazione. Dopo aver configurato i certificati (così: Accreditamento SDICoop: configurazione SSL su Apache ), non mi da più l’errore

javax.net.ssl.SSLHandshakeException: General SSLEngine problem

ma mi dà l’errore

org.apache.axis2.AxisFault: HTTP ( 500 ) Internal Server Error address : https://26.2.162.231:80

Francamente non capisco se è ancora un problema di certificati (ma diverso) o se è un problema di come ho programmato i web service. Il mio ambiente è lamp. Tu come avevi risolto?

Mi auto-rispondo perchè può essere utile a tutti. Era un problema del mio file php “server”: stavo usando una versione modificata della prima versione del file trasmissione-fatture.php della Simevo. L’ho sostituito con questo file:

E ho finalmente visto la mia prima spunta verde :star_struck:

Mi accodo alla lunga serie di colleghi che mormorano “senza questo forum ci riuscivo fra mille anni” :grin: anche se ho un po’ di lavoro ancora da fare…

Ciao Riccardo,

io ho installato correttamente i certificati e comunico correttamente con lo SDI. Il mio problema è al momento della risposta .
Visualizzando il tuo codice ho notato che hai “SdITrasmissioneFileClient”.
Potresti dirmi come hai fatto creare questo client, poichè generando la referenza al servizio dal file asmx dato da loro non riesco a generarlo.

Grazie

Ciao a tutti, ho iniziato a fare i test di interoperabilità con codice .net con ws wcf (vb.net per l’esattezza) e sono fermo al dannato messaggio “Internal Error” tra l’altro dato da una FaultException con nel FaultCode l’indicazione che l’errore sarebbe lato loro:
Code.IsPredefinedFault=True
Code.IsReceiverFault=True
Code.IsSenderFault=False

Ho provato sia con il binding standard (con il codice di @G1zm0) sia con il codice consigliato da @davidehow.

Scrivo qui di seguito la conversione in vb.net

Private Function GetSdiRiceviNotificaClient() As SDIRiceviNotificaService.SdIRiceviNotifica
    Dim myAddress = New EndpointAddress(If(IsTest, "https://testservizi.fatturapa.it/ricevi_notifica", "https://servizi.fatturapa.it/ricevi_notifica"))
    Dim myBinding = CreateMultiFactorAuthenticationBinding()

    Dim myFactory = New ChannelFactory(Of SDIRiceviNotificaService.SdIRiceviNotifica)(myBinding, myAddress)

    myFactory.Credentials.ClientCertificate.Certificate = New X509Certificate2(Commons.ClientCertPath, Commons.ClientCertPassword)
    'myFactory.Credentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByThumbprint, Commons.SDIClientThumbprint)

    myFactory.Endpoint.Contract.ProtectionLevel = Security.ProtectionLevel.Sign
    myFactory.Credentials.ServiceCertificate.SetDefaultCertificate(StoreLocation.LocalMachine, StoreName.Root, X509FindType.FindByThumbprint, If(IsTest, Commons.SDITestServiziFatturaIt, Commons.SDIServiziFatturaIt))
    myFactory.Credentials.ServiceCertificate.SslCertificateAuthentication = New X509ServiceCertificateAuthentication()
    myFactory.Credentials.ServiceCertificate.SslCertificateAuthentication.CertificateValidationMode = X509CertificateValidationMode.None
    myFactory.Credentials.ServiceCertificate.SslCertificateAuthentication.RevocationMode = X509RevocationMode.NoCheck

    Dim myChannel = myFactory.CreateChannel

    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
    System.Net.ServicePointManager.ServerCertificateValidationCallback = AddressOf AcceptAllCertifications

    Return myChannel
End Function
Private Function CreateMultiFactorAuthenticationBinding() As Binding
    Dim asbe = New AsymmetricSecurityBindingElement
    asbe.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10

    asbe.InitiatorTokenParameters = New X509SecurityTokenParameters
    asbe.RecipientTokenParameters = New X509SecurityTokenParameters
    asbe.ProtectTokens = True
    asbe.MessageProtectionOrder = ServiceModel.Security.MessageProtectionOrder.SignBeforeEncrypt

    asbe.SecurityHeaderLayout = SecurityHeaderLayout.Strict
    asbe.EnableUnsecuredResponse = True
    asbe.IncludeTimestamp = False
    asbe.SetKeyDerivation(False)
    asbe.DefaultAlgorithmSuite = SecurityAlgorithmSuite.Basic128Rsa15

    Dim myBinding = New CustomBinding
    myBinding.Elements.Add(asbe)
    myBinding.Elements.Add(New MtomMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8))
    'myBinding.Elements.Add(New TextMessageEncodingBindingElement(MessageVersion.Soap12, Encoding.UTF8))

    Dim httpsBindingElement = New HttpsTransportBindingElement()
    httpsBindingElement.RequireClientCertificate = True
    myBinding.Elements.Add(httpsBindingElement)

    Return myBinding
End Function
Private Function AcceptAllCertifications(ByVal sender As Object, ByVal certification As System.Security.Cryptography.X509Certificates.X509Certificate, ByVal chain As System.Security.Cryptography.X509Certificates.X509Chain, ByVal sslPolicyErrors As System.Net.Security.SslPolicyErrors) As Boolean
    Return True
End Function 

Ho solo modificato il TextMessageEncoding con il MtomMessageEncoding visto che dovrebbe essere il sistema da utilizzare.

A questo punto non so più come fare, può essere qualche problema lato loro? Come mi posso muovere?

Buongiorno a tutti.
Mi unisco alla conversazione. Stiamo cercando di completare l’accreditamento.
Siamo in fase di test. Inviamo le fatture regolarmente in ambiante ASP.NET IIS. Il nostro endpoint di ricezione notifiche è un ws asmx.

Il problema è nella ricezione delle notifiche.:

  • Ho installato i certificati, richiamando il certificando nel binding su IIS
  • Ho attivato il require SSL su Accept ma ho provato anche le altre opzioni
  • Ho configurato il registro su manyToOne
  • Nei vari trace sul server vedo le chiamate dello SDI sul mio endpoint
  • Da browser il mio endpoint mi richiede il certificato

Purtroppo però ricevo sempre l’errore:
org.apache.axis2.AxisFault: HTTP ( 500 ) Internal Server Error address : https://26.2.162.231:80

Sapete se dalla dinamica descritta il problema è sui certificati o sul webservice che espongo? Ho letto vari post sul webservice e su MTOM. Ma non sono sicuro ancora di aver superato il problema certificati.

Ringrazio in anticipo per la collaborazione. Sono anche a disposizione per condividere le procedure che ho superato con successo se a qualcuno possono server.

Ciao Fabio,
Volevo chiederti come fai a crearti il client "SdIRiceviFileClient ". Ho provato con svcutil come ad esempio

svcutil SdIRiceviFile_v1.0.wsdl TrasmissioneTypes_v1.0.xsd /language:C# /serviceContract /out:IRiceviFile.cs

ma non mi crea mai il client.

Puoi darmi una dritta?
Grazie