File xml Agenzia delle Entrate

di il
90 risposte

90 Risposte - Pagina 3

  • Re: File xml Agenzia delle Entrate

    A pagina 4 del pdf IstruzioniApiDispositivi.pdf ottenibile da qui:



    c'è uno schema xml simile in tutto e per tutto a quello che hai fornito tu come funzionante.

    Da qui si evince però che nel campo <csr>, dove per ottenere il certificato dispositivo AE approved, dovrà finirci un certificato generato al volo da una chiave privata di 2048 con nel CN l'IMEI o l'id generato secondo la regola 'AD' + PIVAgestore + indice.

    Il csr però deve essere in formato base64.

    Il metodo di trasformazione enveloped-signature da usare in questo caso non è altro che inserire tutta la parte di signature dentro lo xml la cui root è RichiestaCertificatoDispositivo.

    In oltre dalle specifiche https://www.w3.org/TR/xmldsig-core/#def-SignatureEnveloping di questo tipo di trasformazione si legge:
    Obviously, enveloped signatures must take care not to include their own value in the calculation of the SignatureValue.
    Che significa che bisogna fare firme, digest etc.. senza che la parte di Signature sia presente, poi una volta ottenuti i dati da inserire nei campi del blocco Signature, inserire questo blocco compilato all'interno della root RichiestaCertificatoDispositivo. Questa operazione è chiamata Canonicalization.

    Ancora però non ho capito bene come devo usare il certificato fabbricante con procedura apparte dall'AE, nè ho capito bene cosa devo inserire nella parte Signature, in particolare X509Certificate, SignatureValue, DigestValue.

    Anche se mi vien da pensare che in:
  • Re: File xml Agenzia delle Entrate

    Paolo64 ha scritto:


    Per il resto ho molti dubbi, e sono anch'io inchiodato a questo punto, in quanto la risposta di tutte le prove di invio che ho fatto è sempre: 406 xml non conforme
    Occhio che l'algoritmo di canocalizzazione la cui descrizione è descritta qui:

    https://www.w3.org/TR/2001/REC-xml-c14n-20010315#Examples

    prevede anche che lo xml sia formattato con spazi, tab, in una maniera precisa. Quindi se tu stai implementando questa procedura senza una libreria specifica stacci attento altrimenti il contenuto è completo e posizionato nei posti correttamente ma ci sono degli spazi in giro o la forma non è quella prevista dall'algoritmo di canocalizzazione che si deve usare.
  • Re: File xml Agenzia delle Entrate

    gine ha scritto:


    A pagina 4 del pdf IstruzioniApiDispositivi.pdf ottenibile da qui:



    c'è uno schema xml simile in tutto e per tutto a quello che hai fornito tu come funzionante.

    Da qui si evince però che nel campo <csr>, dove per ottenere il certificato dispositivo AE approved, dovrà finirci un certificato generato al volo da una chiave privata di 2048 con nel CN l'IMEI o l'id generato secondo la regola 'AD' + PIVAgestore + indice.

    Il csr però deve essere in formato base64.
    Una richiesta di certificato X509, generato con una chiave RSA a 2048 bit, che deve essere conservata per le future operazioni di firma con il certificato dispositivo.

    gine ha scritto:


    Il metodo di trasformazione enveloped-signature da usare in questo caso non è altro che inserire tutta la parte di signature dentro lo xml la cui root è RichiestaCertificatoDispositivo.

    In oltre dalle specifiche https://www.w3.org/TR/xmldsig-core/#def-SignatureEnveloping di questo tipo di trasformazione si legge:
    Obviously, enveloped signatures must take care not to include their own value in the calculation of the SignatureValue.
    Che significa che bisogna fare firme, digest etc.. senza che la parte di Signature sia presente, poi una volta ottenuti i dati da inserire nei campi del blocco Signature, inserire questo blocco compilato all'interno della root RichiestaCertificatoDispositivo. Questa operazione è chiamata Canonicalization.

    Ancora però non ho capito bene come devo usare il certificato fabbricante con procedura apparte dall'AE, nè ho capito bene cosa devo inserire nella parte Signature, in particolare X509Certificate, SignatureValue, DigestValue.

    Anche se mi vien da pensare che in:
    Come ho già scritto precedentemente io uso una libreria proprietaria che mi fa tutto il lavoro di firme/crittografia a basso livello senza sbattermi molto ( per quello che l'ho pagata è il minimo ).
    Io passo alla routine di firma il file xml da firmare ed il certificato e mi restituisce il file firmato.
    Ti confermo che il certificato X509 è il certificato produttore, gli altri dati, ribadisco, me li gestisce la libreria.
  • Re: File xml Agenzia delle Entrate

    Scusa, il certificato Fabbricante che mi viene dato dal sito dell'AE che formato e'?
  • Re: File xml Agenzia delle Entrate

    gine ha scritto:


    Scusa, il certificato Fabbricante che mi viene dato dal sito dell'AE che formato e'?
    E' DER, ci sono arrivato per caso. Non mi pare di averlo trovato scritto nella documentazione. In tutti gli altri casi usano PEM.
  • Re: File xml Agenzia delle Entrate

    I formati sono quelli.
    Possiamo certamente affermare che la documentazione è piuttosto scarna.
  • Re: File xml Agenzia delle Entrate

    gine ha scritto:


    Paolo64 ha scritto:


    Per il resto ho molti dubbi, e sono anch'io inchiodato a questo punto, in quanto la risposta di tutte le prove di invio che ho fatto è sempre: 406 xml non conforme
    Occhio che l'algoritmo di canocalizzazione la cui descrizione è descritta qui:

    https://www.w3.org/TR/2001/REC-xml-c14n-20010315#Examples

    prevede anche che lo xml sia formattato con spazi, tab, in una maniera precisa. Quindi se tu stai implementando questa procedura senza una libreria specifica stacci attento altrimenti il contenuto è completo e posizionato nei posti correttamente ma ci sono degli spazi in giro o la forma non è quella prevista dall'algoritmo di canocalizzazione che si deve usare.
    Gine ciao
    Grazie dell'info. Proverò a rivedere l'xml.
    Volevo chiederti: tu come fai a firmare il file ? Usi una libreria proprietaria come Jeremiah o usi altro ?
    Io sto provando con il codice Java di esempio che c'è in fondo sulla pagina: Utilizzare Api Rest
    Il codice è questo:
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.security.KeyStore;
    import java.security.PrivateKey;
    import java.security.Provider;
    import java.security.cert.X509Certificate;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Enumeration;
    import java.util.List;
    
    import javax.xml.crypto.dsig.CanonicalizationMethod;
    import javax.xml.crypto.dsig.DigestMethod;
    import javax.xml.crypto.dsig.Reference;
    import javax.xml.crypto.dsig.SignedInfo;
    import javax.xml.crypto.dsig.Transform;
    import javax.xml.crypto.dsig.XMLSignature;
    import javax.xml.crypto.dsig.XMLSignatureFactory;
    import javax.xml.crypto.dsig.dom.DOMSignContext;
    import javax.xml.crypto.dsig.keyinfo.KeyInfo;
    import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory;
    import javax.xml.crypto.dsig.keyinfo.X509Data;
    import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
    import javax.xml.crypto.dsig.spec.TransformParameterSpec;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    
    import org.w3c.dom.Document;
    public class Firma {
    		public static final String SHA256_RSA_SIGNATURE_ALGORITHM = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
    		public static void main(String[] args) {
    		// TODO Auto-generated method stub
    			try {
    				//originale=String p12file = "path_certificato_di_firma.p12";
    	            String p12file = "c:/Users/PAOLO2/Desktop/VendingMachine/certificato38380.pfx";
    	            String p12pass = "7264809992";
    	            
    	            //String infile = "path_file_da_firmare.xml";
    	            //String signedfile = "path_file_firmato.xml";
    	            String infile = "c:/Users/PAOLO2/Desktop/VendingMachine/RichiestaCertificatoDispositivo_img.xml";
    	            String signedfile = "c:/Users/PAOLO2/Desktop/VendingMachine/RichiestaCertificatoDispositivo_Firmato.xml";
    	               
    	            Provider provider = null;
    	            /*
    	            provider = xml.XMLUtils.getXmlDsigProvider();
    	            System.out.println("XML provider: " + provider);
    	            */
    
    	            X509Certificate signerCert = null;
    	            PrivateKey key = null;
    	            KeyStore ks = KeyStore.getInstance("PKCS12");
    	            ks.load(new FileInputStream(p12file), p12pass.toCharArray());
    	            Enumeration<String> en = ks.aliases();
    	            while (en.hasMoreElements()) {
    	                String alias = (String) en.nextElement();
    	                if (ks.isKeyEntry(alias)) {
    	                    signerCert = (X509Certificate) ks.getCertificate(alias);
    	                    key = (PrivateKey) ks.getKey(alias, p12pass.toCharArray());
    	                    break;
    	                }
    	            }
    
    	            if (signerCert == null || key == null) {
    	                throw new Exception("Key or Certificate not found!!");
    	            }
    
    	            // Create a DOM XMLSignatureFactory that will be used to generate the
    	            // enveloped signature
    	            XMLSignatureFactory fac;
    	            if (provider == null) {
    	                fac = XMLSignatureFactory.getInstance("DOM");
    	            } else {
    	                fac = XMLSignatureFactory.getInstance("DOM", provider);
    	            }
    
    	            // Create a Reference to the enveloped document (in this case we are
    	            // signing the whole document, so a URI of "" signifies that) and
    	            // also specify the SHA1 digest algorithm and the ENVELOPED Transform.
    	            Reference ref = fac.newReference(
    	            		"",
    	                    fac.newDigestMethod(DigestMethod.SHA256, null),
    	                    Collections.singletonList(fac.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null)),
    	                    null, 
    	                    null);
    
    	            // Create the SignedInfo
    	            SignedInfo si = fac.newSignedInfo(
    	                    fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, (C14NMethodParameterSpec) null),
    	                    fac.newSignatureMethod(SHA256_RSA_SIGNATURE_ALGORITHM, null),
    	                    Collections.singletonList(ref));
    
    	            KeyInfoFactory kif;
    	            if (provider == null) {
    	                kif = KeyInfoFactory.getInstance("DOM");
    	            } else {
    	                kif = KeyInfoFactory.getInstance("DOM", provider);
    	            }
    
    	            // Aggiunta del certificato del firmatario in KeyInfo
    	            List x509DataContent = new ArrayList();
    	            x509DataContent.add(signerCert);
    	            X509Data x509Data = kif.newX509Data(x509DataContent);
    	            List keyInfoContent = new ArrayList();
    	            keyInfoContent.add(x509Data);
    
    	            KeyInfo ki = kif.newKeyInfo(keyInfoContent);
    
    	            // Instantiate the document to be signed
    	            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    	            dbf.setNamespaceAware(true);
    	            dbf.setValidating(true);
    
    	            // default false
    	            // dbf.setIgnoringElementContentWhitespace(true);
    	            // default true
    	            // dbf.setExpandEntityReferences(false);
    	            Document doc = null;
    	            doc = dbf.newDocumentBuilder().parse(new FileInputStream(infile));
    
    	            // Create a DOMSignContext and specify the RSA PrivateKey and
    	            // location of the resulting XMLSignature's parent element
    	            DOMSignContext dsc = new DOMSignContext(key, doc.getDocumentElement());
    
    	            dsc.setProperty("javax.xml.crypto.dsig.cacheReference", Boolean.TRUE);
    	            dsc.putNamespacePrefix(XMLSignature.XMLNS, "ds");
    
    	            // Create the XMLSignature (but don't sign it yet)
    	            XMLSignature signature = fac.newXMLSignature(si, ki);
    
    	            // Marshal, generate (and sign) the enveloped signature
    	            signature.sign(dsc);
    
    	            // output the resulting document
    	            OutputStream os;
    	            os = new FileOutputStream(signedfile);
    
    	            TransformerFactory tf = TransformerFactory.newInstance();
    	            Transformer trans = tf.newTransformer();
    	            trans.transform(new DOMSource(doc), new StreamResult(os));
    
    	            System.out.println("File " + signedfile + " firmato.");
    
    	        } 
    	        catch (Exception e) 
    	        {
    	            e.printStackTrace();
    	        }
    
    	}
    
    }
    
    Il codice funziona; viene sempre fuori il file firmato, ma quando lo trasmetto mi dà sempre l'inesorabile 406 non conforme.

    Un ulteriore dubbio è questo: quando generi il CSR
    io uso questi due passaggi:
    • Il primo passo consiste nella Generazione della chiave RSA mediante il comando:
    openssl genrsa –out mykey.key 2048
    • Il secondo passo consiste nella Generazione della CSR mediante il comando:
    openssl req -new -key mykey.key -out mycsr.csr

    Country Name (2 letter code) [AU]:IT
    State or Province Name (full name) [Some-State]:Provincia
    Locality Name (eg, city) []:
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Nome Azienda
    Organizational Unit Name (eg, section) []:
    Common Name (eg, YOUR name) []:AAABBB99C23xxxxZ
    Email Address []:
    Please enter the following 'extra' attributes to be sent with your certificate reque
    A challenge password []:
    An optional company name []:

    Di questi campi io ho usato:
    COUNTRY NAME: IT
    PROVINCE: TREVISO
    LOCALITY NAME: nulla
    ORGANIZATION NAME: LA PARTITA IVA O IL CODICE FISCALE ??
    COMMON NAME: IMEI DEL CELLULARE
    EMAIL ADDRES: nulla
    A CHALLENGE PW: NULLA O BISOGNA METTERE UNA PASSWORD ??
    A OPT COMP.NAME: nulla

    Tu come hai fatto ??

    Ciao
    Paolo
  • Re: File xml Agenzia delle Entrate

    Paolo64 ha scritto:


    Di questi campi io ho usato:
    COUNTRY NAME: IT
    PROVINCE: TREVISO
    LOCALITY NAME: nulla
    ORGANIZATION NAME: LA PARTITA IVA O IL CODICE FISCALE ??
    COMMON NAME: IMEI DEL CELLULARE
    EMAIL ADDRES: nulla
    A CHALLENGE PW: NULLA O BISOGNA METTERE UNA PASSWORD ??
    A OPT COMP.NAME: nulla

    Tu come hai fatto ??

    Ciao
    Paolo
    Io in provincia ho messo la sigla ( TV ) e non la provincia intera e nessuna password in organization la ragione sociale dell'azienda, o, in caso di persona fisica, cognome e nome.
  • Re: File xml Agenzia delle Entrate

    geremiah ha scritto:


    Paolo64 ha scritto:


    Di questi campi io ho usato:
    COUNTRY NAME: IT
    PROVINCE: TREVISO
    LOCALITY NAME: nulla
    ORGANIZATION NAME: LA PARTITA IVA O IL CODICE FISCALE ??
    COMMON NAME: IMEI DEL CELLULARE
    EMAIL ADDRES: nulla
    A CHALLENGE PW: NULLA O BISOGNA METTERE UNA PASSWORD ??
    A OPT COMP.NAME: nulla

    Tu come hai fatto ??

    Ciao
    Paolo
    Io in provincia ho messo la sigla ( TV ) e non la provincia intera e nessuna password in organization la ragione sociale dell'azienda, o, in caso di persona fisica, cognome e nome.
    Qualche progresso :
    Adesso al posto del 406 mi esce errore 415 (415 il valore del
    content-type non è quello atteso) Non so cosa significhi ...
    questo è il responso del server:
    
    C:\Users\PAOLO2\Desktop\VendingMachine>curl -v -k --header 'Content-Type: application/xml' "https://apid-ivaservizi.agenziaentrate.gov.it/v1/dispositivi/" --data-binary @RichiestaCertificatoDispositivo_Firmato.xml --verbose
    * Could not resolve host: application
    * Closing connection 0
    curl: (6) Could not resolve host: application
    *   Trying 217.175.50.83...
    * TCP_NODELAY set
    * Connected to apid-ivaservizi.agenziaentrate.gov.it (217.175.50.83) port 443 (#1)
    * ALPN, offering http/1.1
    * Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
    * TLSv1.2 (OUT), TLS header, Certificate Status (22):
    * TLSv1.2 (OUT), TLS handshake, Client hello (1):
    * TLSv1.2 (IN), TLS handshake, Server hello (2):
    * TLSv1.2 (IN), TLS handshake, Certificate (11):
    * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
    * TLSv1.2 (IN), TLS handshake, Server finished (14):
    * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
    * TLSv1.2 (OUT), TLS change cipher, Client hello (1):
    * TLSv1.2 (OUT), TLS handshake, Finished (20):
    * TLSv1.2 (IN), TLS change cipher, Client hello (1):
    * TLSv1.2 (IN), TLS handshake, Finished (20):
    * SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
    * ALPN, server did not agree to a protocol
    * Server certificate:
    *  subject: C=IT; O=Agenzia delle Entrate; OU=Servizi Sicuri; CN=apid-ivaservizi.agenziaentrate.gov.it
    *  start date: Jun  9 09:25:17 2016 GMT
    *  expire date: Jun  9 09:35:00 2019 GMT
    *  issuer: C=IT; O=Agenzia delle Entrate; OU=Servizi Telematici; CN=CA Agenzia delle Entrate
    *  SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
    > POST /v1/dispositivi/ HTTP/1.1
    > Host: apid-ivaservizi.agenziaentrate.gov.it
    > User-Agent: curl/7.57.0
    > Accept: */*
    > Content-Length: 4368
    > Content-Type: application/x-www-form-urlencoded
    > Expect: 100-continue
    >
    < HTTP/1.1 100 Continue
    < X-Note: Gateway Ack
    * We are completely uploaded and fine
    < HTTP/1.1 415 Processed
    < X-Backside-Transport: FAIL FAIL
    < Connection: Keep-Alive
    < Transfer-Encoding: chunked
    < Date: Tue, 06 Feb 2018 23:57:26 GMT
    < X-Powered-By: Servlet/3.0
    < Access-Control-Allow-Origin: *
    < Access-Control-Allow-Methods: GET, POST, DELETE, PUT
    < Access-Control-Allow-Headers: Content-Type
    < Content-Language: en-US
    < Set-Cookie: LtpaToken2=fLxBSD6kO6hpqevh2Cxce2qWx18USebbOiIEhByAIi5oCiQBdoQcLF2+vd4kqFry1yz0m+OvlRJDqhoV/GRBoThDeG3jjYouCUBF2Pg8doK+eNZQy7R2g/PDr22Tc2axA7OOHjeuhCmsEVcUvtTrTlDpf37IalsyK8KOB6gb+svohu2swhLh6Bv88aP3MBTazf0YHeCQXbQ9gb70BN1y7YbyLM757NJM0rxQrjYVGlok3Y0OgS9UaE5RfFfHM6TtozOZfQxUKDs9zQlpV+voe7kSsOQDVg6Qge2OEbU/tGi8X4UE6leurubR6Em00AM0NkGF2udaZpWezkRas3LbLi1UgcIo/osiX6x2pzwPaiQ+PvEzn4xZUueZFOyTRLUrfS9E0SPJmcMg1CUxOed0vQ==
    < X-Global-Transaction-ID: 4176390573
    < Content-Type: text/xml
    <
    * Connection #1 to host apid-ivaservizi.agenziaentrate.gov.it left intact
    
    C:\Users\PAOLO2\Desktop\VendingMachine>
    Come trasmettete l'xml ? Con curl o altro ??
  • Re: File xml Agenzia delle Entrate

    Paolo64 ha scritto:



    Qualche progresso :
    Adesso al posto del 406 mi esce errore 415 (415 il valore del
    content-type non è quello atteso) Non so cosa significhi ...
    questo è il responso del server:
    
    C:\Users\PAOLO2\Desktop\VendingMachine>curl -v -k --header 'Content-Type: application/xml' "https://apid-ivaservizi.agenziaentrate.gov.it/v1/dispositivi/" --data-binary @RichiestaCertificatoDispositivo_Firmato.xml --verbose
    * Could not resolve host: application
    * Closing connection 0
    curl: (6) Could not resolve host: application
    *   Trying 217.175.50.83...
    * TCP_NODELAY set
    * Connected to apid-ivaservizi.agenziaentrate.gov.it (217.175.50.83) port 443 (#1)
    * ALPN, offering http/1.1
    * Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
    * TLSv1.2 (OUT), TLS header, Certificate Status (22):
    * TLSv1.2 (OUT), TLS handshake, Client hello (1):
    * TLSv1.2 (IN), TLS handshake, Server hello (2):
    * TLSv1.2 (IN), TLS handshake, Certificate (11):
    * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
    * TLSv1.2 (IN), TLS handshake, Server finished (14):
    * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
    * TLSv1.2 (OUT), TLS change cipher, Client hello (1):
    * TLSv1.2 (OUT), TLS handshake, Finished (20):
    * TLSv1.2 (IN), TLS change cipher, Client hello (1):
    * TLSv1.2 (IN), TLS handshake, Finished (20):
    * SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
    * ALPN, server did not agree to a protocol
    * Server certificate:
    *  subject: C=IT; O=Agenzia delle Entrate; OU=Servizi Sicuri; CN=apid-ivaservizi.agenziaentrate.gov.it
    *  start date: Jun  9 09:25:17 2016 GMT
    *  expire date: Jun  9 09:35:00 2019 GMT
    *  issuer: C=IT; O=Agenzia delle Entrate; OU=Servizi Telematici; CN=CA Agenzia delle Entrate
    *  SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
    > POST /v1/dispositivi/ HTTP/1.1
    > Host: apid-ivaservizi.agenziaentrate.gov.it
    > User-Agent: curl/7.57.0
    > Accept: */*
    > Content-Length: 4368
    > Content-Type: application/x-www-form-urlencoded
    > Expect: 100-continue
    >
    < HTTP/1.1 100 Continue
    < X-Note: Gateway Ack
    * We are completely uploaded and fine
    < HTTP/1.1 415 Processed
    < X-Backside-Transport: FAIL FAIL
    < Connection: Keep-Alive
    < Transfer-Encoding: chunked
    < Date: Tue, 06 Feb 2018 23:57:26 GMT
    < X-Powered-By: Servlet/3.0
    < Access-Control-Allow-Origin: *
    < Access-Control-Allow-Methods: GET, POST, DELETE, PUT
    < Access-Control-Allow-Headers: Content-Type
    < Content-Language: en-US
    < Set-Cookie: LtpaToken2=fLxBSD6kO6hpqevh2Cxce2qWx18USebbOiIEhByAIi5oCiQBdoQcLF2+vd4kqFry1yz0m+OvlRJDqhoV/GRBoThDeG3jjYouCUBF2Pg8doK+eNZQy7R2g/PDr22Tc2axA7OOHjeuhCmsEVcUvtTrTlDpf37IalsyK8KOB6gb+svohu2swhLh6Bv88aP3MBTazf0YHeCQXbQ9gb70BN1y7YbyLM757NJM0rxQrjYVGlok3Y0OgS9UaE5RfFfHM6TtozOZfQxUKDs9zQlpV+voe7kSsOQDVg6Qge2OEbU/tGi8X4UE6leurubR6Em00AM0NkGF2udaZpWezkRas3LbLi1UgcIo/osiX6x2pzwPaiQ+PvEzn4xZUueZFOyTRLUrfS9E0SPJmcMg1CUxOed0vQ==
    < X-Global-Transaction-ID: 4176390573
    < Content-Type: text/xml
    <
    * Connection #1 to host apid-ivaservizi.agenziaentrate.gov.it left intact
    
    C:\Users\PAOLO2\Desktop\VendingMachine>
    Come trasmettete l'xml ? Con curl o altro ??
    Non credo tu possa usare curl. Per dialogare con l'Agenzia devi aprire una connessione HTTPS usando il loro certificato, inoltre, i risultati degli invii ritornano sempre un file XML ed un codice. Puoi gestirli con CURL ?
    Nel caso dell'errore 415 è il context che è sbagliato, ovvero, nella connessione devi specificare che tipo di dati invii, in questo caso application/XML. Dagli esempi che riporta l'ADE degli invii con curl vedo che il context lo specifica, guarda meglio l'esempio sulla documentazione ADE.
    Ciao.
  • Re: File xml Agenzia delle Entrate

    geremiah ha scritto:


    Come ho già scritto precedentemente io uso una libreria proprietaria che mi fa tutto il lavoro di firme/crittografia a basso livello senza sbattermi molto ( per quello che l'ho pagata è il minimo ).
    Per curiosita' qual'e' la libreria che usi? Per quale linguaggio?

    Grazie.
  • Re: File xml Agenzia delle Entrate

    E' possibile provare a inviare il file xml con curl, e' la stessa agenzia delle entrate che in uno dei tanti pdf guida(IstruzioniApiDispositivi.pdf) scrive:
    
    1. RICHIESTA CERTIFICATO DISPOSITIVO
    curl -v -k -X POST --header 'Content-Type: application/xml' 'https://apid-ivaservizi.agenziaentrate.gov.it/v1/dispositivi/' --data-binary @ric_firmata.xml --verbose
    
    dove ric_firmata.xml è il file XML che rispetta le specifiche dell'oggetto "RichiestaCertificatoDispositivo" in CorrispettiviMessaggiTypes_v1.0.xsd, a cui è stata apposta la firma con il certificato fabbricante

    • --header 'Content-Type: application/xml'
    e' ovviamente il Content-Type che stai inviando. Quindi @Paolo l'errore che hai se la riga che digiti e' corretta e' strana.

    ----

    Io invece ho un 406.

    Provo ancora una volta a descrivere tutti i passaggi che faccio con la speranza di venirne a capo:

    File iniziale(A):
    (Quello in cui va inserito l'elemento Signature. Questo che va passato per applicarci la firma, quello in cui va attaccato il certificato gestore, quello su cui va calcolato l'hash sha256)
    <p:RichiestaCertificatoDispositivo xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/corrispettivi/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" versione="1.0" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/corrispettivi/v1.0/CorrispettiviMessaggiTypes_v1.0.xsd">
    	<Csr>LS0...==</Csr>
    	<Dispositivo>
    		<Tipo>DM</Tipo>
    	</Dispositivo>
    	<TecnicoVerificatore>
    		<CodiceFiscale>TRM...2A</CodiceFiscale>
    		<PIvaSocieta>
    			<IdPaese>IT</IdPaese>
    			<IdCodice>03...42</IdCodice>
    		</PIvaSocieta>
    	</TecnicoVerificatore>
    </p:RichiestaCertificatoDispositivo>
  • Re: File xml Agenzia delle Entrate

    gine ha scritto:


    geremiah ha scritto:


    Come ho già scritto precedentemente io uso una libreria proprietaria che mi fa tutto il lavoro di firme/crittografia a basso livello senza sbattermi molto ( per quello che l'ho pagata è il minimo ).
    Per curiosita' qual'e' la libreria che usi? Per quale linguaggio?

    Grazie.
    Non uso java se è questo che vuoi sapere.
  • Re: File xml Agenzia delle Entrate

    gine ha scritto:


    E' possibile provare a inviare il file xml con curl, e' la stessa agenzia delle entrate che in uno dei tanti pdf guida(IstruzioniApiDispositivi.pdf) scrive:
    
    1. RICHIESTA CERTIFICATO DISPOSITIVO
    curl -v -k -X POST --header 'Content-Type: application/xml' 'https://apid-ivaservizi.agenziaentrate.gov.it/v1/dispositivi/' --data-binary @ric_firmata.xml --verbose
    
    dove ric_firmata.xml è il file XML che rispetta le specifiche dell'oggetto "RichiestaCertificatoDispositivo" in CorrispettiviMessaggiTypes_v1.0.xsd, a cui è stata apposta la firma con il certificato fabbricante

    • --header 'Content-Type: application/xml'
    e' ovviamente il Content-Type che stai inviando. Quindi @Paolo l'errore che hai se la riga che digiti e' corretta e' strana.
    Gine: si infatti la riga che uso fa terminale è
    curl -v -k --header 'Content-Type: application/xml' "https://apid-ivaservizi.agenziaentrate.gov.it/v1/dispositivi/" --data-binary @RichiestaCertificatoDispositivo_Firmato.xml --verbose

    Però ho un dubbio: mettiamo che xml sia corretto, questo comando curl scarica poi il file certificatodispositivo.xml direttamente o bisogna fare qualcosa altro?
  • Re: File xml Agenzia delle Entrate

    gine ha scritto:



    Io invece ho un 406.

    Provo ancora una volta a descrivere tutti i passaggi che faccio con la speranza di venirne a capo:

    File iniziale(A):
    (Quello in cui va inserito l'elemento Signature. Questo che va passato per applicarci la firma, quello in cui va attaccato il certificato gestore, quello su cui va calcolato l'hash sha256)
    <p:RichiestaCertificatoDispositivo xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/corrispettivi/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" versione="1.0" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/corrispettivi/v1.0/CorrispettiviMessaggiTypes_v1.0.xsd">
    	<Csr>LS0...==</Csr>
    	<Dispositivo>
    		<Tipo>DM</Tipo>
    	</Dispositivo>
    	<TecnicoVerificatore>
    		<CodiceFiscale>TRM...2A</CodiceFiscale>
    		<PIvaSocieta>
    			<IdPaese>IT</IdPaese>
    			<IdCodice>03...42</IdCodice>
    		</PIvaSocieta>
    	</TecnicoVerificatore>
    </p:RichiestaCertificatoDispositivo>
    Ho letto quello che hai scritto e provato encodare il csr in base 64. L'errore che mi ritorna (415) con il csr encodato o non encodato è uguale, percui non penso sia quello il problema.
    Ho provato anche a togliere
    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    , ma non cambia

    Io per firmare uso questo codice (preso tale e quale dalla pagina ADE)
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.security.KeyStore;
    import java.security.PrivateKey;
    import java.security.Provider;
    import java.security.cert.X509Certificate;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Enumeration;
    import java.util.List;
    
    import javax.xml.crypto.dsig.CanonicalizationMethod;
    import javax.xml.crypto.dsig.DigestMethod;
    import javax.xml.crypto.dsig.Reference;
    import javax.xml.crypto.dsig.SignedInfo;
    import javax.xml.crypto.dsig.Transform;
    import javax.xml.crypto.dsig.XMLSignature;
    import javax.xml.crypto.dsig.XMLSignatureFactory;
    import javax.xml.crypto.dsig.dom.DOMSignContext;
    import javax.xml.crypto.dsig.keyinfo.KeyInfo;
    import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory;
    import javax.xml.crypto.dsig.keyinfo.X509Data;
    import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
    import javax.xml.crypto.dsig.spec.TransformParameterSpec;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    
    import org.w3c.dom.Document;
    public class Firma {
    		public static final String SHA256_RSA_SIGNATURE_ALGORITHM = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
    		public static void main(String[] args) {
    		// TODO Auto-generated method stub
    			try {
    				//originale=String p12file = "path_certificato_di_firma.p12";
    	            String p12file = "c:/Users/PAOLO2/Desktop/VendingMachine/certificato38380.pfx";
    	            String p12pass = "123456";
    	            //Originale
    	            //String p12pass = "7264809992";
    	            
    	            //String infile = "path_file_da_firmare.xml";
    	            //String signedfile = "path_file_firmato.xml";
    	            String infile = "c:/Users/PAOLO2/Desktop/VendingMachine/RichiestaCertificatoDispositivo_Nospace.xml";
    	            String signedfile = "c:/Users/PAOLO2/Desktop/VendingMachine/RichiestaCertificatoDispositivo_Firmato.xml";
    	               
    	            Provider provider = null;
    	            /*
    	            provider = xml.XMLUtils.getXmlDsigProvider();
    	            System.out.println("XML provider: " + provider);
    	            */
    
    	            X509Certificate signerCert = null;
    	            PrivateKey key = null;
    	            KeyStore ks = KeyStore.getInstance("PKCS12");
    	            ks.load(new FileInputStream(p12file), p12pass.toCharArray());
    	            Enumeration<String> en = ks.aliases();
    	            while (en.hasMoreElements()) {
    	                String alias = (String) en.nextElement();
    	                if (ks.isKeyEntry(alias)) {
    	                    signerCert = (X509Certificate) ks.getCertificate(alias);
    	                    key = (PrivateKey) ks.getKey(alias, p12pass.toCharArray());
    	                    break;
    	                }
    	            }
    
    	            if (signerCert == null || key == null) {
    	                throw new Exception("Key or Certificate not found!!");
    	            }
    
    	            // Create a DOM XMLSignatureFactory that will be used to generate the
    	            // enveloped signature
    	            XMLSignatureFactory fac;
    	            if (provider == null) {
    	                fac = XMLSignatureFactory.getInstance("DOM");
    	            } else {
    	                fac = XMLSignatureFactory.getInstance("DOM", provider);
    	            }
    
    	            // Create a Reference to the enveloped document (in this case we are
    	            // signing the whole document, so a URI of "" signifies that) and
    	            // also specify the SHA1 digest algorithm and the ENVELOPED Transform.
    	            Reference ref = fac.newReference(
    	            		"",
    	                    fac.newDigestMethod(DigestMethod.SHA256, null),
    	                    Collections.singletonList(fac.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null)),
    	                    null, 
    	                    null);
    
    	            // Create the SignedInfo
    	            SignedInfo si = fac.newSignedInfo(
    	                    fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, (C14NMethodParameterSpec) null),
    	                    fac.newSignatureMethod(SHA256_RSA_SIGNATURE_ALGORITHM, null),
    	                    Collections.singletonList(ref));
    
    	            KeyInfoFactory kif;
    	            if (provider == null) {
    	                kif = KeyInfoFactory.getInstance("DOM");
    	            } else {
    	                kif = KeyInfoFactory.getInstance("DOM", provider);
    	            }
    
    	            // Aggiunta del certificato del firmatario in KeyInfo
    	            List x509DataContent = new ArrayList();
    	            x509DataContent.add(signerCert);
    	            X509Data x509Data = kif.newX509Data(x509DataContent);
    	            List keyInfoContent = new ArrayList();
    	            keyInfoContent.add(x509Data);
    
    	            KeyInfo ki = kif.newKeyInfo(keyInfoContent);
    
    	            // Instantiate the document to be signed
    	            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    	            dbf.setNamespaceAware(true);
    	            dbf.setValidating(true);
    
    	            // default false
    	            // dbf.setIgnoringElementContentWhitespace(true);
    	            // default true
    	            // dbf.setExpandEntityReferences(false);
    	            Document doc = null;
    	            doc = dbf.newDocumentBuilder().parse(new FileInputStream(infile));
    
    	            // Create a DOMSignContext and specify the RSA PrivateKey and
    	            // location of the resulting XMLSignature's parent element
    	            DOMSignContext dsc = new DOMSignContext(key, doc.getDocumentElement());
    
    	            dsc.setProperty("javax.xml.crypto.dsig.cacheReference", Boolean.TRUE);
    	            dsc.putNamespacePrefix(XMLSignature.XMLNS, "ds");
    
    	            // Create the XMLSignature (but don't sign it yet)
    	            XMLSignature signature = fac.newXMLSignature(si, ki);
    
    	            // Marshal, generate (and sign) the enveloped signature
    	            signature.sign(dsc);
    
    	            // output the resulting document
    	            OutputStream os;
    	            os = new FileOutputStream(signedfile);
    
    	            TransformerFactory tf = TransformerFactory.newInstance();
    	            Transformer trans = tf.newTransformer();
    	            trans.transform(new DOMSource(doc), new StreamResult(os));
    
    	            System.out.println("File " + signedfile + " firmato.");
    
    	        } 
    	        catch (Exception e) 
    	        {
    	            e.printStackTrace();
    	        }
    
    	}
    
    }
    
    Potresti provarlo anche tu ...

    Firmando l'xml con questo codice non ho più l'errore 406 ma passa a errore 415.
    Però rileggendo meglio la pagina "Utilizzare Api Rest" dell'ADE
    dice:

    Solamente come esempio per l'apposizione della firma viene messa a disposizione l'applicazione java contenuta nel file "EsempioFirmaDispositivo.zip".

    Per utilizzarla basta modificare le variabili seguenti (righe da 41 a 44 del file) con i valori appropriati:

    String p12file = "path_certificato_di_firma.p12";
    String p12pass = "password del certificato di firma";
    String infile = "path_file_da_firmare.xml";
    String signedfile = "path_file_firmato.xml".

    secondo voi quale sarebbe la "password del certificato di firma" ???
    visto anche che nella generazione del csr la password non va specificata ??
    E' il contenuto del file .key ?

    Paolo
Devi accedere o registrarti per scrivere nel forum
90 risposte