Programadores freelance - curl + openssl + SII

 
Vista:

curl + openssl + SII

Publicado por Angel (8 intervenciones) el 02/05/2017 10:14:41
Busco programador para conectar mi aplicación contable con el nuevo SII de facturas de hacienda en españa.

1.- Convertir certificado pfx a pem de entidad certificadora FNMT , de representante de empresa
2.- Command curl de envio y recepción de respuesta de los webservices de Hacienda


Nota: los xml que se remiten a los servicios de hacienda están comprobados y validados
los command curl que se usan funcionan

Problema: los servicios de hacieda no reconocen el certificado


Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

curl + openssl + SII

Publicado por Pablo (5 intervenciones) el 03/05/2017 09:18:57
Hola Angel, yo también estoy desarrollando una aplicación para SSI, dame más datos para poder detectar porque hacienda no te reconoce el certificado, y veo si puedo ayudarte. Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

curl + openssl + SII

Publicado por Angel (8 intervenciones) el 03/05/2017 10:33:38
Saludos...

nota: estoy en la primera parte consulta de nifs

1.- Asunto certificado para acceder a la web de Hacienda SII

En este momento tengo convertido el certificado de representante de la FNMT en formato pfx con Openssl , mecanica:
via fichero bat convierto el certificado pfx a pem para poder trabajar con CURL
a.- openssl pkcs12 -in certificado.p12 -out certificado.pem -clcerts -nokeys (el certificado en si, quedando fichero certificado.pem)
b. openssl pkcs12 -in certificado.p12 -out certificado_key.pem -nocerts -nodes (la clave privada, queda fichero certificado:Key.pem)
Parece ser que el certificado funciona, pero no estoy seguro ya que en pruebas que estoy efectuando la construcción del fichero xml me da errores de caracteres invalidos, pero ese es otro asunto.
Suponiendo que el certificado pem es valido.

2.- Asunto envio con Curl de fichero xml, mecanica:

via fichero bat envio fichero a los wenservices de hacienda , ojo que el trace lo uso para averiguar donde estan los errores

C:\curl-7.46.0-win32\bin\curl.exe --connect-timeout 300 -d ./@0_Nif.xml -o ./0_Nif.Respuesta.xml --cert ./certificado.pem --key ./certificado_key.pem https://www1.agenciatributaria.gob.es/wlpl/BURT-JDIT/ws/VNifV1SOAP --trace ./0_Nif_Trace.txt

3.- la construccion del fichero xml para consulta de nifs es

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:vnif="http://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/burt/jdit/ws/VNifV1Ent.xsd">
   <soapenv:Header/>
   <soapenv:Body>
	<vnif:VNifV1Ent>
		<vnif:Nif>XXXXXXX</vnif:Nif>
		<vnif:Nombre>XXXXXX</vnif:Nombre>
	</vnif:VNifV1Ent>
</soapenv:Body>
</soapenv:Envelope>


.... Problema:

en su respuesta hacienda me indica "Codigo[103].Se ha encontrado un carácter XML no válido (Unicode: 0x2e) en el prólogo del documento." ...... y aqui estoy en este momento....

aclaraciones: por fichero trace leo que el certificado negociado ha sido validado

Saludos


olvidaba: mi cosa es en ms access vba, pero veo que es mucho más rapido y facil con curl, ya que XMLHTTP lo desconozco, no estudiado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

curl + openssl + SII

Publicado por Manolo (2 intervenciones) el 04/05/2017 23:06:49
./@0_Nif.xml

Creo que la ruta está mal, la @ debería ir al principio. Prueba a poner el fichero xml donde el curl y quita ./
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

curl + openssl + SII

Publicado por Pablo (5 intervenciones) el 05/05/2017 01:26:51
C:\curl-7.46.0-win32\bin\curl.exe --connect-timeout 60 -m 60 -s -S -L --cert ./certificado.pem --key ./certificado_key.pem -d "@0_Nif.xml" -o "0_Nif_Respuesta.xml" https://www1.agenciatributaria.gob.es/wlpl/BURT-JDIT/ws/VNifV1SOAP --trace ./0_Nif.xmlTrace.txt


