# Manual de Desarrollador - Autenticación Automática SII

**Documento base:** `autenticacion.pdf`  
**Nombre original:** Manual de Desarrollador - Autenticación Automática  
**Código:** OI2007_AUTAUTOM_MDE_1.9  
**Institución:** Servicio de Impuestos Internos - Subdirección Informática  
**Versión:** 1.9 del 18/11/2007  

> Nota de conversión: este archivo Markdown corresponde a una versión estructurada y limpia del contenido técnico del manual de autenticación automática del SII. Está orientado a uso de implementación de API, integración, pruebas y certificación. Se mantuvieron los elementos técnicos relevantes: flujo, WSDL, parámetros, estados, XML de entrada/salida y endpoints de certificación/producción.

---

## Índice

1. Introducción
2. Capítulo 1 - Análisis del sistema
3. Capítulo 2 - Visión general del sistema
4. Capítulo 3 - WSDL de autenticación automática
5. Capítulo 4 - Parámetros de entrada
6. Capítulo 5 - Parámetros de salida
7. Capítulo 6 - Ejemplos XML de respuesta
8. Capítulo 7 - Guía para realizar pruebas
9. Capítulo 8 - Cómo firmar una semilla
10. Anexo 1 - Ejemplo de token
11. Checklist técnico para una API de integración con SII

---

# Introducción

El método de autenticación automática, denominado **AUTAUTOM**, corresponde a un mecanismo mediante el cual el SII verifica el uso de la llave privada del certificado digital del cliente a través de Web Services.

Para cumplir su objetivo, AUTAUTOM entrega dos Web Services principales:

- `CrSeed`
- `GetTokenFromSeed`

Mediante estos servicios se obtiene:

1. Un texto aleatorio o **semilla**.
2. Un **token** de autenticación.

Estos elementos son requisitos para autenticar a una aplicación frente al SII y luego poder consumir otros servicios asociados a factura electrónica u otros procesos habilitados.

El documento está dirigido a desarrolladores que deben utilizar y probar los servicios `CrSeed` y `GetTokenFromSeed`.

Para acceder a los servicios del SII se utiliza WSDL, es decir, **Web Services Definition Language**, lenguaje descriptor basado en XML que permite conocer la ubicación, formato, tipos de datos, funciones, parámetros de entrada y salida de un Web Service.

## WSDL principales en producción

```txt
https://palena.sii.cl/DTEWS/CrSeed.jws?WSDL
https://palena.sii.cl/DTEWS/GetTokenFromSeed.jws?WSDL
```

## Requisitos de uso

Para utilizar este manual se requiere conocimiento previo de:

- XML.
- Web Services.
- Certificado digital.
- Firma XML.

---

# Capítulo 1 - Análisis del sistema

El sistema permite implementar autenticación automática mediante Web Services y certificado digital.

AUTAUTOM está implementado bajo una lógica B2B, que permite que las aplicaciones se comuniquen entre sí mediante llamadas de programa a programa.

A grandes rasgos, el flujo es el siguiente:

1. El cliente remoto solicita al SII un texto aleatorio llamado **semilla**.
2. El SII genera la semilla y la entrega al cliente.
3. El cliente firma la semilla con la llave privada de su certificado digital.
4. El cliente envía la semilla firmada al SII.
5. El SII valida:
   - La firma.
   - La vigencia de la semilla.
   - El certificado digital.
6. Si la validación es correcta, el SII entrega un **token**.
7. El token permite acceder a otras aplicaciones del SII sin autenticarse nuevamente.

## 1.1 Quiénes pueden utilizar esta aplicación

Puede ser utilizada por personas o empresas que tengan registrada una clave secreta en las bases de datos del SII.

El sistema permite autenticarse mediante certificado digital válido para el SII.

## 1.2 Objetivo de la aplicación

El objetivo de la aplicación es entregar una solución de autenticación automática frente al SII.

## 1.3 Características de la aplicación

- Autenticación programa a programa.
- Autenticación sin intervención humana por parte del servidor.
- Desarrollo en base a Web Services.
- Autenticación mediante certificado digital.
- El cliente debe estar registrado en las bases del SII como contribuyente habilitado para ingresar a aplicaciones autenticadas de Internet.

---

# Capítulo 2 - Visión general del sistema

El flujo general de autenticación es:

