Skip to content

Certificates

Use certificates to give a hostname a public TLS certificate. Request a cert, prove you own the name with DNS-01, then attach the issued cert to a Gateway custom domain. Skippr holds the private key; public operations never return it.

Status: Preview. See the API action reference for the full command list.

At a glance

FactValue
CLIskippr certs <operation>
Target prefixCloudCerts.
AuthenticationCloud JWT or SigV4 service certs
ValidationDNS-01
Private keyHeld by the platform; not returned by public operations
ContractAPI actions

What you can do

  • Request a certificate for one authorized domain and optional additional names.
  • Follow an issuance order from PENDING to ISSUED or FAILED.
  • Describe and list certificates.
  • Renew or delete a certificate.
  • Attach an issued certificate to a Gateway custom domain.

Before you start

You need skippr login or an operator/workload SigV4 key and permission to request certificates for the hostname. For automatic DNS-01 validation, manage the hostname's zone with DNS. If DNS is external, you must be able to publish the validation record returned by the request.

Site custom domains use a Sites DomainBinding and managed edge TLS. Do not request a gateway certificate for the same Site hostname.

Request, validate, and check a certificate

1. Request the certificate

The same request is CLI, Terraform, CDKTF TypeScript, or CDKTF Python. For provider credentials and the shared cloud provider block, see Terraform and CDKTF. Reuse the same clientToken when retrying the same CLI request. Terraform replacement creates a new certificate.

bash
skippr certs request-certificate --input - <<JSON
{
  "domainName": "api.example.com",
  "subjectAlternativeNames": ["www.api.example.com"],
  "clientToken": "cert-api-example-com-1"
}
JSON
hcl
resource "cloud_certificate" "api" {
  domain_name               = "api.example.com"
  subject_alternative_names = ["www.api.example.com"]
}
ts
import { CloudProvider, CloudCertificate } from "@skippr/provider-cloud";

const cloud = new CloudProvider(this, "cloud", { region: "eu-central-1" });

new CloudCertificate(this, "api", {
  domainName: "api.example.com",
  subjectAlternativeNames: ["www.api.example.com"],
  provider: cloud,
});
python
from skippr_cdktf import CloudProvider, CloudCertificate

cloud = CloudProvider(self, "cloud", region="eu-central-1")

CloudCertificate(
    self,
    "api",
    domain_name="api.example.com",
    subject_alternative_names=["www.api.example.com"],
    provider=cloud,
)

Save certificateId and, when present, orderId. Reuse the same clientToken when retrying the same request.

2. Complete DNS validation

For a Skippr Cloud-managed zone, certs publishes and removes the required DNS-01 record through DNS. No manual record call is required.

When you keep your own DNS, create the Gateway domain name first and pass the returned acmeDelegationCname ({token}.validation.skippr.io) on RequestCertificate. Publish _acme-challenge.{hostname} as a CNAME to that target. Skippr writes the challenge TXT at the CNAME target. Leave the CNAME in place for renewal. Do not put DNS provider credentials in the certificate request.

3. Read order status

bash
skippr certs get-order --order-id '<orderId>'

Read detail when the order reaches FAILED. When status is ISSUED, use DescribeCertificate to read the validity window and attach the certificateId to a supported gateway DomainName.

Understand certificates and orders

ConceptMeaning
CertificateCertificate metadata and an issued public chain
OrderOne issuance or renewal attempt
SANAnother hostname covered by the same certificate
DNS-01TXT-record proof that you control a hostname
certificateIdOpaque identifier used by describe, renew, delete, and gateway domain operations
orderIdOpaque identifier used by GetOrder

Order and certificate status values are:

StatusMeaning
PENDINGThe request was accepted
CHALLENGE_PLANNEDValidation record details are ready
CHALLENGE_PUBLISHEDManaged DNS published the challenge
VALIDATINGThe issuer is checking DNS
ISSUEDThe certificate is ready
FAILEDIssuance ended with an error; inspect detail
RENEWINGA renewal order is running
REVOKED, EXPIRED, DELETEDThe certificate cannot be used for new TLS attachment

Manage the lifecycle

TaskSupported operations
Request and track issuanceRequestCertificate, GetOrder
Read certificatesDescribeCertificate, ListCertificates
RenewRenewCertificate
RemoveDeleteCertificate

cloud_certificate is the Terraform resource for request, read, list, and delete lifecycle. CDKTF TypeScript and Python expose bindings generated from the same resource contract.

Limits and errors

  • Certificate names must be within your authorized domain scope.
  • Subject alternative name count and concurrent orders are bounded by issuer and Preview policy; no numeric public quota is currently guaranteed.
  • Issuer rate limits apply. Prefer idempotent retries instead of creating a new request for the same names.
  • Private keys are never returned by request, describe, list, or order operations.
  • 400: the domain, SAN, order, or request shape is invalid.
  • 401: authentication is missing or invalid.
  • 403: the caller is not authorized for one or more requested names.
  • 404: the certificate or order does not exist.
  • 409: the request conflicts with the current certificate or order state.
  • 500: certificate metadata or protected material could not be persisted.

DNS-01 or issuer failures return 400 with an invalid-request detail. Before retrying, fix the validation record when required; reuse the same clientToken for the same certificate request.