Jeder der schon einmal mit Docker gearbeitet hat, kommt früher oder später wahrscheinlich einmal an den Punkt, an dem es nötig wird ein Zertifikat einzubinden.

Das passiert vor allem dann, wenn man sich in internen Ressourcen bewegt, wie zum Beispiel in Firmennetzwerken, in denen Zertifikate sich nicht per let’s encrypt oder anderen Zertifizierungsstellen einbinden lassen, weil diese per Firewall von Außen abgeschottet sind.

In diesem Fall kommt es vor, das bei Request z.B. per Curl Fehler erscheinen. Im Falle von curl sieht es dann meist wie folgt aus:

curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

Das ist natürlich ärgerlich. Nun könnte man natürlich sagen „Okay, es ist eine interne Ressource, warum sollte ich SSL benutzen?“. Das ist allerdings eine schlechte Entscheidung. Im Zweifelsfall kann ein Angreifer, wenn er in das interne Netzwerk eindringt den kompletten Datenverkehr auslesen. Das wollen wir natürlich vermeiden.

Hier kommt nun ein kleiner Command in die Dockerfile. Im ersten Fall gehen wir davon aus, das das Zertifikat auf einem internen Server liegt und wir es im Build direkt von dort ziehen können. Das ganze sieht wie folgt aus:

RUN curl -L -k -o /usr/local/share/ca-certificates/custom.crt your.certificate.url && update-ca-certificates

Anschließend ist das Zertifikat im Container und vorhanden und jegliche Software im Container sollte darauf zugreifen können.

Wenn ihr das Zertifikat nicht jedesmal von einem Server laden wollt, gibt es noch eine zweite Möglichkeit:

COPY ./your/path/to/cert/custom.crt /usr/local/share/ca-certificates/custom.crt
RUN update-ca-certificates

Der Nachteil bei dieser Variante ist, das wenn das Zertifikat ausläuft, Ihr es manuell neu in eurem Zertifikatspfad aktualisieren müsst. Hier hat die erste Variante den Vorteil, das im Normalfall Zertifikate auf Servern automatisch aktualisiert werden bzw. es Ansprechpartner dafür gibt.

Es ist also kein Hexenwerk, neue Zertifikate in Containern zu hinterlegen.

Bei Fragen zu Docker, Containern und Kubernetes könnt ihr uns gerne kontaktieren.