Debian Lemur: Unterschied zwischen den Versionen

Aus Wiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(26 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 5: Zeile 5:
===Debian Pakete===
===Debian Pakete===
Lemur benötig zahlreiche Pakete, die aus den Debian Paketquellen installierbar sind
Lemur benötig zahlreiche Pakete, die aus den Debian Paketquellen installierbar sind
  apt-get install sudo nodejs python3-pip python-dev python3-dev libpq-dev build-essential libssl-dev libffi-dev libsasl2-dev libldap2-dev apache2 git supervisor npm postgresql gulp
  apt-get install sudo nodejs python3-pip python-dev python3-dev libpq-dev build-essential libssl-dev libffi-dev libsasl2-dev libldap2-dev apache2 git supervisor npm postgresql gulp git


User für Lemur Dienst
User für Lemur Dienst
  useradd -d /home/lemur -m -s /bin/bash lemur
  useradd -m -s /bin/bash lemur
  passwd lemur
  passwd lemur


Zeile 14: Zeile 14:
  pip install -U virtualenv
  pip install -U virtualenv
  mkdir /www
  mkdir /www
chown lemur lemur
  cd /www
  cd /www
su lemur
  git clone https://github.com/Netflix/lemur
  git clone https://github.com/Netflix/lemur
  chown -R lemur lemur/
  cd lemur
  su lemur
git clone lädt aktuellen Development master herunter, der nicht unbedingt getestet und stabil funktioniert. Deshalb ist es ratsam eine aktuelle Tag-Version zu verweden, die zwar nicht ganz so aktuell ist wie der master, aber dafür die Chancen höher sind, eine funktionale Lemur Version zu erhalten. Anzeigen der aktuellen tag-Versionen
  virtualenv -p python3 lemur
git tag -n
Ausgabe z.B.
0.1            Merge pull request #32 from kevgliss/entropy
0.1.2          Merge pull request #70 from jeremy-h/master
0.1.3          Merge pull request #81 from kevgliss/pipy
0.1.4          Hotfix Release
0.1.5          Merge pull request #129 from kevgliss/version
0.2            Merge pull request #167 from forkd/master
0.2.1          Merge pull request #190 from kevgliss/0.2.1
0.2.2          Merge pull request #241 from kevgliss/0.2.2.release
0.3.0          release bump (#348)
0.4.0          Closes: #469 (#510)
0.5.0          0.5 Release (#750)
0.5.1          Pinning version of PyOpenSSL #873
0.6.0          6.0 release. (#1033)
0.7.0          Merge pull request #1372 from castrapel/acme_validation_dns_provider_option
0.8.0
v0.10.0        Merge pull request #3646 from havron/filter-autorotate
v0.8.1          Merge pull request #3471 from hosseinsh/aut0mate-bump-version
v0.9.0          Merge pull request #3485 from hosseinsh/changelog-0.9.0
Auswhl der neuesten Version (in obigem Fall v0.10.0):
  git checkout tags/v0.10.0
Python virtualenv erstellen und lemur erstellen
  virtualenv -p python3 /www/lemur/
  source /www/lemur/bin/activate
  source /www/lemur/bin/activate
  cd lemur
  cd lemur
Zeile 38: Zeile 63:
   SQLALCHEMY_DATABASE_URI = 'postgresql://lemur:lemur_pwd@localhost:5432/lemur'
   SQLALCHEMY_DATABASE_URI = 'postgresql://lemur:lemur_pwd@localhost:5432/lemur'
Folgende Zeilen ans Ennde anfügen, um Warninngs der Plugins zu unterbinden:
Folgende Zeilen ans Ennde anfügen, um Warninngs der Plugins zu unterbinden:
  DIGICERT_URL = ''
  DIGICERT_URL = ' '
  DIGICERT_ORG_ID = ''
  DIGICERT_ORG_ID = ' '
  DIGICERT_ORDER_TYPE = ''
  DIGICERT_ORDER_TYPE = ' '
  DIGICERT_ROOT = ''
  DIGICERT_ROOT = ' '
  DIGICERT_CIS_API_KEY = ''
  DIGICERT_CIS_API_KEY = ' '
  DIGICERT_CIS_URL = ''
  DIGICERT_CIS_URL = ' '
  DIGICERT_CIS_ROOTS = ''
  DIGICERT_CIS_ROOTS = ' '
  DIGICERT_CIS_PROFILE_NAMES = ''
  DIGICERT_CIS_PROFILE_NAMES = ' '
  DIGICERT_API_KEY = ''
  DIGICERT_API_KEY = ' '
  ENTRUST_API_KEY = ''
  ENTRUST_API_KEY = ' '
  ENTRUST_API_CERT = ''
  ENTRUST_API_CERT = ' '
  ENTRUST_API_USER = ''
  ENTRUST_API_USER = ' '
  ENTRUST_API_PASS = ''
  ENTRUST_API_PASS = ' '
  ENTRUST_URL = ''
  ENTRUST_URL = ' '
  ENTRUST_ROOT = ''
  ENTRUST_ROOT = ' '
  ENTRUST_NAME = ''
  ENTRUST_NAME = ' '
  ENTRUST_EMAIL = ''
  ENTRUST_EMAIL = ' '
  ENTRUST_PHONE = ''
  ENTRUST_PHONE = ' '
lemur User Umgebung verlassen
lemur User Umgebung verlassen
  exit
  exit
Zeile 82: Zeile 107:
  exit
  exit


==Startscript für den Lemur Dienst==
==Systemd Diemst für Lemur==
  vi /etc/init.d/lemur
  vi /etc/systemd/system/lemur.service
Folgende Zeilen einfügen:
Folgende Zeilen einfügen:
  #!/bin/sh
  [Unit]
# kFreeBSD do not accept scripts as interpreters, using #!/bin/sh and sourcing.
  Description=Neflix TLS certificate manager
#if [ true != "$INIT_D_SCRIPT_SOURCED" ] ; then
  Requires=network-online.target
  #    set "$0" "$@"; INIT_D_SCRIPT_SOURCED=true . /lib/init/init-d-script
  After=network-online.target
  #fi
### BEGIN INIT INFO
# Provides:          skeleton
# Required-Start:    $remote_fs $syslog
# Required-Stop:    $remote_fs $syslog
# Default-Start:    2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Example initscript
# Description:      This file should be used to construct scripts to be
#                    placed in /etc/init.d.  This example start a
#                    single forking daemon capable of writing a pid
#                    file. To get other behavoirs, implemend
  #                    do_start(), do_stop() or other functions to
#                    override the defaults in /lib/init/init-d-script.
### END INIT INFO
   
   
  # Author: Foo Bar <foobar@baz.org>
  [Service]
  #
User=lemur
  # Please remove the "Author" lines above and replace them
Group=lemur
  # with your own name if you copy and modify this script.
ExecStart=/www/lemur/bin/lemur --config=/home/lemur/.lemur/lemur.conf.py start -b 127.0.0.1:8000
Restart=always
  PrivateTmp=yes
  ProtectSystem=full
  NoNewPrivileges=yes
   
   
  DESC="Lemur Server"
  [Install]
  DAEMON="/www/lemur/bin/lemur"
  WantedBy=multi-user.target
PID="/var/run/lemur.pid"
Dienst aktivieren und starten:
  systemctl daemon-reload
  case $1 in
  systemctl enable lemur.service
    start)
  systemctl start lemur.service
        start-stop-daemon --start --chuid lemur --make-pidfile --pidfile $PID --background  --exec $DAEMON start
        ;;
  stop)
        start-stop-daemon --stop --pidfile $PID
        ;;
  esac
Script ausführbar machen:
  chmod +x /etc/init.d/lemur
Lemur starten:
/etc/init.d/lemur start
check ob Lemur Process läuft:
check ob Lemur Process läuft:
  ps aux|grep lemur
  systemctl status lemur.service
Wenn Lemur gestartet ist, dann sollten 2 Lemur Python Prozesse gelistet werden, die unter dem User lemur (ganz links) ausgeführt werden:
Die Ausgabe sollte folgende Zeile enthalten:
  lemur    20494  0.0 17.2 171724 90408 ?        S    07:24  0:01 /www/lemur/bin/            python /www/lemur/bin/lemur start
  Active: active (running)
lemur    20497  0.0 16.2 172236 85200 ?        S    07:24  0:00 /www/lemur/bin/            python /www/lemur/bin/lemur start
 
automatisch beim Systemstart starten und beim Shutdown beenden:
update-rc.d lemur defaults


==Web Proxy==
==Web Proxy==
Standardmäßig läuft lemur auf Port 8000. Der Port könnte zwar geändert werden aber nicht auf Port 443, wenn Lemur als beschränkter User lemur laufen soll. Um Lemur dennoch auf Port 443 erreichbar zu machen wird Apache als Reverse Proxy verwendet
Standardmäßig läuft lemur auf Port 8000. Der Port könnte zwar geändert werden aber nicht auf Port 443, wenn Lemur als beschränkter User lemur laufen soll. Um Lemur dennoch auf Port 443 erreichbar zu machen wird Apache als Reverse Proxy verwendet. Falls noch kein SSL-Zertifikat für den Lemur-Host zur Verfügung steht, kann zunächst das generische Cert sakeoil verwendet werden, das auf jedem Debian System zur Verfügung steht. Mit Hilfe von Lemur kann anschließend ein angepasstes Zertifikat für den Lemur Host generiert werden und in den Apache Virtualhost eingetragen werden.
  vi /etc/apache2/sites-available/lemur_https.conf
  vi /etc/apache2/sites-available/lemur_https.conf
Folgende Zeilen einfügen und anpassen (domain.org entsprechend anpassen, Pfad zu SSL Zertifikat und Key ebenfalls anpassen):
Folgende Zeilen einfügen und anpassen (domain.org entsprechend anpassen, Pfad zu SSL Zertifikat und Key ebenfalls anpassen):
Zeile 142: Zeile 144:
    
    
         SSLEngine on
         SSLEngine on
         SSLCertificateFile      /etc/ssl/certs/lemur.pem
         SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
         SSLCertificateKeyFile  /etc/ssl/private/lemur.key
         SSLCertificateKeyFile  /etc/ssl/private/ssl-cert-snakeoil.key
   
   
         # intermediate configuration, tweak to your needs
         # intermediate configuration, tweak to your needs
Zeile 196: Zeile 198:
===Installation===
===Installation===
  apt-get install golang
  apt-get install golang
  useradd cfssl
  useradd -m -s /bin/bash cfssl
passwd cfssl
  su - cfssl
  su - cfssl
  go get -u github.com/cloudflare/cfssl/cmd/...
  go get -u github.com/cloudflare/cfssl/cmd/...
  go get bitbucket.org/liamstask/goose/cmd/goose
  go get bitbucket.org/liamstask/goose/cmd/goose
exit
  ln -s /home/cfssl/go/bin/cfssl* /usr/local/bin/
  ln -s /home/cfssl/go/bin/cfssl* /usr/local/bin/
  ln -s /home/cfssl/go/bin/multirootca /usr/local/bin/
  ln -s /home/cfssl/go/bin/multirootca /usr/local/bin/
  ln -s /home/cfssl/go/bin/mkbundle /usr/local/bin/
  ln -s /home/cfssl/go/bin/mkbundle /usr/local/bin/
  ln -s /home/cfssl/go/bin/goose /usr/local/bin/
  ln -s /home/cfssl/go/bin/goose /usr/local/bin/
  exit
  mkdir /etc/ssl/cfssl_ca
chown cfssl. /etc/ssl/cfssl_ca
 


===Datenbank===
===Datenbank===
  su - postgres
  su - postgres
psql
cfssl_pwd sollte möglichst lange und kompliziert gewählt werden. Sonderzeichen sollten vermieden werden.
cfssl_pwd sollte möglichst lange und kompliziert gewählt werden. Sonderzeichen sollten vermieden werden.
  CREATE USER u_cfssl WITH PASSWORD 'cfssl_pwd';
  CREATE USER u_cfssl WITH PASSWORD 'cfssl_pwd';
Zeile 221: Zeile 228:


  mkdir /etc/cfssl
  mkdir /etc/cfssl
chown cfssl. /etc/cfssl
su - cfssl
  vi /etc/cfssl/db-config.json
  vi /etc/cfssl/db-config.json
folgende Zeilen einfügen (cfss_pwd mit eben angelegtem Passwort für db user u_cfssl ersetzenn):
folgende Zeilen einfügen (cfss_pwd mit eben angelegtem Passwort für db user u_cfssl ersetzenn):
  {
  {
     "driver": "postgres",
     "driver": "postgres",
     "data_source": "postgres://u_cfssl:cfssl_pwd/db_cfssl"
     "data_source": "postgres://u_cfssl:cfssl_pwd@localhost/db_cfssl"
  }
  }
goose configfile cbconf.yml:
vi  ~/go/src/github.com/cloudflare/cfssl/certdb/pg/dbconf.yml
Folgende Zeilen am Ende anfügen und cfssl_pwd anpassen:
custom:
  driver: postgres
  open: user=u_cfssl password=cfssl_pwd dbname=db_cfssl sslmode=disable
Datenbank befüllen:
Datenbank befüllen:
  goose --env custom -path ~/go/src/github.com/cloudflare/cfssl/certdb/pg up
  goose --env custom -path ~/go/src/github.com/cloudflare/cfssl/certdb/pg up


===Root CA und Intermediate CA Zertifikate===
===Root CA und Intermediate CA Zertifikate===
Verzeichnisse erstellen:
Verzeichnisse erstellen:
  mkdir /etc/ssl/cfssl_ca
  su - cfssl
  mkdir /etc/ssl/cfssl_ca/root
  mkdir /etc/ssl/cfssl_ca/root
  mkdir /etc/ssl/cfssl_ca/intermediate
  mkdir /etc/ssl/cfssl_ca/intermediate
Zeile 279: Zeile 297:
     ],
     ],
     "ca": {
     "ca": {
         "expiry": "42720h"
         "expiry": "87600h"
     }
     }
  }
  }
