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=trueframför kommandot.
Vanliga frågor
Hitta svar på de vanligaste frågorna om SSL-certifikat och FairSSL.
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.uname -m) och hämtar rätt Lego-binär. Lego stödjer både amd64 (Intel) och arm64 (Apple Silicon).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.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./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.