SSL-certifikatens maximala livslängd reduceras till 200 dagar från mars 2026. Läs mer →

macOS SSL-certifikat med Lego och LaunchDaemon

macOS används sällan som publik webbserver, men när det görs fungerar Lego och en LaunchDaemon utmärkt. Hela uppsättningen är en Go-binär plus två skript, och fungerar på både Intel och Apple Silicon. Vi använder Lego v5.0.4 eller senare för ARI-stöd.

Uppsättning

Steg 1: Installera Lego

Följande kommando hämtar senaste Lego-versionen, upptäcker arkitekturen och installerar binären under /usr/local/bin/lego. Det skapar även Lego-storage-mapparna.

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

Steg 2: Skapa sync-skript

Lego kör detta skript via --deploy-hook efter varje utfärdning eller förnyelse. Anpassa de 4 variablerna högst upp så att de matchar din uppsättning. Omstartskommandot kan vara sudo nginx -s reload, sudo apachectl -k graceful, eller något mer specifikt för den tjänst du kör.

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 "Saknar Lego-certifikatfiler. Uppgradera till Lego v5.0.4+ och kontrollera /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

Steg 3: Utfärda certifikatet

Se till att domänen är konfigurerad för FairSSL Auto DNS. Hämta EAB-nycklarna från ACME-fliken i din FairSSL-kontrollpanel och kör Lego.

sudo /usr/local/bin/lego run \
  --domains "www.exempel.se" \
  --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-exempel-se"

Steg 4: Schemalägg förnyelse med LaunchDaemon

macOS använder LaunchDaemons i stället för cron för bakgrundsuppgifter. Skapa följande plist så att Lego körs dagligen vid en slumpmässig tidpunkt. ARI styr när det faktiskt förnyas; --renew-days 7 är fallback.

sudo tee /Library/LaunchDaemons/se.fairssl.lego-www-exempel-se.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>se.fairssl.lego-www-exempel-se</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>-c</string>
        <string>/usr/local/bin/lego run --domains "www.exempel.se" --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-exempel-se"</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/se.fairssl.lego-www-exempel-se.plist
sudo chmod 644 /Library/LaunchDaemons/se.fairssl.lego-www-exempel-se.plist
sudo launchctl load -w /Library/LaunchDaemons/se.fairssl.lego-www-exempel-se.plist

Steg 5: Verifiera och felsök

  • Testa LaunchDaemon manuellt: sudo launchctl start se.fairssl.lego-www-exempel-se
  • Kontrollera loggar: tail -f /var/log/lego.log /var/log/lego.err
  • Verifiera certifikatet med FairSSLs SSL-skanner.
  • För felsökning av ACME-flödet, kör Lego med LEGO_DEBUG_ACME_HTTP_CLIENT=true framför kommandot.

Vanliga frågor

Hitta svar på de vanligaste frågorna om SSL-certifikat och FairSSL.

Lego är en enda Go-binär utan beroenden, vilket gör den lämplig för macOS-installationer där du inte vill dra in Python eller Homebrew för att hantera certifikatklienten. Lego stödjer ARI (RFC 9773), EAB och en bred uppsättning DNS-leverantörer. Certbot fungerar också, men kräver Python och fler beroenden.
Ja. macOS har gått bort från cron. launchd via en LaunchDaemon är det rekommenderade sättet att schemalägga bakgrundsuppgifter som ska köras oberoende av användarsession. Vårt exempel installerar en LaunchDaemon i /Library/LaunchDaemons som kör Lego dagligen vid en slumpmässig tidpunkt.
Ja. Installationsskriptet upptäcker arkitekturen automatiskt (uname -m) och hämtar rätt Lego-binär. Lego stödjer både amd64 (Intel) och arm64 (Apple Silicon).
Vi använder ett separat sync-skript (fairssl-lego-sync.sh) som Lego kör via --deploy-hook efter varje lyckad utfärdning eller förnyelse. Du anpassar skriptet med sökvägen där din tjänst förväntar sig certifikatet, samt en omstartskommando. Exempel i skriptet täcker nginx, Apache och generella tjänster.
Från Lego v5 är renew-kommandot borttaget. lego run kontrollerar själv om certifikatet ska förnyas (via ARI) och förnyar bara vid behov. Du kan tvinga förnyelse genom att sätta --renew-days 7, vilket vårt exempel använder som fallback om ARI inte svarar.
Du behöver dem endast vid första körningen. Lego sparar ACME-kontot lokalt under /usr/local/etc/lego/accounts, och framtida förnyelser använder det befintliga kontot utan EAB. Spara ändå nycklarna på ett säkert ställe som backup om du senare behöver återskapa uppsättningen.

Redo att automatisera macOS-certifikat?

Skapa ett gratis konto och utfärda ditt första certifikat på under 10 minuter.