Asi te funciona seguro, lo he probado y ok. Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

curl + openssl + SII

Publicado por Angel (8 intervenciones) el 05/05/2017 09:21:27
Gracias, gracias... a los dos... funciona de fabula

Ya esta arreglado... copia del *.bat

* Para facturas emitidas

DEL Respuesta-Emitida.xml
DEL Emitida_xmlTrace.txt
C:\curl-7.46.0-win32\bin\curl.exe --connect-timeout 60 -m 60 -s -S -L --cert ./certificado.pem --key ./certificado_key.pem -d "@Emitida.xml" -o "Respuesta-Emitida.xml" https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP --trace ./Emitida-xmlTrace.txt

AngelMiguel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

curl + openssl + SII

Publicado por jordi (1 intervención) el 17/05/2017 22:25:32
hola

alguno de vosotros os encontrais con este problema de certificado. el ciente me ha exportado desde iexplorer un certificado .pfx jo lo he convertido con openssl a .pem pero siempre me da el siguiente error: Self signed certificate in certificate chain

gacias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

curl + openssl + SII

Publicado por Pablo (5 intervenciones) el 17/05/2017 23:06:17
Creo que puede ser que el pfx no tenga la clave privada, o comprueba que la fecha y la hora del ordenador sea correcta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

curl + openssl + SII

Publicado por Manolo (2 intervenciones) el 18/05/2017 19:45:27
Intenta instalarlo en el equipo, si no te deja es que lo han exportado sin clave y no vale
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

curl + openssl + SII

Publicado por Francesc (5 intervenciones) el 14/06/2017 12:20:34
Hola a todos,

He intentado desde la consola usar la instrucción de Pablo, pero me devuelve "Error de indentificación. No se detecta certificado digital o no se ha seleccionado correctamente."

Si instalo el certificado en el Internet Explorer, sí que funciona, como que usa aquel por defecto.

¿Se os ocurre alguna cosa?

Os lo agradecería muchísimo cualquier ayuda.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

curl + openssl + SII

Publicado por Pablo (5 intervenciones) el 14/06/2017 12:57:18
En principio no debería darte ningún problema, comprueba la contraseña, la extensión del certificado es pfx?, a no ser que ese certificado tenga puesta la opción de habilitar protección segura de clave privada, o que no hayas exportado la clave privada en el pfx que estas usando, espero que te haya servido, saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

curl + openssl + SII

Publicado por Francesc (5 intervenciones) el 14/06/2017 16:36:23
Guau!, gracias Pablo,

Efectivamente no había exportado la clave privada en el pfx.

Estaba desesperado...

Un millón de gracias!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

curl + openssl + SII

Publicado por AngelMiguel (8 intervenciones) el 14/06/2017 16:30:58
Tiene toda la pinta de que es un problema relacionado con el certificado.

SII Procedimiento para el Proceso de los Datos.

Utilidades Necesarias
Descargar e Instalar OpenSSL https://slproweb.com/products/Win32OpenSSL.html
Descargamos e Instalamos CURL: https://curl.haxx.se/download.html

Procedimiento
Convertir el Certificado que vamos a utilizar, para enviar la información de Formato P2 (PKCS)
a PEM

Por una parte el certificado:
openssl pkcs12 -in certificado.p12 -out certificado.pem -clcerts -nokeys
Por otra parte la Clave Privada:
openssl pkcs12 -in certificado.p12 -out certificado_key.pem -nocerts -nodes

Generamos el XML que vamos a enviar a hacienda, con los datos necesarios.

Hacemos la petición al WebService de Hacienda, por medio de CURL:

curl --connect-timeout 60 -m 60 -s -S -L --header "Content-Type: text/xml;charset=UTF-
8" --cert ./certificado.pem --key ./certificado_key.pem --data @entrada.xml
https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP --output salida.xml -v

El webservice a la que hacemos la petición es uno para pruebas.

