24.02.2021
Bacula – Problem mit Bacula FD/Director Zertifikaten
Es kommt zu einem Problem mit Bacula FD/Director Zertifikaten: "ERR=19:self signed certificate" oder "ERR=18:self signed certificate".
Fehler
...ERR=19:self signed certificate in certificate chain...
bzw mit ERR=18 und ausführlicher:
Jan 26 00:21:43 my-host.example.com bacula-fd: my-host-fd JobId 0: Error: tls.c:92 Error with certificate at depth: 0, issuer = /C=DE/ST=Berlin/L=Berlin/O=/CN=my-host.example.com, subject = /C=DE/ST=Berlin/L=Berlin/O=/CN=my-host.example.com, ERR=18:self signed certificate # <= Beachte: issuer / subject sind identisch !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Jan 26 00:21:49 my-host.example.com bacula-fd: my-host-fd: Fatal Error at authenticate.c:208 because:
Jan 26 00:21:49 my-host.example.com bacula-fd: Unable to authenticate Director
Jan 26 00:21:49 my-host.example.com bacula-fd: bsock.c:335 Socket has errors=1 on call to client:10.10.10.10:36387
Jan 26 00:21:49 my-host.example.com bacula-fd: bsock.c:335 Socket has errors=1 on call to client:10.10.10.10:36387
Jan 26 00:21:49 my-host.example.com bacula-fd: bsock.c:335 Socket has errors=1 on call to client:10.10.10.10:36387
Analyse
Sind neben der Fehlermeldung noch "issuer =" und "subject =" genannt und ist der CN= Wert in diesen identisch, ist das Zertifikat vermutlich tatsächlich vom Host selbst ausgestellt (daher "self signed"). Es sollte bei "issuer" CN der Name der CA erscheinen und nicht der des Hosts auf dem das Zertifikat verwendet wird. Beispiel, wie issuer und subject bei einem korrekten Zertifikat aussehen sollten (Bespiel hier aus einer anderen "expired" Fehlermeldung genommen):
26-Jan 00:20 bconsole JobId 0: Error: tls.c:96 Error with certificate at depth: 0, issuer = /CN=My CA: my-ca.example.com, subject = /CN=my-host.example.com, ERR=10:certificate has expired
Lösung 1
Falls eine eigene CA zum Einsatz kommt, muss das Zertifikat des Clients von dieser CA erstellt sein. Welche CA Zertifikate erlaubt sind, sieht man auf dem Director über die Konfigurationsoption "TLS CA Certificate Dir" oder "TLS CA Certificate File". Das oder eines der dort erlaubten CA Zertifikate muss beim Client im Einsatz sein und das Client Zertifikat muss von einem dieser CA Zertifikate signiert sein.
Lösung 2
Wenn eine neue CA generiert worden ist, muss für dieses ein Hash im "CA Certificate Dir" erzeugt werden (dazu muss diese Option natürlich auch in der FD Config vorhanden sein).
CAFILE=/var/lib/puppet/ssl/certs/ca.pem # <- hier die neue CA eintragen
cd <CA Certificate Dir>
ln -s $CAFILE /etc/bacula/$(openssl x509 -noout -hash -in $CAFILE).0