Kategorien: | HowTos |
---|
Infrastrukturen, die Dienste mittels TLS anbieten, benötigen häufig einen Automatismus zum regelmässigen Austausch der verwendeten Zertifikate. Dies lässt sich unter anderem durch den Einsatz von Certmonger und FreeIPA abbilden.
Standardmäßig ist ein FreeIPA-Server so konfiguriert, dass er Zertifikate mittels eines Profils mit RSA-Schlüsseln erstellt. Existieren allerdings kryptografische Anforderungen, die beispielsweise EC-Schlüssel vorausgesetzt, muss eine Änderung des FreeIPA-Profils vorgenommen werden, um diese zu ermöglichen. Ist dies geschehen, können auch mittels Certmonger – unter Angabe des angepassten Profils – diese Art von Schlüsseln verwendet werden.
Der folgende Artikel greift genau die genannte Anpassung des FreeIPAs auf, um zu zeigen, wie über Certmonger auch Zertifikate mit EC-Schlüsseln nutzbar gemacht werden können.
Für die folgenden Beispiele wird ein FreeIPA-Server und ein entsprechender Client, der auch als Client am FreeIPA registriert wurde, benötigt. Im Rahmen dieses Beispiels sind beide Systeme dabei mit Centos 9 Stream aufgesetzt.
Certmonger läuft typischerweise als Daemon im Hintergrund und überwacht Zertifikate auf ihren Ablauf. Dabei kann der Dienst Zertifikate erneuern, sofern eine CA dafür zur Verfügung steht, oder auch das vollständige Ausrollen von Zertifikaten inklusive Schlüsselerstellung übernehmen, sofern dies gewünscht ist.
Die Reihenfolge seitens Certmonger sieht hierbei typischerweise wie folgt aus:
Die Design-Dokumentation gibt weitere Details hierzu.
EC ist ebenfalls als ECDSA
(Elliptic Curve Digital Signature Algorithm) bekannt. Zur Erstellung solcher Schlüssel wird Elliptic Curve Cryptography (ECC) verwendet, die eine Nutzung kleinerer Schlüssellängen erlaubt. Wie RSA auch, arbeitet ECDSA asymmetrisch, d.h. es werden hier ebenfalls ein öffentlicher und ein privater Schlüssel genutzt.
Die Voraussetzung für das besagte Setup sehen wie folgt aus:
Der FreeIPA-Server ist dabei bereits konfiguriert und bietet seine Dienste entsprechend an. Die Clients auf der anderen Seite können den FreeIPA-Server erreichen, auf dem bereits Certmonger (ipa-client) installiert ist.
Mit der Standardkonfiguration bietet der FreeIPA-Server bereits einige Profile zur Erstellung von Zertifikate an:
[root@ipa ~]# ipa certprofile-find
------------------
4 profiles matched
------------------
Profile ID: acmeIPAServerCert
Profile description: ACME IPA service certificate profile
Store issued certificates: False
Profile ID: caIPAserviceCert
Profile description: Standard profile for network services
Store issued certificates: True
Profile ID: IECUserRoles
Profile description: User profile that includes IECUserRoles extension from request
Store issued certificates: True
Profile ID: KDCs_PKINIT_Certs
Profile description: Profile for PKINIT support by KDCs
Store issued certificates: False
----------------------------
Number of entries returned 4
----------------------------
Am Einfachsten ist es daher, z.B. das vorhandene Profile caIPAServicecert
zu exportieren und die notwendigen Änderungen dort vorzunehmen. Hiefür wird das entsprechende Profil exportiert und beispielsweise in einer Datei namens caIPAserviceCert_ECDSA.cfg
gespeichert:
[root@ipa ~]# ipa certprofile-show caIPAserviceCert --out caIPAserviceCert_ECDSA.cfg
-----------------------------------------------------------------
Profile configuration stored in file 'caIPAserviceCert_ECDSA.cfg'
-----------------------------------------------------------------
Profile ID: caIPAserviceCert
Profile description: Standard profile for network services
Store issued certificates: True
In dem exportierten Profil werden nun mittels eines einfachen Texteditors die notwendigen Änderungen vorgenommen, um auch andere Schlüsseltypen zu unterstützen:
policyset.serverCertSet.3.constraint.params.keyParameters=nistp256,nistp384,nistp521,sect163k1,nistk163
policyset.serverCertSet.3.constraint.params.keyType=EC
profileId=caIPAserviceCert_ECDSA
Die für den Paramter keyParameters
möglichen Werte können dabei mit dem folgenden Befehl ermittelt werden:
[root@ipa ~]# certutil -G -H
[...]
-k key-type Type of key pair to generate ("dsa", "ec", "rsa" (default))
-g key-size Key size in bits, (min 512, max 8192, default 2048) (not for ec)
-q curve-name Elliptic curve name (ec only)
One of nistp256, nistp384, nistp521, curve25519.
If a custom token is present, the following curves are also supported:
sect163k1, nistk163, sect163r1, sect163r2,
nistb163, sect193r1, sect193r2, sect233k1, nistk233,
sect233r1, nistb233, sect239k1, sect283k1, nistk283,
sect283r1, nistb283, sect409k1, nistk409, sect409r1,
nistb409, sect571k1, nistk571, sect571r1, nistb571,
secp160k1, secp160r1, secp160r2, secp192k1, secp192r1,
nistp192, secp224k1, secp224r1, nistp224, secp256k1,
secp256r1, secp384r1, secp521r1,
prime192v1, prime192v2, prime192v3,
prime239v1, prime239v2, prime239v3, c2pnb163v1,
c2pnb163v2, c2pnb163v3, c2pnb176v1, c2tnb191v1,
c2tnb191v2, c2tnb191v3,
c2pnb208w1, c2tnb239v1, c2tnb239v2, c2tnb239v3,
c2pnb272w1, c2pnb304w1,
c2tnb359w1, c2pnb368w1, c2tnb431r1, secp112r1,
secp112r2, secp128r1, secp128r2, sect113r1, sect113r2
sect131r1, sect131r2
Zu Demonstrationszwecken ist die Ausgabe des Befehls stark reduziert. Lediglich die möglichen Schlüsseltypen sowie die Schlüsselgröße (später im Certmonger-Request konfigurierbar) sind in der hier gezeigten Ausgabe enthalten. Durch die Verwendung des Übergabeparameters curve-name
, liefert der entsprechende Befehl die Werte für die keyParameters
zurück.
Selbstverständlich muss bei der Verwendung von anderen Schlüsseltypen auch an die Clientanwendungen gedacht werden, denn nicht jeder Browser z.B. unterstützt jeden verfügbaren Parameter (curve-name
). Anhaltspunkte, welche Schlüsseltypen ein Browser unterstützt, können z.B. über Qualys SSL Labs (im Bereich der named group
) ermittelt werden.
Zusätzlich lassen sich Im Profil selbst auch weitere Einstellungen vornehmen, wie beispielsweise die Laufzeit der ausgestellten Zertifikate.
Nach den Anpassungen dieser, kann das Profil (mit dem neuen Namen caIPAserviceCert_ECDSA
) in den FreeIPA importiert werden, um es anschließend zu nutzen. Zum Importieren wird hierzu der folgende Befehl genutzt:
[root@ipa ~]# ipa certprofile-import caIPAserviceCert_ECDSA --file caIPAserviceCert_ECDSA.cfg
Profile description: Profile for network service with ECDSA
Store issued certificates [True]:
-----------------------------------------
Imported profile "caIPAserviceCert_ECDSA"
-----------------------------------------
Profile ID: caIPAserviceCert_ECDSA
Profile description: Profile for network service with ECDSA
Store issued certificates: True
Damit steht nun ein weiteres Profil im FreeIPA zur Verfügung, welches bei den Anforderungen von Zertifikaten über Certmonger mit übergeben werden kann, um entsprechende Zertifikate und Schlüssel zu erhalten.
Damit Certmonger ein Zertifikat verwaltet, muss ein entsprechender „Request“ erstellt werden. Diesem gibt man die CA und das entsprechende Profil mit, welches zur Erstellung verwendet werden soll. Zusätzlich dazu werden auch die Speicherorte für den privaten Schlüssel und des Zertifikates mit angegeben:
[root@ipa-client-01 ~]# getcert request --ca=IPA --profile=caIPAserviceCert_ECDSA --certfile=/etc/pki/tls/certs/$HOSTNAME.crt --keyfile=/etc/pki/tls/private/$HOSTNAME.key --key-type=ec --subject-name="$HOSTNAME" --principal="HTTP/$HOSTNAME" -g 256
Die erfolgreiche Anfrage können wir in der Ausgabe wie folgt betrachten:
Number of certificates and requests being tracked: 1.
Request ID '20250206122718':
status: MONITORING
stuck: no
key pair storage: type=FILE,location='/etc/pki/tls/private/ipa-client-01.vrc.lan.key'
certificate: type=FILE,location='/etc/pki/tls/certs/ipa-client-01.vrc.lan.crt'
CA: IPA
issuer: CN=Certificate Authority,O=VRC.LAN
subject: CN=ipa-client-01.vrc.lan,O=VRC.LAN
issued: 2025-02-06 13:27:18 CET
expires: 2027-02-07 13:27:18 CET
dns: ipa-client-01.vrc.lan
principal name: HTTP/ipa-client-01.vrc.lan@VRC.LAN
key usage: digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment
eku: id-kp-serverAuth,id-kp-clientAuth
profile: caIPAserviceCert_ECDSA
pre-save command:
post-save command:
track: yes
auto-renew: yes
Anschließend können wir nun auch mit openssl
das erstellte Zertifikat selbst genauer inspizieren:
[root@ipa-client-01 ~]# openssl x509 -in '/etc/pki/tls/certs/ipa-client-01.vrc.lan.crt' -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 11 (0xb)
Signature Algorithm: sha256WithRSAEncryption
Issuer: O=VRC.LAN, CN=Certificate Authority
Validity
Not Before: Feb 6 12:27:18 2025 GMT
Not After : Feb 7 12:27:18 2027 GMT
Subject: O=VRC.LAN, CN=ipa-client-01.vrc.lan
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (256 bit)
pub:
04:91:15:7d:ac:83:9e:91:cc:9b:ea:f9:0a:5b:53:
03:37:a5:c7:33:69:73:88:38:e4:c1:38:57:8b:b4:
d8:c5:5e:18:8d:83:af:80:fc:9d:64:ab:32:69:dd:
05:50:27:57:be:32:3b:e1:25:10:f3:57:74:e5:42:
a7:16:8e:41:1a
ASN1 OID: prime256v1
NIST CURVE: P-256
X509v3 extensions:
X509v3 Authority Key Identifier:
03:4B:F3:FE:CB:F9:EC:26:14:F8:61:56:BB:81:6A:CE:A1:DB:4C:0B
Authority Information Access:
OCSP - URI:http://ipa-ca.vrc.lan/ca/ocsp
X509v3 Key Usage: critical
Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication, TLS Web Client Authentication
X509v3 CRL Distribution Points:
Full Name:
URI:http://ipa-ca.vrc.lan/ipa/crl/MasterCRL.bin CRL Issuer:
DirName:O = ipaca, CN = Certificate Authority
X509v3 Subject Key Identifier:
00:B5:C7:96:FA:D1:18:D8:6A:11:B4:E0:83:ED:CE:A8:8F:A1:19:7B
X509v3 Subject Alternative Name:
othername: UPN::HTTP/ipa-client-01.vrc.lan@VRC.LAN, othername: 1.3.6.1.5.2.2::, DNS:ipa-client-01.vrc.lan
Signature Algorithm: sha256WithRSAEncryption
[...]
Relevant ist, dass wir wirklich ein Zertifikat aus dem EC-Profil erhalten haben.
Parallel zu EC-Schlüsseln können wir selbstverständlich auch mit Certmonger weitere Zertifikate anderen Typs beantragen und überwachen. Unter Angabe eines anderen Profils lässt sich z.B. somit dann auch zusätzlich ein RSA-basiertes Zertifikat anfordern:
[root@ipa-client-01 ~]# getcert request --ca=IPA --profile=caIPAserviceCert --certfile=/etc/pki/tls/certs/${HOSTNAME}_rsa.crt --keyfile=/etc/pki/tls/private/${HOSTNAME}_rsa.key --subject-name="$HOSTNAME" --principal="HTTP/$HOSTNAME"
Die Details im Zertifikat selbst können über den Parameter list
genauer eingesehen werden:
[root@ipa-client-01 ~]# getcert list
Number of certificates and requests being tracked: 2.
Request ID '20250206122718':
status: MONITORING
stuck: no
key pair storage: type=FILE,location='/etc/pki/tls/private/ipa-client-01.vrc.lan.key'
certificate: type=FILE,location='/etc/pki/tls/certs/ipa-client-01.vrc.lan.crt'
CA: IPA
issuer: CN=Certificate Authority,O=VRC.LAN
subject: CN=ipa-client-01.vrc.lan,O=VRC.LAN
issued: 2025-02-06 13:27:18 CET
expires: 2027-02-07 13:27:18 CET
dns: ipa-client-01.vrc.lan
principal name: HTTP/ipa-client-01.vrc.lan@VRC.LAN
key usage: digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment
eku: id-kp-serverAuth,id-kp-clientAuth
profile: caIPAserviceCert_ECDSA
pre-save command:
post-save command:
track: yes
auto-renew: yes
Request ID '20250206123339':
status: MONITORING
stuck: no
key pair storage: type=FILE,location='/etc/pki/tls/private/ipa-client-01.vrc.lan_rsa.key'
certificate: type=FILE,location='/etc/pki/tls/certs/ipa-client-01.vrc.lan_rsa.crt'
CA: IPA
issuer: CN=Certificate Authority,O=VRC.LAN
subject: CN=ipa-client-01.vrc.lan,O=VRC.LAN
issued: 2025-02-06 13:33:40 CET
expires: 2027-02-07 13:33:40 CET
dns: ipa-client-01.vrc.lan
principal name: HTTP/ipa-client-01.vrc.lan@VRC.LAN
key usage: digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment
eku: id-kp-serverAuth,id-kp-clientAuth
profile: caIPAserviceCert
pre-save command:
post-save command:
track: yes
auto-renew: yes
Hier lassen sich auch unter Angabe der Request-ID die Zertifikate neu anfordern oder das Verwalten beenden. Dafür stehen die Parameter resubmit
und stop-tracking
zur Verfügung.
Auch die Signaturalgorithmen können über das Profil angepasst werden. Dazu wird entsprechend der Eintrag
policyset.serverCertSet.8.default.params.signingAlg=SHA512withRSA
angepasst. Im Standard findet sich dort lediglich ein „-„. Der Algorithmus kann aus der Liste der Optionen im Parameter
policyset.serverCertSet.8.constraint.params.signingAlgsAllowed=SHA1withRSA,SHA256withRSA,SHA384withRSA,SHA512withRSA,MD5withRSA,MD2withRSA,SHA1withDSA,SHA1withEC,SHA256withEC,SHA384withEC,SHA512withEC
ausgewählt werden.
Anschließend muss das geänderte Profil natürlich im IPA selbst aktualisiert werden. Das geschieht mit:
[root@ipa ~]# ipa certprofile-mod caIPAserviceCert_ECDSA --file caIPAserviceCert_ECDSA.cfg
Profile ID: caIPAserviceCert_ECDSA
Profile description: Profile for network service with ECDSA
Store issued certificates: True
Eine Prüfung mit openssl
zeigt dann den neuen Algorithmus:
[root@ipa-client-01 ~]# openssl x509 -in '/etc/pki/tls/certs/ipa-client-01.vrc.lan.crt' -noout -text | grep Sig
Signature Algorithm: sha512WithRSAEncryption
Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment
[...]
Certmonger in Kombination mit einem FreeIPA kann problemlos Zertifikate mit EC-Schlüsseln verwalten. Lediglich die Konfiguration des IPAs und die entsprechenden Certmonger-Requests müssen, wie in den vorangegangenen Kapiteln gezeigt, angepasst werden. Damit lässt sich ein FreeIPA auch wunderbar in Infrastrukturen betreiben, die EC-Schlüssel voraussetzen. Im Rahmen eines ordentlichen Betriebes empfiehlt es sich zusätzlich auch, die Resultate der Zertifikatsrequests im zentralen Monitoring kontinuierlich zu überwachen.
Kategorien: | HowTos |
---|