Bisher hatte ich meine HTTPS-Zertifikate von cacert.org bezogen. Kostet nix und hält ein halbes Jahr.

Allerdings kam ich bei der Installation von bitwarden mit cacert nicht mehr weiter und musste mich mit letsencrypt befassen, auch wenn die Zertifikate hier all 3 Monate ausgetauscht werden müssen. Dafür erledigt dies der certbot (ein Kommandozeilenprogramm) mehr oder weniger von alleine.
Von dem her ist HTTPS mit letsencrypt keine große Sache, wenn es denn mal installiert ist...

certbot installieren

Um letsencrypt nutzen zu können, muss man sich nirgends registrieren oder ein Konto anlegen. Man muss allerdings das Kommandozeilenprogramm certbot auf dem Webserver installieren, was ich mit Hilfe von Homebrew gemacht habe:

brew install certbot

Zertifikate erstellen

So ganz automatisiert bekam ich die Erstellung aller Zertifikate für sämtliche (Sub-)Domains dann aber doch nicht hin und musste mit der certonly-Option arbeiten.

An sich sollte der Befehl sudo certbot --apache ausreichen, so dass der certbot von selbst rausfindet, was für Zertifikate man benötigt und wo sie hin müssen.
Aber wie es mit so vereinfachten one-linern bei mir immer ist: Funktioniert nicht.

Also Zertifikat für jede (Sub-)Domain manuell erstellen und der Apache-Konfiguration hinzufügen...

Zertifikat manuell einrichten

Die PHP-Dokumente für die Website beispiel.apfel-z.net liegen in diesem Beispiel unter /Library/WebServer/Documents/beispiel.apfel-z.net/

Diese Domain muss auf jeden Fall über den Standard-HTTP-Port erreichbar sein, also in /private/etc/apache2/extra/httpd-vhosts.confkonfiguriert. Auch, wenn ich vielleicht später gar nicht vor habe, HTTP auszuliefern und nur HTTPS-Verbindungen nutzen möchte!

Mit folgendem Befehl wird ein entsprechendes Zertifikat erstellt und unter /etc/letsencrypt/live/*domainname* abgelegt:

sudo certbot certonly --webroot -w /Library/WebServer/Documents/beispiel.apfel-z.net/ -d beispiel.apfel-z.net

Darauf sollte folgende Erfolgsmeldung erscheinen:

- Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/beispiel.apfel-z.net/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/beispiel.apfel-z.net/privkey.pem
   Your cert will expire on 2020-05-29. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"

Beide in der Erfolgsmeldung erwähnten .pem-Zertifikate in der https-ssl-Config /private/etc/apache2/extra/httpd-ssl.conf als SSLCertificateFile und SSLCertificateKeyFile eintragen:

/private/etc/apache2/extra/httpd-ssl.conf
<VirtualHost *:443>
   DocumentRoot "/Library/WebServer/Documents/beispiel.apfel-z.net"
   ServerName beispiel.apfel-z.net:443
   ServerAlias beispiel.apfel-z.net
   ServerAdmin webmaster@apfel-z.net
   ErrorLog "/private/var/log/apache2/error_log"
   TransferLog "/private/var/log/apache2/access_log"

   <Directory "/Library/WebServer/Documents/beispiel.apfel-z.net">
      Options Indexes FollowSymLinks MultiViews
      AllowOverride All
      Order allow,deny
      Allow from all
   </Directory>

   SSLEngine on
   SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

   <FilesMatch "\.(cgi|html|shtml|phtml|php)$">
      SSLOptions +StdEnvVars
   </FilesMatch>

   BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
   CustomLog "/private/var/log/apache2/ssl_request_log" "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
   Include /etc/letsencrypt/options-ssl-apache.conf
   SSLCertificateFile /etc/letsencrypt/live/beispiel.apfel-z.net/fullchain.pem
   SSLCertificateKeyFile /etc/letsencrypt/live/beispiel.apfel-z.net/privkey.pem
</VirtualHost>

ODER nochmals certbot laufen lassen: sudo certbot --apache

Und dann "Reinstall" (1) wählen

What would you like to do?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Attempt to reinstall this existing certificate
2: Renew & replace the cert (limit ~5 per 7 days)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1

Und nun noch den Apache neustarten:
sudo apachectl -k restart

Zertifikate erneuern

Alle per letsencrypt eingerichteten Zertifikate zu erneuern (spätestens nach 3 Monaten, wenn sie verfallen) ist nun wirklich keine große Sache mehr:

sudo certbot renew --post-hook "apachectl restart"

Durch die post-hook-Option wird nach dem Erneuern gleich noch der Apache neu gestartet.

Generelles zu HTTPS

Am Rande:
Damit HTTPS per Apache auf dem Mac ausgeliefert werden kann, müssen in /etc/apache2/httpd.conf folgende Zeilen aktiviert sein (also das # am Zeilenbeginn entfernt sein):

LoadModule ssl_module libexec/apache2/mod_ssl.so
Include /private/etc/apache2/extra/httpd-ssl.conf

Hatte mir bei mir anfangs nicht geklappt und ich hatte folgende Fehlermeldung im Log entdeckt:

AH00526: Syntax error on line 13 of /etc/letsencrypt/options-ssl-apache.conf:
Setting Compression mode unsupported; not implemented by the SSL library

Die SSLCompression zu deaktivieren schafft hier Abhilfe.
In /etc/letsencrypt/options-ssl-apache.conf folgende Zeile auskommentieren.

#SSLCompression   off

auskommentieren (Also ein # davor setzen).

Und Apache neustarten:
sudo apachectl -k restart