Step CA

Step CA ist ein leicht zu bedienender Zertifikatsautorität-Server für X.509 und SSH Zertifikatsmanagement. Das separate Step CLI kann für einfaches Zertifikatsmanagement eigenständig operieren oder sogar über diverse Protokolle mit anderen Zertifikatsservern arbeiten.

Der Step CA Server implementiert mehrere Provisioner-Protokolle wie ACME, SCEP und weitere. Somit eignet er sich sehr gut für lokale Testsetups von Software und Systemen (die z.B. nicht gegen öffentliche Services wie Let’s Encrypt gehen können/sollen).

Installation

# Step CA - Der Server
dnf install https://dl.smallstep.com/certificates/docs-ca-install/latest/step-ca_amd64.rpm

# Step CLI - Der Client, kann auch separat genutzt werden
dnf install https://dl.smallstep.com/cli/docs-ca-install/latest/step-cli_amd64.rpm

CA erstellen und verwalten

# Interaktives Setup
step ca init
# ✔ Deployment Type: Standalone
# What would you like to name your new PKI?
# ✔ (e.g. Smallstep): Example CA
# What DNS names or IP addresses will clients use to reach your CA?
# ✔ (e.g. ca.example.com[,10.1.2.3,etc.]): localhost,ca.example.com
# What IP and port will your new CA bind to? (:443 will bind to 0.0.0.0:443)
# ✔ (e.g. :443 or 127.0.0.1:443): :443
# What would you like to name the CA's first provisioner?
# ✔ (e.g. you@smallstep.com): admin@example.com
# Choose a password for your CA keys and first provisioner.
# ✔ [leave empty and we'll generate one]:
# ✔ Password: insecure-example-password

# Nicht interaktives Setup, dass das Passwort aus einer Datei liest
step ca init \
    --dns='localhost' \
    --dns='ca.example.com' \
    --address=':443' \
    --name='Example CA' \
    --deployment-type='standalone' \
    --provisioner='admin@example.com' \
    --password-file="$(step path)/.ca-password"

Der Server kann dann mit step-ca gestartet werden:

# Fragt interaktiv nach dem Passwort
step-ca "$(step path)"/config/ca.json

# Passwort aus Datei lesen
step-ca --password-file "$(step path)"/.ca-password

Step CA unterstützt mehrere, unabhängige CAs mit dem Contexts/Profiles Feature:

# Separates CA-Profil erstellen
step ca init --context my_profile

# Profile auflisten
step context list

# Standardprofil wechseln (Profil das bei Kommandos ohne --context verwendet wird)
step context select my_other_profile

Zertifikate können nach dem Setup mit dem Step CLI Tool von der CA ausgestellt werden:

step ca certificate dev@example.com dev.crt dev.key --not-after 87660h

RSA CA

Step CA verwendet standardmässig nur ECDSA für die Root- und Intermediate-CA. Wird RSA benötigt, muss die CA umkonfiguriert werden und die Zertifikate neu generiert werden.

cat <<EOF > rsa_root_ca.tpl
{
  "subject": {{ toJson .Subject }},
  "issuer": {{ toJson .Subject }},
  "keyUsage": ["certSign", "crlSign"],
  "basicConstraints": {
    "isCA": true,
    "maxPathLen": 1
  }
  {{- if typeIs "*rsa.PublicKey" .Insecure.CR.PublicKey }}
    , "signatureAlgorithm": "SHA256-RSAPSS"
  {{- end }}
}
EOF

cat <<EOF > rsa_intermediate_ca.tpl
{
  "subject": {{ toJson .Subject }},
  "issuer": {{ toJson .Subject }},
  "keyUsage": ["certSign", "crlSign"],
  "basicConstraints": {
    "isCA": true,
    "maxPathLen": 0
  }
  {{- if typeIs "*rsa.PublicKey" .Insecure.CR.PublicKey }}
    , "signatureAlgorithm": "SHA256-RSAPSS"
  {{- end }}
}
EOF

step certificate create "RSA Example Root CA" \
    "$(step path)/certs/root_ca.crt" \
    "$(step path)/secrets/root_ca_key" \
    --template rsa_root_ca.tpl \
    --kty RSA \
    --not-after 87660h \
    --size 3072

step certificate create "RSA Example Intermediate CA" \
    "$(step path)/certs/intermediate_ca.crt" \
    "$(step path)/secrets/intermediate_ca_key" \
    --ca "$(step path)/certs/root_ca.crt" \
    --ca-key "$(step path)/secrets/root_ca_key" \
    --template rsa_intermediate_ca.tpl \
    --kty RSA \
    --not-after 87660h \
    --size 3072

ACME Provisioner

Der ACME Provisioner eignet sich gut zum Testen von Software, die später gegen ACME-basierte Services wie zum Beispiel Let’s Encrypt laufen soll.

step ca provisioner add my_acme_provisioner --type ACME

Nach (neu-)starten des Step CA Servers ist der ACME Endpoint unter dem URL-Pfad /acme/my_acme_provisioner verfügbar. Es können mehrere ACME Provisioners gleichzeitig konfiguriert sein (z.B. /acme/acme-prov1, /acme/acme-prov2 etc.).

Bemerkung

Beim Setup step ca init wird mit dem --acme Parameter ein ACME Provisioner gleich mitkonfiguriert.

SCEP Provisioner

Wichtig

Die Intermediate CA muss RSA nutzen, nicht ECDSA. Step CA nutzt standardmässig nur ECDSA-Schlüssel und muss umkonfiguriert werden.

Wichtig

SCEP läuft normalerweise über HTTP (nicht HTTPS) da bei SCEP die Kommunikation durch die Zertifikate schon verschlüsselt ist.

Um HTTP beim Step CA Server zu aktivieren muss insecureAddress in der ca.json gesetzt und der Server neu gestartet werden.

$(step path)/config/ca.json
"insecureAddress": ":8080"
step ca provisioner add my_scep_provisioner \
    --type SCEP \
    --challenge "insecure-example-secret" \
    --encryption-algorithm-identifier 2

Nach (neu-)starten des Step CA Servers ist der SCEP Endpoint unter dem URL-Pfad /scep/my_scep_provisioner verfügbar. Dieser URL-Pfad muss (anders als bei einigen anderen SCEP Serverimplementationen) bei SCEP-Clients mit angegeben werden, da bei Step CA mehrere SCEP Provisioner gleichzeitig konfiguriert sein können (z.B. /scep/scep-prov1, /scep/scep-prov2 etc.).