Facturas Emitidas: https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP
Facturas Recibidas: https://www7.aeat.es/wlpl/SSII-FACT/ws/fr/SiiFactFRV1SOAP
Bienes de Inversion: https://www7.aeat.es/wlpl/SSII-FACT/ws/fr/SiiFactBIV1SOAP
Operaciones Intracomunitarias: https://www7.aeat.es/wlpl/SSII-FACT/ws/fr/SiiFactOIV1SOAP
Cobros Emitidas: https://www7.aeat.es/wlpl/SSII-FACT/ws/fr/SiiFactCOBV1SOAP
Cobros Metalico: https://www7.aeat.es/wlpl/SSII-FACT/ws/fr/SiiFactCMV1SOAP
Pagos Recibidas: https://www7.aeat.es/wlpl/SSII-FACT/ws/fr/SiiFactPAGV1SOAP

el Fichero que generamos es entrada.xml
el Fichero que nos devuelve el WebService es salida.xml


Ejemplo de fichero bat consultar un nif

C:\curl-7.46.0-win32\bin\curl.exe --connect-timeout 300 -d @EnvioNif.xml -o RespuestaNif.xml --cert ./Certificado.pem --key ./Certificado_key.pem https://www1.agenciatributaria.gob.es/wlpl/BURT-JDIT/ws/VNifV1SOAP --trace ./RespuestaTrace.txt

Ejemplo de fichero bat factura emitida

C:\curl-7.46.0-win32\bin\curl.exe --connect-timeout 60 -m 60 -s -S -L --cert ./certificado.pem --key ./certificado_key.pem -d "@Emitida.xml" -o "Respuesta-Emitida.xml" https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP --trace ./Emitida-xmlTrace.txt
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

curl + openssl + SII

Publicado por Francesc (5 intervenciones) el 14/06/2017 16:39:03
Gracias Angel por tu recopilatorio,

Me las he visto canutas porque no sabia donde mirar.


Saludos !
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

curl + openssl + SII

Publicado por AngelMiguel (8 intervenciones) el 14/06/2017 17:20:38
Francesc si miras en otras respuestas tienes codigo de ejemplo para aplicación en ms access y xml ver 6.0 de entrada de facturas y lectura del certificado almacenado en el navegador.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
Private Sub EnviaFacturaEmitida()
 
    Dim sMsg As String
    Dim sUrl As String
    Dim sEnv As String
    Dim XML_Node As IXMLDOMNode
    Dim objHttp  As Object
    Dim XMLDoc As MSXML2.DOMDocument60
 
           Me.TxtFechaPresentacion = vbNullString
           Me.txtCsv = vbNullString
 
    sUrl = "https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP"
 
 
sEnv = vbNullString
 
sEnv = sEnv & "<?xml version=" & Chr(34) & "1.0" & Chr(34) & " encoding=" & Chr(34) & "UTF-8" & Chr(34) & "?>"
sEnv = sEnv & "<soapenv:Envelope xmlns:soapenv=" & Chr(34) & "http://schemas.xmlsoap.org/soap/envelope/" & Chr(34) & " xmlns:siiLR=" & Chr(34) _
                   & "https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroLR.xsd" & Chr(34) _
                   & " xmlns:sii=" & Chr(34) & "https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroInformacion.xsd" & Chr(34) & ">"
 
sEnv = sEnv & "<soapenv:Header/>"
sEnv = sEnv & "<soapenv:Body>"
sEnv = sEnv & "<siiLR:SuministroLRFacturasEmitidas>"
 
sEnv = sEnv & "<sii:Cabecera>"
    sEnv = sEnv & "<sii:IDVersionSii>" & Trim(Me.txtVersionSII) & "</sii:IDVersionSii>"
    sEnv = sEnv & "<sii:Titular>"
    sEnv = sEnv & "<sii:NombreRazon>" & Trim(Me.cboEmpresa.Column(0)) & "</sii:NombreRazon>"
    sEnv = sEnv & "<sii:NIF>" & Trim(Me.cboEmpresa.Column(1)) & "</sii:NIF>"
    sEnv = sEnv & "</sii:Titular>"
    sEnv = sEnv & "<sii:TipoComunicacion>" & Trim(Me.CboTipoComunicacionSII.Column(1)) & "</sii:TipoComunicacion>"
