Wie viele andere verwende ich für private Seiten Let’s Encrypt, um SSL-Zertifikate zu beziehen. Gleichzeitig publiziere ich im DNS sog. TLSA-Records, um zusätzlich die Sicherheit zu erhöhen. Wenn jetzt ein automatisches Update der Zertifikate statt findet, dann ändert sich ja zumindest mal der Record vom Typ 3 1 1 (End Entity, Public Key, SHA-256). Der Eintrag vom Typ 2 1 1 (Trust Anchor, i.e. CA, Public Key, SHA-256) bliebt wahrscheinlich gleich.

Es bietet sich also an, den Kram selbst zu berechnen. Das folgende Stück Ruby hilft dabei:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
require 'openssl'
require 'socket'

socket = TCPSocket.new(endpoint, port)
ssl_socket = OpenSSL::SSL::SSLSocket.new(socket)
ssl_socket.hostname = endpoint # wichtig für SNI
ssl_socket.connect
chain = ssl_socket.peer_cert_chain
ssl_socket.sysclose
socket.close

ta = OpenSSL::Digest::SHA256.hexdigest(chain[1].public_key.to_der)
ee = OpenSSL::Digest::SHA256.hexdigest(chain[0].public_key.to_der)

printf("_%d._tcp.#{endpoint} IN TLSA 2 1 1 %s\n", port, ta)
printf("_%d._tcp.#{endpoint} IN TLSA 3 1 1 %s\n", port, ee)

Ich habe das ganze jetzt mal in ein Puppet-Modul gepackt, ein bißchen Logging-Und Konfiguration-Code außenrum geschrieben und schaue jetzt mal, wie das so funktioniert. Falls jemand den Code will, einfach melden.