Zeile 294: Zeile 312:
                 "signing"
                 "signing"
             ],
             ],
             "expiry": "262800h",
             "expiry": "87600h",
             "ca_constraint": {
             "ca_constraint": {
                 "is_ca": true,
                 "is_ca": true,
Zeile 304: Zeile 322:
  }
  }
Folgende Befehle generieren Intermediate CA private Key intermediate_ca-key.pem und Zertifikat intermediate_ca.pem, das von eben erstellter Root CA signiert wird:
Folgende Befehle generieren Intermediate CA private Key intermediate_ca-key.pem und Zertifikat intermediate_ca.pem, das von eben erstellter Root CA signiert wird:
  cfssl gencert -initca /etc/ssl/cfssl_ca/intermediate/csr_inntermediate.json | cfssljson -bare /etc/ssl/cfssl_ca/intermediate/intermediate_ca
  cfssl gencert -initca /etc/ssl/cfssl_ca/intermediate/csr_intermediate.json | cfssljson -bare /etc/ssl/cfssl_ca/intermediate/intermediate_ca
  cfssl sign -ca //etc/ssl/cfssl_ca/root/root_ca.pem -ca-key /etc/ssl/cfssl_ca/intermediate/root/root_ca-key.pem -config /etc/ssl/cfssl_ca/intermediate/root_to_intermediate_ca.json  /etc/ssl/cfssl_ca/intermediate/intermediate_ca.csr | cfssljson -bare /etc/ssl/cfssl_ca/intermediate/intermediate_ca
  cfssl sign -ca /etc/ssl/cfssl_ca/root/root_ca.pem -ca-key /etc/ssl/cfssl_ca/root/root_ca-key.pem -config /etc/ssl/cfssl_ca/intermediate/root_to_intermediate_ca.json  /etc/ssl/cfssl_ca/intermediate/intermediate_ca.csr | cfssljson -bare /etc/ssl/cfssl_ca/intermediate/intermediate_ca
