SSL-certifikaternes maksimale levetid reduceres til 200 dage fra marts 2026. Læs mere →

macOS SSL-certifikat med Lego og LaunchDaemon

macOS bruges sjældent som offentlig webserver, men når den gør, virker Lego og en LaunchDaemon glimrende. Hele opsætningen er en enkelt Go-binær plus to scripts, og virker på både Intel og Apple Silicon. Vi bruger Lego v5.0.4 eller nyere for ARI-understøttelse.

Opsætning

Trin 1: Installer Lego

Følgende kommando henter den nyeste Lego-version, detekterer arkitekturen og installerer binæren under /usr/local/bin/lego. Den opretter også Lego-storage-mapperne.

sudo mkdir -p /usr/local/bin
arch=$(uname -m | sed -e 's/x86_64/amd64/' -e 's/aarch64/arm64/')
version=$(curl -fsSL https://api.github.com/repos/go-acme/lego/releases/latest \
  | sed -n 's/.*"tag_name": "\(v[^"]*\)".*/\1/p' | head -1)
curl -fL "https://github.com/go-acme/lego/releases/download/${version}/lego_${version}_darwin_${arch}.tar.gz" -o lego.tar.gz
tar -xzf lego.tar.gz lego
sudo install -m 0755 lego /usr/local/bin/lego
rm -f lego lego.tar.gz
sudo install -d -m 0755 /usr/local/etc/lego
sudo install -d -m 0700 /usr/local/etc/lego/accounts /usr/local/etc/lego/certificates

Trin 2: Opret sync-script

Lego kører dette script via --deploy-hook efter hver udstedelse eller fornyelse. Tilpas de 4 variabler øverst, så de matcher din opsætning. Restart-kommandoen kan være sudo nginx -s reload, sudo apachectl -k graceful, eller noget mere specifikt for den tjeneste, du kører.

sudo tee /usr/local/bin/fairssl-lego-sync.sh > /dev/null << 'SCRIPT'
#!/bin/bash
set -euo pipefail
TARGET="/usr/local/etc/ssl"
CERT_FILE="cert.pem"
KEY_FILE="key.pem"
RESTART_CMD="sudo nginx -s reload"

lego_name="$${1:-}"
cert_path="$${LEGO_HOOK_CERT_PATH:-}"
key_path="$${LEGO_HOOK_CERT_KEY_PATH:-}"
if { [ -z "$cert_path" ] || [ -z "$key_path" ]; } && [ -n "$lego_name" ]; then
    cert_path="/usr/local/etc/lego/certificates/${lego_name}.crt"
    key_path="/usr/local/etc/lego/certificates/${lego_name}.key"
fi
if [ -z "$cert_path" ] || [ -z "$key_path" ] || [ ! -s "$cert_path" ] || [ ! -s "$key_path" ]; then
    echo "Mangler Lego-certifikatfiler. Opgrader til Lego v5.0.4+ og tjek /usr/local/etc/lego/certificates."
    exit 1
fi
sudo install -d -m 0755 "$TARGET"
sudo install -m 0644 "$cert_path" "$TARGET/$CERT_FILE"
sudo install -m 0600 "$key_path" "$TARGET/$KEY_FILE"
$RESTART_CMD
SCRIPT
sudo chmod +x /usr/local/bin/fairssl-lego-sync.sh

Trin 3: Udsted certifikatet

Sørg for at domænet er konfigureret til FairSSL AutoDNS. Hent EAB-nøglerne fra ACME-fanen i dit FairSSL-kontrolpanel og kør Lego.

sudo /usr/local/bin/lego run \
  --domains "www.eksempel.dk" \
  --server https://fairssl.dk/acme \
  --eab --eab.kid DIN_EAB_KID --eab.hmac DIN_EAB_HMAC \
  --accept-tos --email acme-client@fairssl.dk \
  --http --http.webroot "/Library/WebServer/Documents" \
  --path "/usr/local/etc/lego" \
  --deploy-hook "/usr/local/bin/fairssl-lego-sync.sh www-eksempel-dk"