sEnv = sEnv & "</sii:Cabecera>"
 
sEnv = sEnv & "<siiLR:RegistroLRFacturasEmitidas>"
 
sEnv = sEnv & "<sii:PeriodoImpositivo>"
    sEnv = sEnv & "<sii:Ejercicio>" & Trim(Me.cboAño) & "</sii:Ejercicio>"
    sEnv = sEnv & "<sii:Periodo>" & Format(Trim(Me.FechaFactura), "mm") & "</sii:Periodo>"
sEnv = sEnv & "</sii:PeriodoImpositivo>"
 
sEnv = sEnv & "<siiLR:IDFactura>"
    sEnv = sEnv & "<sii:IDEmisorFactura>"
    sEnv = sEnv & "<sii:NIF>" & Trim(Me.cboEmpresa.Column(1)) & "</sii:NIF>"
    sEnv = sEnv & "</sii:IDEmisorFactura>"
    sEnv = sEnv & "<sii:NumSerieFacturaEmisor>" & Trim(Me.NumeroFactura) & "</sii:NumSerieFacturaEmisor>"
    sEnv = sEnv & "<sii:FechaExpedicionFacturaEmisor>" & Format(Trim(FechaFactura), "dd-mm-yyyy") & "</sii:FechaExpedicionFacturaEmisor>"
sEnv = sEnv & "</siiLR:IDFactura>"
 
sEnv = sEnv & "<siiLR:FacturaExpedida>"
    sEnv = sEnv & "<sii:TipoFactura>" & Trim(Me.CbotipoFActura.Column(1)) & "</sii:TipoFactura>"
    sEnv = sEnv & "<sii:ClaveRegimenEspecialOTrascendencia>" & Trim(Me.CboTipoOperacionSII.Column(1)) & "</sii:ClaveRegimenEspecialOTrascendencia>" ' 01
    sEnv = sEnv & "<sii:ImporteTotal>" & Replace(Format(Trim(Me.TotalFactura), "###0.00"), ",", ".") & "</sii:ImporteTotal>"
    sEnv = sEnv & "<sii:DescripcionOperacion>" & Trim(TxtConceptoSII) & "</sii:DescripcionOperacion>"
sEnv = sEnv & "<sii:Contraparte>"
    sEnv = sEnv & "<sii:NombreRazon>" & Trim(Me.txtCodigoContableProveedor) & "</sii:NombreRazon>"
    sEnv = sEnv & "<sii:NIF>" & Trim(Me.txtnif) & "</sii:NIF>"
sEnv = sEnv & "</sii:Contraparte>"

sEnv = sEnv & "<sii:TipoDesglose>"
sEnv = sEnv & "<sii:DesgloseFactura>"
sEnv = sEnv & "<sii:Sujeta>"
sEnv = sEnv & "<sii:NoExenta>"

If Trim(Me.Impuestos) = 0 Then
    sEnv = sEnv & "<sii:TipoNoExenta>" & Trim("S2") & "</sii:TipoNoExenta>"
Else
    sEnv = sEnv & "<sii:TipoNoExenta>" & Trim("S1") & "</sii:TipoNoExenta>"
End If
    
    sEnv = sEnv & "<sii:DesgloseIVA>"
        sEnv = sEnv & "<sii:DetalleIVA>"
        sEnv = sEnv & "<sii:TipoImpositivo>" & Trim(Me.Impuestos) & "</sii:TipoImpositivo>"
        sEnv = sEnv & "<sii:BaseImponible>" & Replace(Format(Trim(Me.BaseImponible), "###0.00"), ",", ".") & "</sii:BaseImponible>"
        sEnv = sEnv & "<sii:CuotaRepercutida>" & Replace(Format(Trim(Me.TotalImpuestos), "###0.00"), ",", ".") & "</sii:CuotaRepercutida>"
        sEnv = sEnv & "</sii:DetalleIVA>"
    sEnv = sEnv & "</sii:DesgloseIVA>"