Dateirechte anpassen:
Verifizierung, dass Intermediate CA von Root CA unterschrieben und gültig ist:
  chown cfssl. -R /etc/ssl/cfssl_ca
  openssl verify -CAfile /etc/ssl/cfssl_ca/root/root_ca.pem /etc/ssl/cfssl_ca/intermediate/intermediate_ca.pem
  chown cfssl. -R /etc/cfssl
Folgende Zeile wird ausgegeben:
  /etc/ssl/cfssl_ca/intermediate/intermediate_ca.pem: OK
Falls nicht, macht es keinen Sinn, weiterzumachen, da die Zertifikate nicht gültig sind und später zu Problemen führen werden. Fehlersuche ist erforderlich.




===CFSSL Service===
===CFSSL Service===
CFSSL wird als Daemon ausgeführt, der mit Lemur via Netzwerk kommuniziert, anstelle von CLI-Befehlen, mit denen die CA eben erstellt wurde. Dafür sind Konfigfiles erforderlich.
CFSSL wird als Daemon ausgeführt, der mit Lemur via Netzwerk kommuniziert, anstelle von CLI-Befehlen, mit denen die CA eben erstellt wurde. Dafür sind Konfigfiles erforderlich.  
  vi /etc/cfssl/config.json
  vi /etc/cfssl/config.json
Folgende Zeilen einfügen und evtl. anpassen:
Folgende Zeilen einfügen und API_KEY anpassen. Der Key ist ein HMAC-Hex-Key, der möglichst lang sein sollte. Er schützt den API-Server vor unberechtigtem Zugriff:
  {
  {
   "signing": {
   "signing": {
     "default": {
     "default": {
       "ocsp_url": "http://Domain_Server:8889",
       "ocsp_url": "http://Domain_Server:8889",
       "crl_url": "http://Domain_Server:8888/crl",
       "crl_url": "http://Domain_Server:8888//api/v1/cfssl/crl",
       "expiry": "26280h",
       "expiry": "26280h",
       "usages": [
       "usages": [
Zeile 326: Zeile 346:
         "client auth",
         "client auth",
         "server auth"
         "server auth"
       ]
       ],
      "auth_key": "default_auth"
     },
     },
     "profiles": {
     "profiles": {
Zeile 340: Zeile 361:
           "is_ca": true,
           "is_ca": true,
           "max_path_len": 1
           "max_path_len": 1
         }
         },
        "auth_key": "default_auth"
       },
       },
       "ocsp": {
       "ocsp": {
Zeile 347: Zeile 369:
           "ocsp signing"
           "ocsp signing"
         ],
         ],
         "expiry": "26280h"
         "expiry": "26280h",
        "auth_key": "default_auth"
       },
       },
       "serverCA": {
       "serverCA": {
Zeile 357: Zeile 380:
           "cert sign",
           "cert sign",
           "crl sign"
           "crl sign"
         ]
         ],
        "auth_key": "default_auth"
       },
       },
       "server": {
       "server": {
Zeile 365: Zeile 389:
           "key encipherment",
           "key encipherment",
           "server auth"
           "server auth"
         ]
         ],
        "auth_key": "default_auth"
       },
       },
       "client": {
       "client": {
Zeile 374: Zeile 399:
           "client auth",
           "client auth",
           "email protection"
           "email protection"
         ]
         ],
        "auth_key": "default_auth"
       }
       }
     }
     }
Zeile 381: Zeile 407:
     "default_auth": {
     "default_auth": {
       "type": "standard",
       "type": "standard",
       "key": "de1069ab43f7f385d9a31b76af27e7620e9aa2ad5dccd264367422a452aba67f"
       "key": "API_KEY"
     }
     }
   }
   }
Zeile 390: Zeile 416:
CFSSL-API Server im Vordergrund starten:
CFSSL-API Server im Vordergrund starten:
  cfssl serve -address 127.0.0.1 -ca /etc/cfssl/intermediate_ca.pem -ca-key /etc/cfssl/intermediate_ca-key.pem -port 8888 -db-config /etc/cfssl/db-config.json -config /etc/cfssl/config.json
  cfssl serve -address 127.0.0.1 -ca /etc/cfssl/intermediate_ca.pem -ca-key /etc/cfssl/intermediate_ca-key.pem -port 8888 -db-config /etc/cfssl/db-config.json -config /etc/cfssl/config.json
Der API-Server sollte starten und einige Zeilen mit Infos und Warnings auszugeben. Server mit CTL-C beenden. Falls API-Server läuft, Systemd-Service File anlegen:
Der API-Server sollte starten und einige Zeilen mit Infos und Warnings auszugeben. Server mit CTL-C beenden. Falls API-Server läuft, Systemd-Service File anlegen. Der Systemdienst muss als root user angelegt werden. Deshalb cfssl user mit exti verlassen:
exit
  vi /etc/systemd/system/cfssl.service
  vi /etc/systemd/system/cfssl.service
Folgende Zeilen einfügen:
Folgende Zeilen einfügen:
Zeile 422: Zeile 449:
  CFSSL_ROOT ="""ROOT_CA"""
  CFSSL_ROOT ="""ROOT_CA"""
  CFSSL_INTERMEDIATE ="""INTERMEDIATE_CA"""
  CFSSL_INTERMEDIATE ="""INTERMEDIATE_CA"""
CFSSL_KEY = "API_KEY"
z.B.
z.B.
  CFSSL_ROOT ="""-----BEGIN CERTIFICATE-----
  CFSSL_ROOT ="""-----BEGIN CERTIFICATE-----
Zeile 429: Zeile 457:
  ...
  ...
  -----END CERTIFICATE-----"""
  -----END CERTIFICATE-----"""
 
CFSSL_KEY = "API_KEY"
Lemur neu starten, um die Änderungen am Konfigfile zu übernehmen:
service lemur restart
In Lemur eine neue root authority anlegen:
In Lemur eine neue root authority anlegen:
* Typ: root
* Typ: root
Zeile 441: Zeile 471:


===CRL und OCSP Responder===
===CRL und OCSP Responder===
CRL (Certificate Revocation List) -> statisch und OCSP (Online Certificate Status Protocol) -> dynamisch geben den statusch zurückgerufener Zertifikate an Clients wieder, um diesen zurückgerufene, ungültige Zertifikate mitzuteilen. CFSSL bietet dieses ebenfalls an.
CRL (Certificate Revocation List) -> Liste aller zurückgerufener Zertifikate und OCSP (Online Certificate Status Protocol) -> Abfrage ob e bestimmtes Zertifikat zurückgerufe wurde, geben den Status zurückgerufener Zertifikate an Clients wieder, um diesen zurückgerufene, ungültige Zertifikate mitzuteilen. CFSSL bietet beide Möglichkeiten.


mit lemur ein OCSP Zertifikat und Key generieren (Intermediate CFSSL CA auswählen).
Für OCSP ist ein eigenes Zertifikat mit der Zertifikat Extensionn OCSP_SIGNER erforderlich. Diese wird von CFSSL selbst angelegt und vom Intermediate Zertifikat signiert.
* Zertifikat unter /etc/ssl/cfssl_ca/certs/ocsp.pem ablegen
vi /etc/cfssl/intermediate/ocsp.csr.json
* Key unter /etc/ssl/cfssl_ca/certs/ocsp-key.pem ablegen
Folgende Zeilen einfügen:
* Links anlegen:
{
  ln -s /etc/ssl/cfssl_ca/certs/ocsp*pem /etc/cfssl/
  "CN": "OCSP signer",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "DE",
      "ST": "Bavaria",
      "L": "Other",
      "O": "Private"
    }
  ]
}
signiertes Zertifikat mit cfssl generieren:
cfssl gencert -ca=intermediate_ca.pem -ca-key=intermediate_ca-key.pem -config=/etc/cfssl/config.json -profile="ocsp" ocsp.csr.json |cfssljson -bare ocsp
OCSP Zertifikat und key verlinken:
  ln -s /etc/ssl/cfssl_ca/intermediate/ocsp*pem /etc/cfssl/
* Systemd Service-File anpassen:
* Systemd Service-File anpassen:
  vi /etc/systemd/system/cfssl.service
  vi /etc/systemd/system/cfssl.service
ExecStart folgendermaßen erweitern:
ExecStart um -responder und -responder-key erweitern:
  ExecStart=/usr/local/bin/cfssl serve -address 127.0.0.1 -ca /etc/cfssl/intermediate_ca.pem -ca-key /etc/cfssl/intermediate_ca-key.pem -port 8888 -db-config /etc/cfssl/db-config.json -config /etc/cfssl/config.json -responder /etc/cfssl/ocsp.pem -responder-key /etc/cfssl/ocsp-key.pem
  ExecStart=/usr/local/bin/cfssl serve -address 127.0.0.1 -ca /etc/cfssl/intermediate_ca.pem -ca-key /etc/cfssl/intermediate_ca-key.pem -port 8888 -db-config /etc/cfssl/db-config.json -config /etc/cfssl/config.json -responder /etc/cfssl/ocsp.pem -responder-key /etc/cfssl/ocsp-key.pem
* Service neu starten:
* Service neu starten:
  systemctl daemon-reload
  systemctl daemon-reload
  systemctl restart cfssl.service
  systemctl restart cfssl.service
* Test-Zertifikat mittels Lemur erstellen und Zertifikats-Inhalt in /tmp/test.pem ablegen
* Refresh:
cfssl ocsprefresh -db-config /etc/cfssl/db-config.json -responder /etc/cfssl/ocsp.pem -responder-key  /etc/cfssl/ocsp-key.pem -ca /etc/cfssl/intermediate_ca.pem
* Database Dump:
* Database Dump:
  cfssl ocspdump -db-config /etc/cfssl/db-config.json >/etc/cfssl/ocsdump.txt
  cfssl ocspdump -db-config /etc/cfssl/db-config.json >/etc/cfssl/ocsdump.txt
* OCSP Daemon starten (IP_Server mit der aktuellen IP ersetzen):
* OCSP Daemon starten (IP_Server mit der aktuellen IP ersetzen):
  cfssl ocspserve -address=IP_Server -port=8889 -responses=/etc/cfssl/ocsdump.txt
  cfssl ocspserve -address=0.0.0.0 -port=8889 -responses=/etc/cfssl/ocsdump.txt
 
* nues Terminal-Fenster öffnen, um mittels OCSP-Abfrage den Zertifikats-Status von /tmp/test.pem zu ermitteln
openssl ocsp -issuer /etc/cfssl/intermediate_ca.pem -no_nonce -cert /tmp/test.pem -url http://localhost:8889
Ausgabe sollte folgendermaßen aussehen:
Response verify OK
/tmp/test.pem: good
* Test-Zertifikat mittels Lemur zurückrufen (Certificates/Acion/Revoke). Als Grund z.B. superseeded auswählen
* OCSP-Responder mittels Ctl-C beenden und alle Schritte ab Refresh wiederholen. Die Ausgabe des OCSP-Status sollte nun folgendermaßen aussehen:
Response verify OK
/tmp/test.pem: revoked
        This Update: date_this
        Next Update: date_next
        Reason: superseded
