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.
Understøttede versioner
| Platform | Versioner | Kører på | ACME-klient |
|---|---|---|---|
| macOS | VersionerGuiden sætter ingen versionsgrænse | Kører påmacOS | ACME-klientlego 5.0.4+ |
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.
Certifikater på mange servere og appliances
Et offentligt SSL-certifikat kan højst være gyldigt i 199 dage nu, 99 dage senest 15-03-2027 og 46 dage senest 15-03-2029. Hvert certifikat skal dermed skiftes mindst to gange om året nu og mindst otte gange om året fra 2029, på hver server, firewall og load balancer, det bruges på. sslbrain fra FairSSL kører som en appliance i jeres eget netværk og fornyer og installerer certifikaterne fra ét sted, også på udstyr uden agent.
sslbrain sammenlignet med Certbot, win-acme og lego(åbner sslbrain.com i en ny fane)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 bestil dit første certifikat. Et DV-certifikat udstedes på under 2 minutter.