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
| Plattform | Versioner | Körs på | ACME-klient |
|---|---|---|---|
| macOS | VersionerGuiden sätter ingen versionsgräns | Körs påmacOS | ACME-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=trueframfö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.
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.uname -m) och hämtar rätt Lego-binär. Lego stöder både amd64 (Intel) och arm64 (Apple Silicon).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.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./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.