* OSCP Responder beenden und Systemd-Dienst anlegen, damit OCSP beim Systemstart gestartet wird:
vi /etc/systemd/system/cfssl-ocsp.service
Folgende Zeilen einfügen:
[Unit]
Description=Cloudflare's OCSP Responder
Requires=network-online.target
After=network-online.target
[Service]
Type=simple
Restart=always
RestartSec=5
User=cfssl
ExecStart=/usr/local/bin/cfssl ocspserve -address=0.0.0.0 -port=8889 -db-config=/etc/cfssl/db-config.json -responses=/etc/cfssl/ocspdump.txt
PrivateTmp=yes
ProtectSystem=full
NoNewPrivileges=yes
[Install]
WantedBy=multi-user.target
* OCSP aktivieren und starten:
systemctl enable cfssl-ocsp
systemctl start cfssl-ocsp





Aktuelle Version vom 11. August 2021, 18:30 Uhr

Introduction

Lemur erstellt eine / oder mehrere lokale RootCA's für die übersichtlich und einfach Server oder Client Zertifkate ausgestellt, verlängert oder wiederrufen werden können. Das ganze erfolgt komplett im Webbrowser. Es stehen zahlreiche Plugins zur Verfügung mit deren Hilfe z.B. auch letsencrypt validierte Server Zertifikate verwalet werden können. Lemur wurde von Netflix entwickelt, das dort für die eigene Infrastruktur verwendet wird und über Github der Allgemeinheit zur Verfügung gestellt wurde. Lemur ist ein Python Server Dienst

Installation

Debian Pakete

Lemur benötig zahlreiche Pakete, die aus den Debian Paketquellen installierbar sind

apt-get install sudo nodejs python3-pip python-dev python3-dev libpq-dev build-essential libssl-dev libffi-dev libsasl2-dev libldap2-dev apache2 git supervisor npm postgresql gulp git

User für Lemur Dienst

useradd -m -s /bin/bash lemur
passwd lemur

Python envirnonment einrichten für Lemur

pip install -U virtualenv
mkdir /www
chown lemur lemur
cd /www
su lemur
git clone https://github.com/Netflix/lemur
cd lemur

git clone lädt aktuellen Development master herunter, der nicht unbedingt getestet und stabil funktioniert. Deshalb ist es ratsam eine aktuelle Tag-Version zu verweden, die zwar nicht ganz so aktuell ist wie der master, aber dafür die Chancen höher sind, eine funktionale Lemur Version zu erhalten. Anzeigen der aktuellen tag-Versionen

git tag -n

Ausgabe z.B.