Trin 4: Planlæg fornyelse med LaunchDaemon

macOS bruger LaunchDaemons i stedet for cron til baggrundsopgaver. Opret følgende plist, så Lego kører dagligt på et tilfældigt tidspunkt. ARI styrer hvornår der reelt fornys; --renew-days 7 er fallback.

sudo tee /Library/LaunchDaemons/dk.fairssl.lego-www-eksempel-dk.plist > /dev/null << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>dk.fairssl.lego-www-eksempel-dk</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>-c</string>
        <string>/usr/local/bin/lego run --domains "www.eksempel.dk" --server https://fairssl.dk/acme --accept-tos --email acme-client@fairssl.dk --http --http.webroot "/Library/WebServer/Documents" --path "/usr/local/etc/lego" --renew-days 7 --deploy-hook "/usr/local/bin/fairssl-lego-sync.sh www-eksempel-dk"</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>4</integer>
        <key>Minute</key>
        <integer>17</integer>
    </dict>
    <key>StandardOutPath</key>
    <string>/var/log/lego.log</string>
    <key>StandardErrorPath</key>
    <string>/var/log/lego.err</string>
    <key>RunAtLoad</key>
    <false/>
</dict>
</plist>
EOF
sudo chown root:wheel /Library/LaunchDaemons/dk.fairssl.lego-www-eksempel-dk.plist
sudo chmod 644 /Library/LaunchDaemons/dk.fairssl.lego-www-eksempel-dk.plist
sudo launchctl load -w /Library/LaunchDaemons/dk.fairssl.lego-www-eksempel-dk.plist

Trin 5: Verificér og fejlfind

  • Test LaunchDaemon manuelt: sudo launchctl start dk.fairssl.lego-www-eksempel-dk
  • Tjek logs: tail -f /var/log/lego.log /var/log/lego.err
  • Verificér certifikatet med FairSSLs SSL-scanner.
  • For debug af selve ACME-flowet, kør Lego med LEGO_DEBUG_ACME_HTTP_CLIENT=true foran kommandoen.

Ofte stillede spørgsmål

Find svar på de mest almindelige spørgsmål om SSL certifikater og FairSSL.

Lego er en enkelt Go-binær uden afhængigheder, hvilket gør det velegnet til macOS-installationer hvor du ikke vil have Python eller Homebrew til at administrere certifikatklienten. Lego understøtter ARI (RFC 9773), EAB og en bred liste af DNS-udbydere. Certbot virker også, men kræver Python og et større stack af afhængigheder.
Ja. macOS har bevæget sig væk fra cron. launchd via en LaunchDaemon er den anbefalede måde at planlægge baggrundsopgaver, der skal køre uafhængigt af brugersession. Vores eksempel installerer en LaunchDaemon i /Library/LaunchDaemons, der kører Lego dagligt på et tilfældigt tidspunkt.
Ja. Installationsskriptet detekterer automatisk arkitektur (uname -m) og henter den korrekte Lego-binær. Lego understøtter både amd64 (Intel) og arm64 (Apple Silicon).
Vi bruger et separat sync-script (fairssl-lego-sync.sh) som Lego kører via --deploy-hook efter hver succesfuld udstedelse eller fornyelse. Du tilpasser scriptet med stien til, hvor din tjeneste forventer certifikatet, og en restart-kommando. Eksempler i scriptet dækker nginx, Apache og generelle services.
Fra Lego v5 er renew-kommandoen fjernet. lego run tjekker selv om certifikatet skal fornys (via ARI) og fornyer kun ved behov. Du kan tvinge fornyelse ved at sætte --renew-days 7, som vores eksempel bruger som fallback hvis ARI ikke svarer.
Du bruger dem kun ved den første kørsel. Lego gemmer ACME-kontoen lokalt under /usr/local/etc/lego/accounts, og fremtidige fornyelser bruger den eksisterende konto uden EAB. Gem alligevel nøglerne et sikkert sted som backup, hvis du senere skal genskabe opsætningen.

Klar til at automatisere macOS-certifikater?

Opret en gratis konto og udsted dit første certifikat på under 10 minutter.