Para consumir WSDL del SII es necesario autenticarse, dicha autenticacion se realiza por medio de un certificado digital emitido por una entidad certificadora,ejemplo e-sign, el cual sirve para certificar una acción o un documento.
El SII tiene un proceso de autenticación el cual consiste:
1.- obtener una semilla.
2.- certificar la semilla.
3.- enviar semilla certificada.
4.- obtener token de acceso.
Antes de realizar alguna de estas acciones voy a mostrar como extraer el certificado digital desde nuestro navegador.
En este caso lo haré con un certificado emitido por e-sign .Lamentablemente e-sign solo emite certificados por medios de Windows/IExplorer , así que en una maquina virtual o en un equipo windows realizamos los siguientes pasos:
1.- Exportar certificado en PFX :
1.1 lo primero que debes hacer es abrir el internet explorer ir a opciones de internet pestaña contenido:
1.2 Presionar certificados y seleccionar el certificado a exportar:
1.3 Seleccionar exportar y se nos abrira una ventana similar a esta, le damos en siguiente :
1.4 debes seleccionar "Exportar la clave privada" y damos en siguiente:
1.5 luego pasamos hacemos la siguiente selección, y nuevamente presionamos siguiente:
1.6 en este punto nos pedira que ingresemos una contraseña por seguridad, ingresamos la que mas nos acomode y la recordaremos, puesto que es necesario para el proceso de autenticacion con el SII:
1.7 luego seleccionamos donde guardar nuestro certificado:
1.8 nos saldrá una ventana como la siguiente y le damos aceptar:
1.9 y luego nos dirá que la exportación fue exitosa.
Una ves obtenido el certificado podemos realizar el proceso completo de autenticacion automático con el siguiente script https://github.com/waflessnet/sii-bash/ , tanto en certificación como en producción.
Los siguientes párrafos explican como funciona el script.
2.- XMLSEC clave privada y certificado.
El SII nos pide firmar una semilla en formato XML, en linux existe una herramienta que nos permite realizar este proceso: xmlsec1.
Para firmar con xmlsec necesitamos la clave privada ,el certificado y un template a utilizar.
Para esto extraemos dicha clave privada y certificado del archivo .pfx que exportamos desde windows.
Ahora desde linux , gracias openssl, extraemos dichos documentos:
clave privada:
# openssl pkcs12 -in certificado.pfx -out claveprivada.pem -nocerts -nodes
certificado:
# openssl pkcs12 -in certificado.pfx -out certificado.pem -nokeys -clcerts
Estas instrucciones nos generan dos archivos claveprivada.pem y certificado.pem ahora utilizamos el siguiente template (http://pastebin.com/edueUfmB ) para firmar la semilla :
- <?xml version="1.0"?>
- <getToken>
- <item>
- <Semilla></Semilla>
- </item>
- <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
- <SignedInfo>
- <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
- <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
- <Reference URI="">
- <Transforms>
- <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
- </Transforms>
- <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
- <DigestValue/>
- </Reference>
- </SignedInfo>
- <SignatureValue/>
- <KeyInfo>
- <KeyValue>
- <RSAKeyValue>
- <Modulus/>
- <Exponent/>
- </RSAKeyValue>
- </KeyValue>
- <X509Data>
- <X509Certificate/>
- </X509Data>
- </KeyInfo>
- </Signature>
- </getToken>
3.- Firmar
Ya con los datos obtenidos en el punto 2 vamos a firmar el template para ello debemos colocar la semilla obtenida del consumo del WSDL (https://maullin.sii.cl/DTEWS/CrSeed.jws?WSDL ) , cabe destacar que todo esto lo realizaremos en ambiente certificación, dentro del tag : <semilla></semilla> , asumiremos que obtenemos "semilla123435" del servicio , luego con sed y regex remplazamos:
sed 's/<Semilla>.*<\/Semilla>/<Semilla>semilla123435<\/Semilla>/g' template.xml > semilla.xml
Ahora firmamos el template xml con la herramienta xmlsec1 :
xmlsec1 --sign --privkey-pem claveprivada.pem,certificado.pem --pwd 'contraseña$car@qass' semilla.xml > semilla-firmada.xml
Debemos modificar la semilla firmada para agregar el formato del WSDL que exige el SII, nuevamente con sed y regex :
sed -i '1s|<\?|<pszXml xsi:type="xsd:string"><!\[CDATA\[<|' semilla-firmada.xml
sed -i '79s|<\/getToken>|<\/getToken>\]\]><\/pszXml>|' semilla-firmada.xml
Luego en el request que exige el SII ( https://github.com/waflessnet/sii-bash/blob/master/rGetToken.xml) lo seteamos para agregar nuestro XML :
sed -n "1,4p" rGetToken.xml > request-token.xml
cat tmp/semilla-firmada.xml >> request-token.xml
sed -n "6,8p" rGetToken.xml >> request-token.xml
Una vez realizado esto llamamos al WSDL para obtener el token: https://mauliin.sii.cl/DTEWS/GetTokenFromSeed.jws?wsdl ,todo esto certificación, enviamos request-token.xml
Con esto obtenemos el Token de acceso en el servicio.
El procedimiento de consumo completo del SII automático , es decir llamadas a los WSDL y respectiva firma, lo encuentras en mi github : https://github.com/waflessnet/sii-bash/
Este script obtiene el Token directamente, es decir, desde el pfx obtiene el certificado y la clave privada luego obtiene la semilla ,esta semilla la firma y la envia al WSDL https://xxxxxx.sii.cl/DTEWS/GetTokenFromSeed.jws , y nos entrega el token.
El script bash nos permite obtener el token de acceso en certificación (maullin) tanto como en producción (palena).
Hola, tengo un error con tu ejemplo, estás respondiendo consultas???
ResponderEliminarpor supuesto
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarHola, Una consulta, en mi dispositivo TOKEN, a la hora de querer exportar el certificado no me deja el paso "1.4 debes seleccionar "Exportar la clave privada" y damos en siguiente:"
ResponderEliminarSolo puedo Exportar el Certificado Digital, es posible autentificarse solo con el Certificado?
quedo atento, agracias por tu publicación
Estimados al consumir el WS, me devuelve el siguiente error:
ResponderEliminarNo such operation 'getToken'
Tengo el mismo problema, averiguamos con el SII directamente, al parecer hay un tag que esta modificado en el evento de generar token.
Eliminarsi necesitan aún, pueden levantar las issue en https://github.com/waflessnet/sii-bash
ResponderEliminaral ejecutar ./consumewsdl.sh (certificado) (clave) (servidor) me sale el error "Error:4 No existe semilla,favor verifique su acceso al WSDL CrSeed.jws", modifiqué la URL por la actual https://ws1.sii.cl/WSAUT/services/CrSeed?WSDL. Cómo lo puedo solucionar?
ResponderEliminardebes cambiar el servidor por palena.sii.cl y los servicios terminan en .jws?WSDL
EliminarGracias, tú ejemplo me sirvió para una implementación en otro lenguaje, ya que hay poco del tema. Saludos
ResponderEliminarBuenas! muchas gracias por el script, funciona de maravilla. Consulta, tenes algo parecido pero para enviar los comprobantes de boletas? Gracias de nuevo!
ResponderEliminarHola Leonardo, no lo siento.
Eliminar