> ## Documentation Index
> Fetch the complete documentation index at: https://docs.basaltic.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Emisión de un certificado

> El desafío DNS comienza a terminar, quien publica el CNAME, comodines, y la elección de un algoritmo de clave.

<a id="issuing-a-certificate" />

## Emisión de un certificado

La emisión es asíncrona. `POST /v1/certificates` responde **`202`** con el certificado en `pending_dns` y la lista completa de `challenges`. Use los nombres y destinos CNAME devueltos inmediatamente; no es necesario consultarlos. Si falla la planificación de desafíos, la creación falla sin guardar un certificado o una lista de desafíos parcial.

<Steps>
  <Step title="Crear el certificado">
    <Tabs>
      <Tab title="Console">
        Vaya a **Certificates** y elija **Create Certificate**. Dale un **Name**, agrega cada **Domain** y deja la fuente en **Auto-issue
        via DNS challenge**.

        El certificado aparece en la lista de inmediato y la página de detalles muestra **Configure DNS to complete certificate issuance** con los registros que se van a publicar.
      </Tab>

      <Tab title="API">
        ```bash theme={null}
        POST https://certificate.sa-saopaulo-1.basaltic.sh/v1/certificates
        {
          "name": "prod-frontend",
          "domains": ["example.com", "www.example.com"]
        }
        ```
      </Tab>

      <Tab title="CLI">
        ```bash theme={null}
        basaltic certificate create \
          --name prod-frontend \
          --domains example.com,www.example.com
        ```
      </Tab>

      <Tab title="Go">
        ```go theme={null}
        cfg, err := basaltic.NewConfig(ctx,
            basaltic.WithClientCredentials(os.Getenv("BASALTIC_ACCESS_KEY_ID"), os.Getenv("BASALTIC_SECRET_ACCESS_KEY")),
            basaltic.WithRegion("sa-saopaulo-1"),
        )
        if err != nil {
            log.Fatal(err)
        }

        crt, err := certificate.New(cfg).CreateCertificate(ctx, &certificate.CertificateIssueRequest{
            Name:    "prod-frontend",
            Domains: []string{"example.com", "www.example.com"},
        })
        ```

        Los certificados son regionales, por lo que la configuración necesita una región.
      </Tab>
    </Tabs>

    `name` es único por cuenta y cae en el CRN, por lo que tiene que ser URL-safe — letras, dígitos, punto, guion, subrayado.

    La respuesta de creación incluye un desafío por dominio normalizado, cada uno llevando `cname_record_name`, `expected_cname` y `our_dns`. La página de detalles de la consola muestra **Creación automática** cuando alojamos la zona y **A la espera de CNAME** cuando necesita publicar el registro. Utilice **Copiar nombre CNAME** y **Copiar valor esperado** para copiar sus dos mitades.
  </Step>

  <Step title="Publicar el CNAME">
    Cada desafío necesita `_acme-challenge.<domain>` apuntando a `expected_cname` de ese desafío. Si haces algo aquí depende de quién aloja la zona — ver más abajo.
  </Step>

  <Step title="Esperar por activación">
    Consulta `GET /v1/certificates/{certificate_id}` o actualiza la página de detalles de la consola para seguir el progreso de la emisión.

    Cada desafío invierte `verified: true` a medida que su CNAME se resuelve. Una vez que cada desafío se verifica y la firma se completa, el certificado se convierte en `active` y `certificate_pem`, `fingerprint`, `issued_at` y `expires_at` se rellenan.
  </Step>
</Steps>

<a id="who-publishes-the-cname" />

### Quién publica el CNAME

<Tabs>
  <Tab title="Dominio en Basaltic DNS">
    El reto vuelve con `our_dns: true`. Basaltic crea el CNAME automáticamente durante la emisión, después de la respuesta de creación. No necesitas publicarlo tú mismo; espera hasta que `verified` se convierta en true.
  </Tab>

  <Tab title="Dominio alojado en otro lugar">
    El desafío vuelve con `our_dns: false`. Añade el registro en tu registrador, exactamente como lo llama el desafío:

    ```dns theme={null}
    _acme-challenge.example.com.  CNAME  <expected_cname>
    ```

    Tome `expected_cname` del desafío en lugar de copiarlo de cualquier otro lugar. El destino es estable para el dominio de validación y es donde se publica el TXT de validación durante la emisión.

    <Note>
      La delegación es un trabajo único por dominio, no por emisión. Deja el CNAME en su lugar y las renovaciones se validan sin que vuelvas a tocar DNS.
    </Note>
  </Tab>
</Tabs>

<a id="wildcards" />

### Comodines

Una SAN comodín se valida en su nombre **padre**, no en la SAN literal — esto es [RFC 8555 §8.4](https://datatracker.ietf.org/doc/html/rfc8555#section-8.4). Así que un certificado para `*.example.com` necesita:

```dns theme={null}
_acme-challenge.example.com.  CNAME  <expected_cname>
```

El `cname_record_name` del desafío ya cuenta para esto; publica lo que dice y el comodín se encarga de sí mismo.

<Warning>
  Un pedido con comodín solo puede ser firmado por una autoridad con capacidad de comodín. Si no hay ninguno disponible, el certificado falla en lugar de volver a uno que no puede emitirlo.
</Warning>

<a id="key-algorithms" />

## Algoritmos clave

`key_algorithm` es por defecto **`ecdsa-p256`** y no se puede cambiar después de la creación — emite un nuevo certificado para cambiar a un algoritmo diferente.

<Columns cols={2}>
  <Card title="ECDSA" icon="feather">
    `ecdsa-p256` (predeterminado), `ecdsa-p384`. Teclas más pequeñas, apretones de manos más rápidos. Prefiera estos a menos que un cliente requiera RSA.
  </Card>

  <Card title="RSA" icon="building">
    `rsa-2048`, `rsa-4096`. Para clientes y dispositivos antiguos que no negociarán una cadena ECDSA.
  </Card>
</Columns>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.