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=trueforan kommandoen.
Ofte stillede spørgsmål
Find svar på de mest almindelige spørgsmål om SSL certifikater og FairSSL.
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.uname -m) og henter den korrekte Lego-binær. Lego understøtter både amd64 (Intel) og arm64 (Apple Silicon).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.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./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.