0.1             Merge pull request #32 from kevgliss/entropy
0.1.2           Merge pull request #70 from jeremy-h/master
0.1.3           Merge pull request #81 from kevgliss/pipy
0.1.4           Hotfix Release
0.1.5           Merge pull request #129 from kevgliss/version
0.2             Merge pull request #167 from forkd/master
0.2.1           Merge pull request #190 from kevgliss/0.2.1
0.2.2           Merge pull request #241 from kevgliss/0.2.2.release
0.3.0           release bump (#348)
0.4.0           Closes: #469 (#510)
0.5.0           0.5 Release (#750)
0.5.1           Pinning version of PyOpenSSL #873
0.6.0           6.0 release. (#1033)
0.7.0           Merge pull request #1372 from castrapel/acme_validation_dns_provider_option
0.8.0
v0.10.0         Merge pull request #3646 from havron/filter-autorotate
v0.8.1          Merge pull request #3471 from hosseinsh/aut0mate-bump-version
v0.9.0          Merge pull request #3485 from hosseinsh/changelog-0.9.0

Auswhl der neuesten Version (in obigem Fall v0.10.0):

git checkout tags/v0.10.0

Python virtualenv erstellen und lemur erstellen

virtualenv -p python3 /www/lemur/
source /www/lemur/bin/activate
cd lemur
make release

Konfiguration erstellen und anpassen

lemur create_config
vi ~/.lemur/lemur.conf.py

Folgende Parameter anpassen:

LEMUR_EMAIL = 'lemur@domain.org'
LEMUR_SECURITY_TEAM_EMAIL = 'lemur@domain.org'
LEMUR_DEFAULT_COUNTRY = 'DE'
LEMUR_DEFAULT_STATE = 'Bavaria'
LEMUR_DEFAULT_LOCATION = 'Other'
LEMUR_DEFAULT_ORGANIZATION = 'Private' 
LEMUR_DEFAULT_ORGANIZATIONAL_UNIT = 'Network Admin'
LOG_FILE = "/www/lemur/lemur.log"

oben vergebenes Datenbank Passwort lemur_pwd ersetzen

 SQLALCHEMY_DATABASE_URI = 'postgresql://lemur:lemur_pwd@localhost:5432/lemur'

Folgende Zeilen ans Ennde anfügen, um Warninngs der Plugins zu unterbinden:

DIGICERT_URL = ' '
DIGICERT_ORG_ID = ' '
DIGICERT_ORDER_TYPE = ' '
DIGICERT_ROOT = ' '
DIGICERT_CIS_API_KEY = ' '
DIGICERT_CIS_URL = ' '
DIGICERT_CIS_ROOTS = ' '
DIGICERT_CIS_PROFILE_NAMES = ' '
DIGICERT_API_KEY = ' '
ENTRUST_API_KEY = ' '
ENTRUST_API_CERT = ' '
ENTRUST_API_USER = ' '
ENTRUST_API_PASS = ' '
ENTRUST_URL = ' '
ENTRUST_ROOT = ' '
ENTRUST_NAME = ' '
ENTRUST_EMAIL = ' '
ENTRUST_PHONE = ' '

lemur User Umgebung verlassen

exit

Datenbank für Lemur einrichten

sudo -u postgres -i
psql

möglichst langes und komplexes Passwort lemur_pwd vergeben, da Lemur User SuperUser Rechte bekommt.

CREATE USER lemur WITH PASSWORD 'lemur_pwd';
alter role lemur createrole SuperUser;

Postgres verlassen mit der Tastenkombination:

\q

Datenbank anlegen:

createdb lemur

Postgres Umgebung verlassen:

exit

Lemur initialisiern und starten

su lemur
cd /www/lemur/lemur
/www/lemur/bin/lemur init

Ein Passwort des Webusers lemur wird abgefragt. Dieser User hat nichts mit dem Linux User lemur zu tun, unter dessen Rechten der Lumur Dienst ausgeführt wird.

/www/lemur/bin/lemur start

Lemur sollte starten und keine Fehler ausgeben. Evtl. Warnings können ignoriert werden. Lemur startet auf diese Weise nicht als Dienst, sondern im Vordergrund und blockiert das aktuelle Terminal Fenster. Lemur abbrechen und lemur Umgebung verlassen:

CTRL-C
exit

Systemd Diemst für Lemur

vi /etc/systemd/system/lemur.service

Folgende Zeilen einfügen:

[Unit]
Description=Neflix TLS certificate manager
Requires=network-online.target
After=network-online.target

[Service]
User=lemur
Group=lemur
ExecStart=/www/lemur/bin/lemur --config=/home/lemur/.lemur/lemur.conf.py start -b 127.0.0.1:8000
Restart=always
PrivateTmp=yes
ProtectSystem=full
NoNewPrivileges=yes

[Install]
WantedBy=multi-user.target

Dienst aktivieren und starten:

systemctl daemon-reload
systemctl enable lemur.service
systemctl start lemur.service

check ob Lemur Process läuft:

systemctl status lemur.service

Die Ausgabe sollte folgende Zeile enthalten:

Active: active (running)


Web Proxy

Standardmäßig läuft lemur auf Port 8000. Der Port könnte zwar geändert werden aber nicht auf Port 443, wenn Lemur als beschränkter User lemur laufen soll. Um Lemur dennoch auf Port 443 erreichbar zu machen wird Apache als Reverse Proxy verwendet. Falls noch kein SSL-Zertifikat für den Lemur-Host zur Verfügung steht, kann zunächst das generische Cert sakeoil verwendet werden, das auf jedem Debian System zur Verfügung steht. Mit Hilfe von Lemur kann anschließend ein angepasstes Zertifikat für den Lemur Host generiert werden und in den Apache Virtualhost eingetragen werden.

vi /etc/apache2/sites-available/lemur_https.conf

Folgende Zeilen einfügen und anpassen (domain.org entsprechend anpassen, Pfad zu SSL Zertifikat und Key ebenfalls anpassen):

<VirtualHost *:443>
        ServerName domain.org
 
        SSLEngine on
        SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
        SSLCertificateKeyFile   /etc/ssl/private/ssl-cert-snakeoil.key

        # intermediate configuration, tweak to your needs
        SSLProtocol             all -SSLv2 -SSLv3
        SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
        SSLHonorCipherOrder     on

        # HSTS (mod_headers is required) (15768000 seconds = 6 months)
        Header always set Strict-Transport-Security "max-age=15768000"

        # Set the lemur DocumentRoot to static/dist
        DocumentRoot /www/lemur/lemur/static/dist

        <Directory /www/lemur/lemur/static/dist>
                Require ip 192.168.0.0/16
        </Directory>

        # Uncomment to force http 1.0 connections to proxy
        # SetEnv force-proxy-request-1.0 1

        #Don't keep proxy connections alive
        SetEnv proxy-nokeepalive 1

        # Only need to do reverse proxy
        ProxyRequests Off

        <Proxy *>
                Require ip 192.168.0.0/16
        </Proxy>
        # Proxy requests to the api to the lemur service (and sanitize redirects from it)
        ProxyPass "/api" "http://127.0.0.1:8000/api"
        ProxyPassReverse "/api" "http://127.0.0.1:8000/api"

</VirtualHost>

Virtualhost aktivieren:

a2ensite lemur_https

nötige Module aktivieren:

a2enmod ssl headers proxy proxy_http proxy_html

Apache neu starten:

service apache2 restart


Funktionstest mit Webbrowser

Ip oder Domainname des Lemur servers per HTTP und/oder HTTPS in die Adresszeile des Browsers eingeben. Die Lemur Login Seite sollte erscheinen. Mittels User lemur und Web-Passwort, das bei während der Initialisierung vergeben wurde, einloggen.


Optional CFSSL Plugin

Lemur unterstützt zahlreiche Plugins zur Erstellung der Zertifikate. Das integrrierte Plugin Cryptographic verwendet das openssl Paket für die Generierung der Schlüssel und Zertifikate. Neben zahlreichen Plugins, die Zertifikate mittels kommerzieller Zertifizierungsstellen, bietet CFSSL (CloudFlare SSL) die Generierung von kostenlosen Zeretifikaten.

Installation

apt-get install golang
useradd -m -s /bin/bash cfssl
passwd cfssl
su - cfssl
go get -u github.com/cloudflare/cfssl/cmd/...
go get bitbucket.org/liamstask/goose/cmd/goose
exit
ln -s /home/cfssl/go/bin/cfssl* /usr/local/bin/
ln -s /home/cfssl/go/bin/multirootca /usr/local/bin/
ln -s /home/cfssl/go/bin/mkbundle /usr/local/bin/
ln -s /home/cfssl/go/bin/goose /usr/local/bin/
mkdir /etc/ssl/cfssl_ca
chown cfssl. /etc/ssl/cfssl_ca


Datenbank

su - postgres
psql

cfssl_pwd sollte möglichst lange und kompliziert gewählt werden. Sonderzeichen sollten vermieden werden.

CREATE USER u_cfssl WITH PASSWORD 'cfssl_pwd';
CREATE DATABASE db_cfssl OWNER u_cfssl;
\q
exit
vi /etc/postgresql/13/main/pg_hba.conf

folgende Zeilen ans Ende anfügen:

host    db_cfssl        u_cfssl         127.0.0.1/32            scram-sha-256
host    db_cfssl        u_cfssl         ::1/128                 scram-sha-256

Postgres neu starten

service postgresql restart
mkdir /etc/cfssl
chown cfssl. /etc/cfssl
su - cfssl
vi /etc/cfssl/db-config.json

folgende Zeilen einfügen (cfss_pwd mit eben angelegtem Passwort für db user u_cfssl ersetzenn):

{
    "driver": "postgres",
    "data_source": "postgres://u_cfssl:cfssl_pwd@localhost/db_cfssl"
}

goose configfile cbconf.yml:

vi  ~/go/src/github.com/cloudflare/cfssl/certdb/pg/dbconf.yml

Folgende Zeilen am Ende anfügen und cfssl_pwd anpassen:

custom:
  driver: postgres
  open: user=u_cfssl password=cfssl_pwd dbname=db_cfssl sslmode=disable


Datenbank befüllen:

goose --env custom -path ~/go/src/github.com/cloudflare/cfssl/certdb/pg up


Root CA und Intermediate CA Zertifikate

Verzeichnisse erstellen:

su - cfssl
mkdir /etc/ssl/cfssl_ca/root
mkdir /etc/ssl/cfssl_ca/intermediate

Root CA:

vi /etc/ssl/cfssl_ca/root/csr_ROOT_CA.json

Folgende Zeilen einfügen und evtl. anpassen:

{
    "CN": "Private Root CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "DE",
            "ST": "Bavaria",
            "L": "Other",
            "O": "Private",
            "OU": "Certificate Management"
        }
    ],
    "ca": {
        "expiry": "262800h"
    }
}

Folgender Befehl generiert Root CA private Key root_ca-key.pem und Zertifikat root_ca.pem:

cfssl gencert -initca /etc/ssl/cfssl_ca/root/csr_ROOT_CA.json | cfssljson -bare /etc/ssl/cfssl_ca/root/root_ca

Intermediate CA:

vi /etc/ssl/cfssl_ca/intermediate/csr_intermediate.json

Folgende Zeilen einfügen und evtl. anpassen:

{
    "CN": "Private Intermediate CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "DE",
            "ST": "Bavaria",
            "L": "Other",
            "O": "Private",
            "OU": "Certificate Management"
        }
    ],
    "ca": {
        "expiry": "87600h"
    }
}

Konfigfile:

vi /etc/ssl/cfssl_ca/intermediate/root_to_intermediate_ca.json

Folgende Zeilen einfügen und evtl. anpassen:

{
    "signing": {
         "default": {
            "usages": [
                "digital signature",
                "cert sign",
                "crl sign",
                "signing"
            ],
            "expiry": "87600h",
            "ca_constraint": {
                "is_ca": true,
                "max_path_len": 0,
                "max_path_len_zero": true
            }
        }
    }
}

Folgende Befehle generieren Intermediate CA private Key intermediate_ca-key.pem und Zertifikat intermediate_ca.pem, das von eben erstellter Root CA signiert wird:

cfssl gencert -initca /etc/ssl/cfssl_ca/intermediate/csr_intermediate.json | cfssljson -bare /etc/ssl/cfssl_ca/intermediate/intermediate_ca
cfssl sign -ca /etc/ssl/cfssl_ca/root/root_ca.pem -ca-key /etc/ssl/cfssl_ca/root/root_ca-key.pem -config /etc/ssl/cfssl_ca/intermediate/root_to_intermediate_ca.json  /etc/ssl/cfssl_ca/intermediate/intermediate_ca.csr | cfssljson -bare /etc/ssl/cfssl_ca/intermediate/intermediate_ca

Verifizierung, dass Intermediate CA von Root CA unterschrieben und gültig ist:

openssl verify -CAfile /etc/ssl/cfssl_ca/root/root_ca.pem /etc/ssl/cfssl_ca/intermediate/intermediate_ca.pem

Folgende Zeile wird ausgegeben:

/etc/ssl/cfssl_ca/intermediate/intermediate_ca.pem: OK

Falls nicht, macht es keinen Sinn, weiterzumachen, da die Zertifikate nicht gültig sind und später zu Problemen führen werden. Fehlersuche ist erforderlich.


CFSSL Service

CFSSL wird als Daemon ausgeführt, der mit Lemur via Netzwerk kommuniziert, anstelle von CLI-Befehlen, mit denen die CA eben erstellt wurde. Dafür sind Konfigfiles erforderlich.

vi /etc/cfssl/config.json

Folgende Zeilen einfügen und API_KEY anpassen. Der Key ist ein HMAC-Hex-Key, der möglichst lang sein sollte. Er schützt den API-Server vor unberechtigtem Zugriff:

{
  "signing": {
    "default": {
      "ocsp_url": "http://Domain_Server:8889",
      "crl_url": "http://Domain_Server:8888//api/v1/cfssl/crl",
      "expiry": "26280h",
      "usages": [
        "signing",
        "key encipherment",
        "client auth",
        "server auth"
      ],
      "auth_key": "default_auth"
    },
    "profiles": {
      "intermediate": {
        "expiry": "43800h",
        "usages": [
          "signing",
          "key encipherment",
          "cert sign",
          "crl sign"
        ],
        "ca_constraint": {
          "is_ca": true,
          "max_path_len": 1
        },
        "auth_key": "default_auth"
      },
      "ocsp": {
        "usages": [
          "digital signature",
          "ocsp signing"
        ],
        "expiry": "26280h",
        "auth_key": "default_auth"
      },
      "serverCA": {
        "expiry": "43800h",
        "usages": [
          "signing",
          "key encipherment",
          "server auth",
          "cert sign",
          "crl sign"
        ],
        "auth_key": "default_auth"
      },
      "server": {
        "expiry": "43800h",
        "usages": [
          "signing",
          "key encipherment",
          "server auth"
        ],
        "auth_key": "default_auth"
      },
      "client": {
        "expiry": "43800h",
        "usages": [
          "signing",
          "key encipherment",
         "client auth",
          "email protection"
        ],
        "auth_key": "default_auth"
      }
    }
  },
  "auth_keys": {
    "default_auth": {
      "type": "standard",
      "key": "API_KEY"
    }
  }
}

Symlinks in /etc/cfssl/ erstellen

ln -s /etc/ssl/cfssl_ca/root/root*.pem /etc/cfssl/
ln -s /etc/ssl/cfssl_ca/intermediate/intermediate_ca*.pem /etc/cfssl/

CFSSL-API Server im Vordergrund starten:

cfssl serve -address 127.0.0.1 -ca /etc/cfssl/intermediate_ca.pem -ca-key /etc/cfssl/intermediate_ca-key.pem -port 8888 -db-config /etc/cfssl/db-config.json -config /etc/cfssl/config.json

Der API-Server sollte starten und einige Zeilen mit Infos und Warnings auszugeben. Server mit CTL-C beenden. Falls API-Server läuft, Systemd-Service File anlegen. Der Systemdienst muss als root user angelegt werden. Deshalb cfssl user mit exti verlassen:

exit
vi /etc/systemd/system/cfssl.service

Folgende Zeilen einfügen:

[Unit]
Description=CloudFlare's PKI/TLS toolkit
Requires=network-online.target
After=network-online.target

[Service]
User=cfssl
Group=cfssl
ExecStart=/usr/local/bin/cfssl serve -address 127.0.0.1 -ca /etc/cfssl/intermediate_ca.pem -ca-key /etc/cfssl/intermediate_ca-key.pem -port 8888 -db-config /etc/cfssl/db-config.json -config /etc/cfssl/config.json
Restart=always
PrivateTmp=yes
ProtectSystem=full
NoNewPrivileges=yes

[Install]
WantedBy=multi-user.target

CFSSL Daemon aktivieren im Hintergrund startenn.

systemctl daemon-reload
systemctl enable cfssl.service
systemctl start cfssl.service


Eibindung in Lemur

Lemur Konfigfile anpassen:

vi /home/lemur/.lemur/lemur.conf.py

Folgende Zeilen einfügen und ROOT_CA und INTERMEDIATE_CA mit dem Inhalt der root_ca.pem und intermediate_ca.pem ersetzen:

CFSSL_URL ="http://127.0.0.1:8888"
CFSSL_ROOT ="""ROOT_CA"""
CFSSL_INTERMEDIATE ="""INTERMEDIATE_CA"""
CFSSL_KEY = "API_KEY"

z.B.

CFSSL_ROOT ="""-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----"""
CFSSL_INTERMEDIATE ="""-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----"""
CFSSL_KEY = "API_KEY"

Lemur neu starten, um die Änderungen am Konfigfile zu übernehmen:

service lemur restart

In Lemur eine neue root authority anlegen:

  • Typ: root
  • Plugin: CSSL
  • alle anderen Optionen wir gewünscht

In Lemur eine neue SubCA authority anlegen:

  • Typ: subca
  • Parent Authority: Eben erstellte CFSSL Root CA
  • Plugin: CFSSL
  • alle anderen Optionen wir gewünscht

CRL und OCSP Responder

CRL (Certificate Revocation List) -> Liste aller zurückgerufener Zertifikate und OCSP (Online Certificate Status Protocol) -> Abfrage ob e bestimmtes Zertifikat zurückgerufe wurde, geben den Status zurückgerufener Zertifikate an Clients wieder, um diesen zurückgerufene, ungültige Zertifikate mitzuteilen. CFSSL bietet beide Möglichkeiten.

Für OCSP ist ein eigenes Zertifikat mit der Zertifikat Extensionn OCSP_SIGNER erforderlich. Diese wird von CFSSL selbst angelegt und vom Intermediate Zertifikat signiert.

vi /etc/cfssl/intermediate/ocsp.csr.json

Folgende Zeilen einfügen:

{
  "CN": "OCSP signer",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "DE",
      "ST": "Bavaria",
      "L": "Other",
      "O": "Private"
    }
  ]
}

signiertes Zertifikat mit cfssl generieren:

cfssl gencert -ca=intermediate_ca.pem -ca-key=intermediate_ca-key.pem -config=/etc/cfssl/config.json -profile="ocsp" ocsp.csr.json |cfssljson -bare ocsp

OCSP Zertifikat und key verlinken:

ln -s /etc/ssl/cfssl_ca/intermediate/ocsp*pem /etc/cfssl/
  • Systemd Service-File anpassen:
vi /etc/systemd/system/cfssl.service

ExecStart um -responder und -responder-key erweitern:

ExecStart=/usr/local/bin/cfssl serve -address 127.0.0.1 -ca /etc/cfssl/intermediate_ca.pem -ca-key /etc/cfssl/intermediate_ca-key.pem -port 8888 -db-config /etc/cfssl/db-config.json -config /etc/cfssl/config.json -responder /etc/cfssl/ocsp.pem -responder-key /etc/cfssl/ocsp-key.pem
  • Service neu starten:
systemctl daemon-reload
systemctl restart cfssl.service
  • Test-Zertifikat mittels Lemur erstellen und Zertifikats-Inhalt in /tmp/test.pem ablegen
  • Refresh:
cfssl ocsprefresh -db-config /etc/cfssl/db-config.json -responder /etc/cfssl/ocsp.pem -responder-key  /etc/cfssl/ocsp-key.pem -ca /etc/cfssl/intermediate_ca.pem
  • Database Dump:
cfssl ocspdump -db-config /etc/cfssl/db-config.json >/etc/cfssl/ocsdump.txt
  • OCSP Daemon starten (IP_Server mit der aktuellen IP ersetzen):
cfssl ocspserve -address=0.0.0.0 -port=8889 -responses=/etc/cfssl/ocsdump.txt
  • nues Terminal-Fenster öffnen, um mittels OCSP-Abfrage den Zertifikats-Status von /tmp/test.pem zu ermitteln
openssl ocsp -issuer /etc/cfssl/intermediate_ca.pem -no_nonce -cert /tmp/test.pem -url http://localhost:8889

Ausgabe sollte folgendermaßen aussehen:

Response verify OK
/tmp/test.pem: good
  • Test-Zertifikat mittels Lemur zurückrufen (Certificates/Acion/Revoke). Als Grund z.B. superseeded auswählen
  • OCSP-Responder mittels Ctl-C beenden und alle Schritte ab Refresh wiederholen. Die Ausgabe des OCSP-Status sollte nun folgendermaßen aussehen:
Response verify OK
/tmp/test.pem: revoked
       This Update: date_this
       Next Update: date_next
       Reason: superseded
  • OSCP Responder beenden und Systemd-Dienst anlegen, damit OCSP beim Systemstart gestartet wird:
vi /etc/systemd/system/cfssl-ocsp.service

Folgende Zeilen einfügen:

[Unit]
Description=Cloudflare's OCSP Responder
Requires=network-online.target
After=network-online.target

[Service]
Type=simple
Restart=always
RestartSec=5
User=cfssl
ExecStart=/usr/local/bin/cfssl ocspserve -address=0.0.0.0 -port=8889 -db-config=/etc/cfssl/db-config.json -responses=/etc/cfssl/ocspdump.txt
PrivateTmp=yes
ProtectSystem=full
NoNewPrivileges=yes

[Install]
WantedBy=multi-user.target
  • OCSP aktivieren und starten:
systemctl enable cfssl-ocsp
systemctl start cfssl-ocsp


Optional webbased Postgres Admin phppgadmin

Optional kann phppgadmin installiert werden, um grafisch auf die Postgres Datenbank zugreifen zu könnnen.

apt-get install php7.* php7.*-mbstring php7.*-pgsql libapache2-mod-php7.* phppgadmin

PHP Apache Modul aktivieren:

a2enmod php7.x

x mit der installierten PHP-Version ersetzen

Zugriff aus dem LAN auf phppgadmin:

vi /etc/apache2/conf-enabled/phppgadmin.conf

Folgende Änderung durchführen (Require local auskommentieren und Require ip Zeile einfügen):

#Require local
Require ip 192.168.0.0/16

Apache neu starten

service apache2 restart

Postgres konfigurieren:

su - postgres
psql
\password postgres

2xneues postgres admin user passwort vergeben, das für den Zugriff durch phppgadmin nötig ist Postgres mit \q verlassen

\q

su Umgebung verlassen:

exit

phppgadmin Konfiguration anpassen:

vi /etc/phppgadmin/config.inc.php

['extra_login_security'] von true nach alse ändern

$conf['extra_login_security'] = false;

Webbrowser öffnen und http://ip-des-server/phppgadmin/ eigeben. Die phppgadmin seite sollte erscheinen. im linken Bereich Sever/PostgreSQL anklicken und mittels user postgres und eben vergebenem Passwort einloggen.