sEnv = sEnv & "</sii:NoExenta>"
sEnv = sEnv & "</sii:Sujeta>"
sEnv = sEnv & "</sii:DesgloseFactura>"
sEnv = sEnv & "</sii:TipoDesglose>"
sEnv = sEnv & "</siiLR:FacturaExpedida>"
                
sEnv = sEnv & "</siiLR:RegistroLRFacturasEmitidas>"
sEnv = sEnv & "</siiLR:SuministroLRFacturasEmitidas>"
sEnv = sEnv & "</soapenv:Body>"
sEnv = sEnv & "</soapenv:Envelope>"
    
    Dim sResponseHead As String
    Dim strvalue
    
    Set objHttp = CreateObject("MSXML2.ServerXMLHTTP")
    Set XMLDoc = New MSXML2.DOMDocument60
    objHttp.Open "Post", sUrl, False
    objHttp.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
    objHttp.SetOption SXH_OPTION_SELECT_CLIENT_SSL_CERT, Me.CboCertificado 
    
    objHttp.send (sEnv)
    
    XMLDoc.Load (objHttp.responseXML)
    
    
         If XMLDoc.ReadyState <> 4 Then Exit Sub
         
         Dim HTTPResult As String
         HTTPResult = objHttp.responseText
         MsgBox HTTPResult
     
        Dim stTextoRespuesta As String
        stTextoRespuesta = XMLDoc.documentElement.Text
        If Right(stTextoRespuesta, 8) = "correcto" Then
           'MsgBoxEx Me.hwnd, stTextoRespuesta, 3, vbCritical, "Balances"
           Me.TxtFechaPresentacion = Right(Left(stTextoRespuesta, 44), 19)
           Me.txtCsv = Left(stTextoRespuesta, 16)
        Else
           MsgBoxEx Me.hwnd, Right(stTextoRespuesta, 9), 3, vbCritical, "Balances"
           GoTo 120
        End If
 
     sResponseHead = objHttp.getAllResponseHeaders()
 
     Call ArchivaRespuesta("Emitida", HTTPResult, sResponseHead)   '& Chr(13) & Chr(10) &
     
     
    If XMLDoc.parseError.errorCode = 0 Then
        If XMLDoc.ReadyState = 4 Then
           AddNodeNif XMLDoc.documentElement
        End If
    Else
        MsgBox XMLDoc.parseError.reason & vbCrLf & XMLDoc.parseError.Line & vbCrLf & XMLDoc.parseError.srcText
    End If
    
    
    Call GuardaRegistroSII("Emitida")
    
    
120
    
    Set XMLDoc = Nothing
    Set objHttp = Nothing
    Set XMLDoc = Nothing

End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

curl + openssl + SII

Publicado por Francesc (5 intervenciones) el 14/06/2017 17:54:53
Hola de nuevo,
aún tengo problemas, perdonad que os moleste, parece que no "encuentra" los .pem

El "./" (punto barra) de delante de los nombres del certificado, ¿podéis decirme que significa?
¿Deben los ficheros .pem estar en algún lugar específico?


Gracias de nuevo.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

curl + openssl + SII

Publicado por AngelMiguel (8 intervenciones) el 14/06/2017 18:20:36
En el mismo directorio que el bat debe de estar el fichero xml que envias, el certificado ....salvo que indiques otra
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

curl + openssl + SII

Publicado por Pablo (5 intervenciones) el 14/06/2017 18:21:02
Eso indica que estan en el mismo directorio del curl, si los quieres poner en otro directorio después de cert pon la ruta completa, por cierto no permite direcciones de red tipo \\srevidor\c
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

curl + openssl + SII

Publicado por Francesc (5 intervenciones) el 16/06/2017 09:03:42
Solucionado.
He reinstalado el curl i ja funciona bien.

Creo que el problema lo tenía con el fichero curl-ca-bundle.crt

¿Podrías explicarme cual es la función de este almacén de certificados y que tiene que ver con el certificado que uso para firmar?

Y otra duda, el cURL lo he "dejado caer" en System32, ¿en aquellos equipos con Syswow en lugar de System32, haría lo mismo no?

De nuevo os agradezco muchísimo todas las pistas que me habéis dado.


Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar