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).