```mermaid
sequenceDiagram
    participant Cliente as Aplicación Cliente
    participant CrSeed as WS CrSeed.jws
    participant Token as WS GetTokenFromSeed.jws
    participant SII as SII

    Cliente->>CrSeed: Request Semilla
    CrSeed-->>Cliente: Response Semilla
    Cliente->>Cliente: Firma semilla con certificado digital
    Cliente->>Token: Envía semilla firmada
    Token->>SII: Valida XML, semilla, certificado y firma
    alt Validación OK
        Token-->>Cliente: Envía Token
    else Validación fallida
        Token-->>Cliente: Error XML
    end
```

Para autenticarse, el cliente debe solicitar una semilla mediante un request al Web Service `CrSeed.jws`.

El Web Service genera automáticamente una semilla en formato XML. La semilla es almacenada en una base de datos y luego enviada al cliente.

La semilla es un número único y aleatorio, utilizado como identificador de sesión, y tiene una duración de **2 minutos**.

Una vez recibida la semilla, el cliente debe firmarla y enviarla en formato XML estándar al SII mediante el Web Service `GetTokenFromSeed.jws`.

El SII valida:

- Que el XML cumpla el formato solicitado.
- Que la semilla esté vigente.
- Que el certificado digital sea válido.
- Que la firma sea válida.

Si la validación es correcta, se genera un token. Si falla, el Web Service responde con un mensaje de error en XML.

## Información que debe contener el XML de semilla firmada

- Semilla.
- Firma.
- Módulo de la llave pública.
- Certificado digital.

---

# Capítulo 3 - WSDL de autenticación automática

AUTAUTOM entrega dos Web Services:

- `CrSeed`
- `GetTokenFromSeed.jws`

## 3.1.1 WSDL de `CrSeed.jws`

`CrSeed` entrega el método `getSeed`, que permite obtener una semilla.

### Endpoint producción

```txt
https://palena.sii.cl/DTEWS/CrSeed.jws?WSDL
```

### Fragmento WSDL relevante

```xml
<wsdl:definitions targetNamespace="https://palena.sii.cl/DTEWS/CrSeed.jws"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:apachesoap="http://xml.apache.org/xml-soap"
    xmlns:impl="https://palena.sii.cl/DTEWS/CrSeed.jws"
    xmlns:intf="https://palena.sii.cl/DTEWS/CrSeed.jws"
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <wsdl:types/>

    <wsdl:message name="getSeedRequest" />

    <wsdl:message name="getSeedResponse">
        <wsdl:part name="getSeedReturn" type="xsd:string" />
    </wsdl:message>

    <wsdl:portType name="CrSeed">
        <wsdl:operation name="getSeed">
            <wsdl:input message="impl:getSeedRequest" name="getSeedRequest" />
            <wsdl:output message="impl:getSeedResponse" name="getSeedResponse" />
        </wsdl:operation>
    </wsdl:portType>

    <wsdl:binding name="CrSeedSoapBinding" type="impl:CrSeed">
        <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
        <wsdl:operation name="getSeed">
            <wsdlsoap:operation soapAction="" />
            <wsdl:input name="getSeedRequest">
                <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
                    namespace="https://palena.sii.cl/DTEWS/CrSeed.jws"
                    use="encoded" />
            </wsdl:input>
            <wsdl:output name="getSeedResponse">
                <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
                    namespace="https://palena.sii.cl/DTEWS/CrSeed.jws"
                    use="encoded" />
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>

    <wsdl:service name="CrSeedService">
        <wsdl:port binding="impl:CrSeedSoapBinding" name="CrSeed">
            <wsdlsoap:address location="https://palena.sii.cl/DTEWS/CrSeed.jws" />
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>
```

## 3.1.2 WSDL de `GetTokenFromSeed.jws`

`GetTokenFromSeed` entrega el método `getToken`, que permite obtener un token.

### Endpoint producción

```txt
https://palena.sii.cl/DTEWS/GetTokenFromSeed.jws?WSDL
```

### Operaciones relevantes

- `getVersion`
- `getToken`

El método `getToken` recibe como parámetro `pszXml`, que corresponde al XML de la semilla firmada.

```xml
<wsdl:message name="getTokenRequest">
    <wsdl:part name="pszXml" type="xsd:string" />
</wsdl:message>
```

---

# Capítulo 4 - Parámetros de entrada

## 4.1.1 Parámetros de entrada para `CrSeed.jws`

`CrSeed.jws` no tiene parámetros de entrada.

## 4.1.2 Ejemplo SOAP para solicitar semilla

```xml
<SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
        <m:getSeed xmlns:m="https://palena.sii.cl/DTEWS/CrSeed.jws" />
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

## 4.1.3 Parámetros de entrada para `GetTokenFromSeed.jws`

Los parámetros de entrada de `GetTokenFromSeed.jws` corresponden a un string formado por los campos del XML que envía la semilla firmada.

## 4.1.4 Ejemplo SOAP para obtener token

```xml
<SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
        <m:getToken xmlns:m="https://palena.sii.cl/DTEWS/GetTokenFromSeed.jws">
            <pszXml xsi:type="xsd:string">String</pszXml>
        </m:getToken>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

## 4.1.5 XML de entrada para semilla firmada

El XML debe contener la semilla y la firma bajo el estándar XML Digital Signature.

```xml
<?xml version="1.0"?>
<getToken>
    <item>
        <Semilla>10</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>...</DigestValue>
            </Reference>
        </SignedInfo>
        <SignatureValue>...</SignatureValue>
        <KeyInfo>
            <KeyValue>
                <RSAKeyValue>
                    <Modulus>...</Modulus>
                    <Exponent>AQAB</Exponent>
                </RSAKeyValue>
            </KeyValue>
            <X509Data>
                <X509Certificate>...</X509Certificate>
            </X509Data>
        </KeyInfo>
    </Signature>
</getToken>
```

---

# Capítulo 5 - Parámetros de salida

## 5.1.1 Parámetros de salida

La salida de los servicios corresponde a un string XML codificado según estándar XML. Por lo tanto, el cliente debe decodificar el string y llevarlo a su formato XML original.

Los campos de retorno son:

- `ESTADO`
- `GLOSA`
- `DATOS`, que puede corresponder a `SEED`, `SEMILLA` o `TOKEN` según el servicio.

| Campo | Tipo | Largo | Detalle | Obligatorio |
|---|---|---:|---|---|
| `ESTADO` | String alfanumérico | 1-8 | Código de estado | Sí |
| `GLOSA` | String alfanumérico | 1-1 | Detalle del estado | Sí |
| `DATOS` | String numérico | 1-5 | Nombre del tag variable según dato solicitado | Sí |

## 5.2.2 Estados de salida de `CrSeed`

| Estado | Detalle |
|---|---|
| `00` | OK, genera semilla |
| `-1` | No se registró línea en el archivo de configuración |
| `-2` | Error de retorno |

Errores asociados al estado `-2`:

- `ERROR RETORNO`
- `NO PUEDO CREAR O ACT. TOKEN`

## 5.2.2 Estados de salida de `GetTokenFromSeed`

| Estado | Detalle |
|---|---|
| `00` | Token creado |
| `01` | XML inválido, IOException, función `valSignedXml` |
| `02` | XML inválido, SAXException, función `valSignedXml` |
| `03` | XML inválido, ParserConfigurationException, función `valSignedXml` |
| `04` | XML inválido, elemento `Signature` no existe, función `valSignedXml` |
| `05` | XML inválido, firma inválida, función `valSignedXml` |
| `06` | XML inválido, elemento `Semilla` no existe, función `getSeed` |
| `07` | Error `MessageException` |
| `08` | Error de retorno |
| `09` | Error `MessageException` |
| `10` | Error de retorno |
| `11` | XML inválido, elemento `Certificate` no existe, función `getCertificado` |
| `12` | Error `MessageException` |
| `21` | Firma inválida; la llave pública no coincide con la del certificado |
| `-3` | Error en autenticación |
| `-07` | Error de parse en validación de RUT; verificar que el usuario esté registrado en el SII con autenticación mediante certificado digital |

Errores asociados al estado `08`:

- `PARAMETROS INCORRECTOS`
- `TIME-OUT DEL SEED`
- `NO GENERA TOKEN func:CreaToken`
- `NO PUEDO ACT. SEED CON TOKEN`
- `NO Existe SEED`

Errores asociados al estado `10`:

- `ERROR RETORNO DATOS`
- `NO PUEDO CREAR O ACT. TOKEN`

## 5.2.3 Ejemplo de salida codificada de `CrSeed.jws`

```xml
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <ns1:getSeedResponse
            soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
            xmlns:ns1="https://palena.sii.cl/DTEWS/CrSeed.jws">
            <getSeedReturn xsi:type="xsd:string">
                &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
                &lt;SII:RESPUESTA xmlns:SII=&quot;http://www.sii.cl/XMLSchema&quot;&gt;
                &lt;SII:RESP_HDR&gt;&lt;ESTADO&gt;00&lt;/ESTADO&gt;&lt;/SII:RESP_HDR&gt;
                &lt;SII:RESP_BODY&gt;&lt;SEMILLA&gt;000000000078&lt;/SEMILLA&gt;&lt;/SII:RESP_BODY&gt;
                &lt;/SII:RESPUESTA&gt;
            </getSeedReturn>
        </ns1:getSeedResponse>
    </soapenv:Body>
</soapenv:Envelope>
```

## Salida decodificada de `CrSeed.jws`

```xml
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/XMLSchema">
    <SII:RESP_HDR>
        <ESTADO>00</ESTADO>
    </SII:RESP_HDR>
    <SII:RESP_BODY>
        <SEMILLA>000000000078</SEMILLA>
    </SII:RESP_BODY>
</SII:RESPUESTA>
```

## Ejemplo salida codificada de `GetTokenFromSeed.jws`

```xml
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <ns1:getTokenResponse
            soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
            xmlns:ns1="http://palena.sii.cl/DTEWS/GetTokenFromSeed.jws">
            <getTokenReturn xsi:type="xsd:string">
                &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
                &lt;SII:RESPUESTA xmlns:SII=&quot;http://www.sii.cl/XMLSchema&quot;&gt;
                &lt;SII:RESP_HDR&gt;&lt;ESTADO&gt;00&lt;/ESTADO&gt;&lt;GLOSA&gt;Token Creado&lt;/GLOSA&gt;&lt;/SII:RESP_HDR&gt;
                &lt;SII:RESP_BODY&gt;&lt;TOKEN&gt;XAuSbYXiNh9Ik&lt;/TOKEN&gt;&lt;/SII:RESP_BODY&gt;
                &lt;/SII:RESPUESTA&gt;
            </getTokenReturn>
        </ns1:getTokenResponse>
    </soapenv:Body>
</soapenv:Envelope>
```

## Salida decodificada de `GetTokenFromSeed.jws`

```xml
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/XMLSchema">
    <SII:RESP_HDR>
        <ESTADO>00</ESTADO>
        <GLOSA>Token Creado</GLOSA>
    </SII:RESP_HDR>
    <SII:RESP_BODY>
        <TOKEN>XAuSbYXiNhIk</TOKEN>
    </SII:RESP_BODY>
</SII:RESPUESTA>
```

---

# Capítulo 6 - Ejemplos XML de respuesta

## 6.1 Ejemplo salida genera semilla

### Estado `00` - genera semilla

```xml
<?xml version="1.0" encoding="UTF-8"?>
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/xxx">
    <SII:RESP_HDR>
        <ESTADO>00</ESTADO>
    </SII:RESP_HDR>
    <SII:RESP_BODY>
        <SEED>00000000064</SEED>
    </SII:RESP_BODY>
</SII:RESPUESTA>
```

### Estado `-1` - error no genera semilla

```xml
<?xml version="1.0" encoding="UTF-8"?>
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/xxx">
    <SII:RESP_HDR>
        <ESTADO>-1</ESTADO>
        <GLOSA>Error : (Message Exception)</GLOSA>
    </SII:RESP_HDR>
</SII:RESPUESTA>
```

### Estado `-2` - error BD / retorno

```xml
<?xml version="1.0" encoding="UTF-8"?>
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/xxx">
    <SII:RESP_HDR>
        <ESTADO>-2</ESTADO>
        <GLOSA>ERROR RETORNO</GLOSA>
    </SII:RESP_HDR>
</SII:RESPUESTA>
```

## 6.2 Ejemplo salida genera token

### Estado `00` - genera token

```xml
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/xxx">
    <SII:RESP_HDR>
        <ESTADO>00</ESTADO>
        <GLOSA>Token Creado</GLOSA>
    </SII:RESP_HDR>
    <SII:RESP_BODY>
        <TOKEN>AB82001ABRT</TOKEN>
    </SII:RESP_BODY>
</SII:RESPUESTA>
```

### Estado `01` - XML inválido, IOException

```xml
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/xxx">
    <SII:RESP_HDR>
        <ESTADO>01</ESTADO>
        <GLOSA>XML invalido (IOException), función valSignedXml</GLOSA>
    </SII:RESP_HDR>
</SII:RESPUESTA>
```

### Estado `02` - XML inválido, SAXException

```xml
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/xxx">
    <SII:RESP_HDR>
        <ESTADO>02</ESTADO>
        <GLOSA>XML Invalido (SAXException), funcion valSignedXml</GLOSA>
    </SII:RESP_HDR>
</SII:RESPUESTA>
```

### Estado `08` - time-out del seed

```xml
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/xxx">
    <SII:RESP_HDR>
        <ESTADO>08</ESTADO>
        <GLOSA>TIME-OUT DEL SEED</GLOSA>
    </SII:RESP_HDR>
</SII:RESPUESTA>
```

### Estado `09` - MessageException

```xml
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/xxx">
    <SII:RESP_HDR>
        <ESTADO>09</ESTADO>
        <GLOSA>ERROR (MessageException)</GLOSA>
    </SII:RESP_HDR>
</SII:RESPUESTA>
```

### Estado `10` - error retorno datos

```xml
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/xxx">
    <SII:RESP_HDR>
        <ESTADO>10</ESTADO>
        <GLOSA>ERROR RETORNO DATOS</GLOSA>
    </SII:RESP_HDR>
</SII:RESPUESTA>
```

### Estado `11` - elemento `Certificate` no existe

```xml
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/xxx">
    <SII:RESP_HDR>
        <ESTADO>11</ESTADO>
        <GLOSA>XML Invalido, elemento Certificate no existe, función getCertificado</GLOSA>
    </SII:RESP_HDR>
</SII:RESPUESTA>
```

### Estado `12` - MessageException

```xml
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/xxx">
    <SII:RESP_HDR>
        <ESTADO>12</ESTADO>
        <GLOSA>ERROR (12) (MessageException)</GLOSA>
    </SII:RESP_HDR>
</SII:RESPUESTA>
```

### Estado `-3` - error en autenticación

```xml
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/xxx">
    <SII:RESP_HDR>
        <ESTADO>-3</ESTADO>
        <GLOSA>Error en Autenticación</GLOSA>
    </SII:RESP_HDR>
</SII:RESPUESTA>
```

---

# Capítulo 7 - Guía para realizar pruebas

Para probar los Web Services de autenticación automática se deben seguir estos pasos:

1. Obtener una semilla invocando el servicio `CrSeed.jws`.
2. Firmar la semilla mediante un cliente, usando el formato XML de entrada.
3. Invocar `GetTokenFromSeed.jws`, enviando el XML con la semilla firmada.
4. Obtener el token.

## Producción

```txt
https://palena.sii.cl/DTEWS/CrSeed.jws?WSDL
https://palena.sii.cl/DTEWS/GetTokenFromSeed.jws?WSDL
```

## Certificación

Para ambiente de certificación se reemplaza `palena.sii.cl` por `maullin.sii.cl`.

```txt
https://maullin.sii.cl/DTEWS/CrSeed.jws?WSDL
https://maullin.sii.cl/DTEWS/GetTokenFromSeed.jws?WSDL
```

---

# Capítulo 8 - Cómo firmar una semilla

Para firmar una semilla se deben seguir los siguientes pasos:

1. Obtener una semilla invocando `CrSeed.jws` en certificación o producción.
2. Leer la respuesta XML.
3. Extraer el campo que contiene la semilla.
4. Construir el objeto `getToken` con la semilla.
5. Firmar dicho objeto con XML Digital Signature.
6. Enviar el XML firmado al servicio `GetTokenFromSeed.jws`.

## Ejemplo respuesta `CrSeed.jws`

```xml
<?xml version="1.0" encoding="UTF-8"?>
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/XMLSchema">
    <SII:RESP_BODY>
        <SEMILLA>000002360958</SEMILLA>
    </SII:RESP_BODY>
    <SII:RESP_HDR>
        <ESTADO>00</ESTADO>
    </SII:RESP_HDR>
</SII:RESPUESTA>
```

## Campo a firmar

```xml
<SEMILLA>000002360958</SEMILLA>
```

## Objeto `getToken`

```xml
<getToken>
    <item>
        <Semilla>000002360958</Semilla>
    </item>
</getToken>
```

