SSL-certifikat får vara giltiga i högst 199 dagar. Senast 2027-03-15 blir gränsen 99 dagar, för DigiCert-certifikat redan från 2027-02-24. Läs mer →
Svensk support på svenska, vardagar 10:00-16:00 +46 10 101 03 34 info@fairssl.se

SSL-certifikat på macOS med Lego och LaunchDaemon

macOS används sällan som publik webbserver, men när det gör det fungerar Lego och en LaunchDaemon bra. Lösningen består av en Go-binär och 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.

Versioner som stöds

macOSVersionerGuiden sätter ingen versionsgränsKörs påmacOSACME-klientlego 5.0.4+

Konfiguration

Steg 1: Installera Lego

Kommandona nedan hämtar den senaste Lego-versionen, identifierar arkitekturen och installerar binären som /usr/local/bin/lego. De skapar även Legos lagringsmappar.

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 skriptet via --deploy-hook efter varje utfärdande eller förnyelse. Anpassa de fyra variablerna högst upp efter din miljö. Omstartskommandot kan vara sudo nginx -s reload, sudo apachectl -k graceful eller ett kommando 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 AutoDNS. 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 fast tidpunkt (04:17 i exemplet). ARI styr när certifikatet förnyas, och --renew-days 7 fungerar som reserv.

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-jobbet manuellt: sudo launchctl start se.fairssl.lego-www-exempel-se
  • Kontrollera loggarna: tail -f /var/log/lego.log /var/log/lego.err
  • Verifiera certifikatet med FairSSLs SSL-skanner.
  • Felsök ACME-flödet genom att sätta LEGO_DEBUG_ACME_HTTP_CLIENT=true framför Lego-kommandot.

Certifikat på många servrar och appliances

Ett offentligt SSL-certifikat får vara giltigt i högst 199 dagar nu, 99 dagar senast 2027-03-15 och 46 dagar senast 2029-03-15. Varje certifikat måste då bytas minst två gånger om året nu och minst åtta gånger om året från 2029, på varje server, brandvägg och lastbalanserare där det används. sslbrain från FairSSL körs som en appliance i ert eget nätverk och förnyar och installerar certifikaten från ett ställe, även på utrustning utan agent.

sslbrain jämfört med Certbot, win-acme och lego (på engelska)(öppnar sslbrain.com i en ny flik)

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öder ARI (RFC 9773), EAB och de flesta stora DNS-leverantörer. Certbot fungerar också, men kräver Python och fler beroenden.
Ja. Apple har ersatt cron med launchd i macOS. En LaunchDaemon är det rekommenderade sättet att schemalägga bakgrundsjobb som ska köras oberoende av inloggad användare. Exemplet installerar en LaunchDaemon i /Library/LaunchDaemons som kör Lego dagligen vid en fast tidpunkt.
Ja. Installationsskriptet identifierar arkitekturen automatiskt (uname -m) och hämtar rätt Lego-binär. Lego stöder 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 lyckat utfärdande eller förnyelse. Du anpassar skriptet med sökvägen där din tjänst förväntar sig certifikatet och ett omstartskommando. Exemplen täcker nginx, Apache och andra tjänster.
I Lego v5 finns kommandot renew inte längre. lego run kontrollerar själv om certifikatet ska förnyas (via ARI) och förnyar bara vid behov. Med --renew-days 7 förnyas certifikatet senast sju dagar före utgång, vilket exemplet använder som reserv om ARI inte svarar.
Du behöver dem bara vid första körningen. Lego sparar ACME-kontot lokalt under /usr/local/etc/lego/accounts, och senare förnyelser använder det befintliga kontot utan EAB. Spara ändå nycklarna på ett säkert ställe, ifall du senare behöver sätta upp kontot igen.

Redo att automatisera macOS-certifikat?

Skapa ett gratis konto och beställ ditt första certifikat. Ett DV-certifikat utfärdas på under 2 minuter.