## Pasos criptográficos

Una vez integrado el objeto `getToken` con la semilla, se deben realizar los siguientes pasos:

1. Aplicar transformación y canonicalización al objeto.
2. Calcular el hash del objeto para crear `DigestValue`.
3. Crear el elemento `SignedInfo`.
4. Canonicalizar y calcular la firma.
5. Crear `SignatureValue` con el valor de la firma.
6. Generar la información de claves en `KeyInfo`.

Estos pasos pueden ser realizados manualmente o mediante una librería de firma XML.

## Ejemplo estructura final firmada

```xml
<?xml version="1.0"?>
<getToken>
    <item>
        <Semilla>000002248802</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>...</DigestValue>
            </Reference>
        </SignedInfo>
        <SignatureValue>...</SignatureValue>
        <KeyInfo>
            <KeyValue>
                <RSAKeyValue>
                    <Modulus>...</Modulus>
                    <Exponent>AQAB</Exponent>
                </RSAKeyValue>
            </KeyValue>
            <X509Data>
                <X509Certificate>...</X509Certificate>
            </X509Data>
        </KeyInfo>
    </Signature>
</getToken>
```

El elemento `Signature` corresponde al parámetro de entrada requerido por el Web Service `GetTokenFromSeed.jws` para generar el token.

---

# Anexo 1 - Ejemplo de token

```txt
TOKEN=gd43dh6sfE34Kd3
```

---

# Checklist técnico para una API de integración con SII

Para que una API esté preparada para iniciar integración y certificación contra SII, debería contemplar al menos estos módulos internos:

## Autenticación SII

- [ ] Endpoint para solicitar semilla a `CrSeed.jws`.
- [ ] Parser de respuesta XML de semilla.
- [ ] Firma XML de semilla usando certificado digital.
- [ ] Endpoint para solicitar token a `GetTokenFromSeed.jws`.
- [ ] Cache de token.
- [ ] Manejo de expiración y renovación.
- [ ] Trazabilidad de errores de autenticación.

## Certificado digital

- [ ] Carga segura de certificado.
- [ ] Custodia segura de llave privada.
- [ ] Soporte para PFX/P12 o formato usado por el proveedor.
- [ ] Validación de vigencia del certificado.
- [ ] Registro del RUT autorizado para operar.

## Ambientes

- [ ] Configuración de ambiente de certificación.
- [ ] Configuración de ambiente de producción.
- [ ] Cambio parametrizable entre `maullin.sii.cl` y `palena.sii.cl`.

## SOAP/XML

- [ ] Cliente SOAP compatible con RPC/encoded.
- [ ] Serialización y deserialización XML.
- [ ] Decodificación de respuestas XML codificadas como string.
- [ ] Manejo de namespaces.
- [ ] Manejo de XML Digital Signature.

## Manejo de errores

- [ ] Interpretación de estados `CrSeed`.
- [ ] Interpretación de estados `GetTokenFromSeed`.
- [ ] Reintentos controlados.
- [ ] Control del timeout de semilla de 2 minutos.
- [ ] Logs técnicos con request/response sanitizados.

## Endpoints internos sugeridos

```txt
POST /sii/auth/seed
POST /sii/auth/token
GET  /sii/auth/token/status
POST /sii/auth/sign-seed
GET  /sii/health/certificado
GET  /sii/health/wsdl
```

## Endpoints SII relevantes para autenticación

### Certificación

```txt
https://maullin.sii.cl/DTEWS/CrSeed.jws?WSDL
https://maullin.sii.cl/DTEWS/GetTokenFromSeed.jws?WSDL
```

### Producción

```txt
https://palena.sii.cl/DTEWS/CrSeed.jws?WSDL
https://palena.sii.cl/DTEWS/GetTokenFromSeed.jws?WSDL
```

---

# Observaciones para implementación actual

Este documento cubre únicamente la autenticación automática. Para completar una API de facturación electrónica DTE ante el SII también deberías revisar e implementar, además:

- Envío automático de DTE.
- Consulta de estado de envío.
- Consulta de estado de DTE.
- Manejo de CAF y folios.
- Firma de DTE.
- Timbre electrónico TED.
- Generación de PDF/timbre PDF417.
- Intercambio entre contribuyentes.
- Acuse de recibo.
- Aceptación o rechazo comercial.
- Bitácora, auditoría y respaldo.

