Jedes Jahr am ersten Donnerstag im Mai ist Welt-Passwort-Tag. Er dient dazu, das Bewusstsein für die Bedeutung starker Passwörter zu schärfen. Also gestern. Dann mal heute ein kleines Javaprogramm zu Entspannung das den Verwendungszweck eine Zertifikats ausgibt. Schlüsselverwendungszwecke sind wichtig für die ordnungsgemäße Verwendung und Interpretation von Zertifikaten und spielen eine entscheidende Rolle bei der Sicherstellung der Sicherheit und Integrität von Kommunikationen und Daten. In ASN.1 („Abstract Syntax Notation One“) ist das beschrieben. ASN.1 ist eine formale Sprache zur Beschreibung von Datenstrukturen und -inhalten, die unabhängig von einer bestimmten Programmiersprache oder Hardwareplattform ist. ASN.1 wird häufig in der Telekommunikations- und Netzwerktechnik sowie in der Kryptografie verwendet.
Hier ein kleines Programm, das ein JUnit-Testzertifikat (Public, PEM Format) aus dem Dateisystem einliest, und die meisten Parameter des Zertifikats auf der Konsole ausgibt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
package de.wenzlaff.zertifikate; import java.io.FileInputStream; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; /** * Public Zertifikat einlesen und Parameter auf der Konsole ausgeben. * * @author Thomas Wenzlaff */ public class ReadZertifikat { /** * digitalSignature (0): Dieser Schlüsselverwendungszweck gibt an, dass der * öffentliche Schlüssel zur Erzeugung digitaler Signaturen verwendet werden * kann. Dies wird typischerweise für die Authentifizierung und * Integritätsprüfung von Daten verwendet. * * nonRepudiation (1): Dieser Zweck stellt sicher, dass der Inhaber des privaten * Schlüssels nicht abstreiten kann, dass er eine bestimmte Aktion ausgeführt * hat. Es wird oft in Zusammenhang mit digitalen Signaturen verwendet, um die * Nichtabstreitbarkeit von Transaktionen zu gewährleisten. * * keyEncipherment (2): Dieser Zweck ermöglicht die Verschlüsselung von * Schlüsseln, die zur Verschlüsselung von Daten verwendet werden. Es wird * häufig bei der SSL/TLS-Verschlüsselung von Kommunikationskanälen eingesetzt. * * dataEncipherment (3): Dieser Zweck ermöglicht die direkte Verschlüsselung von * Daten mit dem öffentlichen Schlüssel. Es wird oft bei der symmetrischen * Verschlüsselung von Daten verwendet. * * keyAgreement (4): Dieser Zweck legt fest, dass der öffentliche Schlüssel zur * Vereinbarung eines geheimen Schlüssels verwendet werden kann. Es wird * typischerweise in Schlüsselaustauschalgorithmen wie Diffie-Hellman verwendet. * * keyCertSign (5): Dieser Zweck ermöglicht es dem Schlüssel, andere Zertifikate * zu signieren. Es wird normalerweise für Zertifizierungsstellen verwendet, um * Zertifikate zu signieren. * * cRLSign (6): Dieser Zweck ermöglicht es dem Schlüssel, * Zertifikatswiderruflisten (CRLs) zu signieren. Eine CRL listet Zertifikate * auf, die nicht mehr gültig sind. * * encipherOnly (7): Dieser Zweck gibt an, dass der öffentliche Schlüssel nur * zum Verschlüsseln von Daten, nicht aber zum Entschlüsseln, verwendet werden * kann. * * decipherOnly (8): Dieser Zweck gibt an, dass der öffentliche Schlüssel nur * zum Entschlüsseln von Daten, nicht aber zum Verschlüsseln, verwendet werden * kann. */ private final static String[] KEYUSAGE = { "digitalSignature (0)", "nonRepudiation (1)", "keyEncipherment (2)", "dataEncipherment (3)", "keyAgreement (4)", "keyCertSign (5)", "cRLSign (6)", "encipherOnly (7)", "decipherOnly (8)" }; public static void main(String[] args) { try { // Pfad zur public.pem Datei String certificateFile = "src/main/resources/junitec.pem"; // Zertifikat-Factory erstellen CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); // Zertifikat aus der Datei laden FileInputStream fis = new FileInputStream(certificateFile); X509Certificate cert = (X509Certificate) certFactory.generateCertificate(fis); fis.close(); printZertifikat(cert); } catch (Exception e) { System.out.println(e.getLocalizedMessage()); } } private static void printZertifikat(X509Certificate cert) { // Zertifikatsdetails ausgeben System.out.println("Subject: " + cert.getSubjectDN()); System.out.println("Issuer: " + cert.getIssuerDN()); System.out.println("Serial Number: " + cert.getSerialNumber()); System.out.println("Not Before: " + cert.getNotBefore()); System.out.println("Not After: " + cert.getNotAfter()); System.out.println("Signature Algorithm: " + cert.getSigAlgName()); System.out.println("Public Key Algorithm: " + cert.getPublicKey().getAlgorithm()); System.out.println("Public Key Format: " + cert.getPublicKey().getFormat()); System.out.println("Public Key: " + cert.getPublicKey()); if (cert.getKeyUsage() != null) { for (int i = 0; i < cert.getKeyUsage().length; i++) { System.out.println("Key Usage: " + KEYUSAGE[i] + "=" + cert.getKeyUsage()[i]); } } } } |
Bei der ASN.1 ist die Reihenfolge wichtig und vorgegeben.
Hier die Ausgabe meines Test-Zertifikats:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Subject: EMAILADDRESS=twsoft@wenzlaff.de, CN=twsoft, OU=TWSoft, O=TWSoft, L=Langenhagen, ST=Niedersachsen, C=DE Issuer: EMAILADDRESS=twsoft@wenzlaff.de, CN=twsoft, OU=TWSoft, O=TWSoft, L=Langenhagen, ST=Niedersachsen, C=DE Serial Number: 45521139012893712 Not Before: Wed Sep 20 17:56:00 CEST 2023 Not After: Tue Sep 20 17:56:00 CEST 2033 Signature Algorithm: SHA256withECDSA Public Key Algorithm: EC Public Key Format: X.509 Public Key: Sun EC public key, 256 bits public x coord: 7847305581951803941119194674600619464028909064136780803637335908887482071409 public y coord: 67478637330025718738233376092290736072849257229343002138129277920180053761167 parameters: secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7) Key Usage: digitalSignature (0)=false Key Usage: nonRepudiation (1)=false Key Usage: keyEncipherment (2)=false Key Usage: dataEncipherment (3)=false Key Usage: keyAgreement (4)=false Key Usage: keyCertSign (5)=true Key Usage: cRLSign (6)=true Key Usage: encipherOnly (7)=false Key Usage: decipherOnly (8)=false |
Wer da Zertifikate auch einlesen will, kann diesen public Key in eine Datei (junitec.pem) speichern, oder das schöne Base64-Format bewundern. Das Base64-Format verwendet einen festgelegten Zeichensatz von 64 Zeichen, bestehend aus 26 Großbuchstaben (A-Z), 26 Kleinbuchstaben (a-z), den Zahlen 0-9 und den Sonderzeichen „+“ und „/“. Das Base64 ist eine Kodierung, keine Verschlüsselung:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
-----BEGIN CERTIFICATE----- MIICsDCCAlWgAwIBAgIIAKG5PBiifBAwCgYIKoZIzj0EAwIwgZExCzAJBgNVBAYT AkRFMRYwFAYDVQQIEw1OaWVkZXJzYWNoc2VuMRQwEgYDVQQHEwtMYW5nZW5oYWdl bjEPMA0GA1UEChMGVFdTb2Z0MQ8wDQYDVQQLEwZUV1NvZnQxDzANBgNVBAMTBnR3 c29mdDEhMB8GCSqGSIb3DQEJARYSdHdzb2Z0QHdlbnpsYWZmLmRlMB4XDTIzMDky MDE1NTYwMFoXDTMzMDkyMDE1NTYwMFowgZExCzAJBgNVBAYTAkRFMRYwFAYDVQQI Ew1OaWVkZXJzYWNoc2VuMRQwEgYDVQQHEwtMYW5nZW5oYWdlbjEPMA0GA1UEChMG VFdTb2Z0MQ8wDQYDVQQLEwZUV1NvZnQxDzANBgNVBAMTBnR3c29mdDEhMB8GCSqG SIb3DQEJARYSdHdzb2Z0QHdlbnpsYWZmLmRlMFkwEwYHKoZIzj0CAQYIKoZIzj0D AQcDQgAEEVlq5U8aNVpVJGqJyxLgII/qR9+6zlLEJrnPPxr3+XGVL44mPtC4vuae /P90zbnFAX0kJNKgMAQzzVc7Hahcj6OBlDCBkTAPBgNVHRMBAf8EBTADAQH/MB0G A1UdDgQWBBQTOIh+tM2gVgZNkZXZ2XUrHx/4uDAfBgNVHSMEGDAWgBQTOIh+tM2g VgZNkZXZ2XUrHx/4uDALBgNVHQ8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMB4G CWCGSAGG+EIBDQQRFg94Y2EgY2VydGlmaWNhdGUwCgYIKoZIzj0EAwIDSQAwRgIh AITGM2uZCVHEtTdwI0il7Q+vl/9PWXAMBO4Izpy38nzmAiEAgBpoO7DLEM1+DuGF Zrgr01jmE7oTmpIzr5cxKqB740I= -----END CERTIFICATE----- |
Oder hier mal ein altes Lets Encrpyt Zertifikat von mir, welche 3 Zerfifikate, also die ganze Zertifikatskette enthält:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
-----BEGIN CERTIFICATE----- MIIDszCCAzmgAwIBAgITAPrnMZk+Z5yosfm0BuvwOqTtAzAKBggqhkjOPQQDAzBV MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXKFNUQUdJTkcpIExldCdzIEVuY3J5cHQx JDAiBgNVBAMTGyhTVEFHSU5HKSBFcnNhdHogRWRhbWFtZSBFMTAeFw0yMzA5MjEy MDA3NDVaFw0yMzEyMjAyMDA3NDRaMBYxFDASBgNVBAMTC3dlbnpsYWZmLmRlMFkw EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELV8RMOwAfTuqnMqal0Sn00XZozj6Uc4X NSemCjUUSI1fJ9smr5TkwwtMLEMgiPoYIdqce4ulrGyP/bxtO+rtD6OCAiUwggIh MA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw DAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUsMg/uVwIOV3gVf5+8mgdlyFUGqgwHwYD VR0jBBgwFoAU6/klwoAoZuJtCJIy88LhrcP/NUUwXQYIKwYBBQUHAQEEUTBPMCUG CCsGAQUFBzABhhlodHRwOi8vc3RnLWUxLm8ubGVuY3Iub3JnMCYGCCsGAQUFBzAC hhpodHRwOi8vc3RnLWUxLmkubGVuY3Iub3JnLzAnBgNVHREEIDAeggt3ZW56bGFm Zi5kZYIPd3d3LndlbnpsYWZmLmRlMBMGA1UdIAQMMAowCAYGZ4EMAQIBMIIBAwYK KwYBBAHWeQIEAgSB9ASB8QDvAHUAsMyD5aX5fWuvfAnMKEkEhyrH6IsTLGNQt8b9 JuFsbHcAAAGKuZH4YwAABAMARjBEAiAlW6rjk4qr/iKR5p2IOS+69WEQ56VmKUJG noZmmeUVAwIgEFqipzuijXtbZSNuPyMwRCW0bgR20Ho8vC3v+k9SntUAdgCqbLDF yfTEnY2OqQw5F+DXCtkiEL8Ff0FQk4LMNQyYRgAAAYq5kfpoAAAEAwBHMEUCIQD2 nwrMTf2RYuBQ2rsjotfoSpUpxvyueCPRKYN0Y0FbZAIgCbO1WpExuJuaX+C7ozLA Qp9aBIqOFE15QuGk+No5nGgwCgYIKoZIzj0EAwMDaAAwZQIwTHmN1qxxhiSYMCkJ +mJgCRQsWcTjyKU+9YFagVBeiYc9tz3MWIlPQOjlUy2T+iOiAjEA/+lL7Dagx6H7 jTtHmrQJyH34z+IMlSVP3ZDfuc0PQtKucltvbXuIdyDPT12NoZ50 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDCzCCApGgAwIBAgIRALRY4992FVxZJKOJ3bpffWIwCgYIKoZIzj0EAwMwaDEL MAkGA1UEBhMCVVMxMzAxBgNVBAoTKihTVEFHSU5HKSBJbnRlcm5ldCBTZWN1cml0 eSBSZXNlYXJjaCBHcm91cDEkMCIGA1UEAxMbKFNUQUdJTkcpIEJvZ3VzIEJyb2Nj b2xpIFgyMB4XDTIwMDkwNDAwMDAwMFoXDTI1MDkxNTE2MDAwMFowVTELMAkGA1UE BhMCVVMxIDAeBgNVBAoTFyhTVEFHSU5HKSBMZXQncyBFbmNyeXB0MSQwIgYDVQQD ExsoU1RBR0lORykgRXJzYXR6IEVkYW1hbWUgRTEwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAAT9v/PJUtHOTk28nXCXrpP665vI4Z094h8o7R+5E6yNajZa0UubqjpZFoGq u785/vGXj6mdfIzc9boITGusZCSWeMj5ySMZGZkS+VSvf8VQqj+3YdEu4PLZEjBA ivRFpEejggEQMIIBDDAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUH AwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFOv5JcKA KGbibQiSMvPC4a3D/zVFMB8GA1UdIwQYMBaAFN7Ro1lkDsGaNqNG7rAQdu+ul5Vm MDYGCCsGAQUFBwEBBCowKDAmBggrBgEFBQcwAoYaaHR0cDovL3N0Zy14Mi5pLmxl bmNyLm9yZy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3N0Zy14Mi5jLmxlbmNy Lm9yZy8wIgYDVR0gBBswGTAIBgZngQwBAgEwDQYLKwYBBAGC3xMBAQEwCgYIKoZI zj0EAwMDaAAwZQIwXcZbdgxcGH9rTErfSTkXfBKKygU0yO7OpbuNeY1id0FZ/hRY N5fdLOGuc+aHfCsMAjEA0P/xwKr6NQ9MN7vrfGAzO397PApdqfM7VdFK18aEu1xm 3HMFKzIR8eEPsMx4smMl -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEmTCCAoGgAwIBAgIRAJJVIr2Em/sOzhBD2bEnEJwwDQYJKoZIhvcNAQELBQAw ZjELMAkGA1UEBhMCVVMxMzAxBgNVBAoTKihTVEFHSU5HKSBJbnRlcm5ldCBTZWN1 cml0eSBSZXNlYXJjaCBHcm91cDEiMCAGA1UEAxMZKFNUQUdJTkcpIFByZXRlbmQg UGVhciBYMTAeFw0yMDA5MDQwMDAwMDBaFw0yNTA5MTUxNjAwMDBaMGgxCzAJBgNV BAYTAlVTMTMwMQYDVQQKEyooU1RBR0lORykgSW50ZXJuZXQgU2VjdXJpdHkgUmVz ZWFyY2ggR3JvdXAxJDAiBgNVBAMTGyhTVEFHSU5HKSBCb2d1cyBCcm9jY29saSBY MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABDr0vsNZAswMWDiWwNOgMNBxT9rSwSyj 6BUKkfQDLJJdZwtve+XkKsnEfgAr2HpQPK38BVzmzB2Fydt1ywfnQIzyVTidjnLI 01ajuHXA1rvq0NlSC3ZyUWMqZ1dTDE4VcaOB7TCB6jAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU3tGjWWQOwZo2o0busBB2766XlWYw HwYDVR0jBBgwFoAUtfNl8v6wCpIf+zx980SgrGMlwxQwNgYIKwYBBQUHAQEEKjAo MCYGCCsGAQUFBzAChhpodHRwOi8vc3RnLXgxLmkubGVuY3Iub3JnLzArBgNVHR8E JDAiMCCgHqAchhpodHRwOi8vc3RnLXgxLmMubGVuY3Iub3JnLzAiBgNVHSAEGzAZ MAgGBmeBDAECATANBgsrBgEEAYLfEwEBATANBgkqhkiG9w0BAQsFAAOCAgEAMkp5 etLOxM4+a6EqX2hmAd+yNUSNCA7+MYn/VrwJnpkWe8zuC+fILYMYRuByWs/zeFmo 56Jc7td5N9I+QN0rYSeEbgdTAMeaBjZ3P6eJxM1Aa76Abrj5ULfq8XhOE37SYgFb ZS9YPOQ4wuisCXHrrmu4ZdZJmzXIQX562xBeJxf0o4LBqS2C3SmpkPY+f8lTtmFO /I6qSSl8T5XyNE385zNXaRd8rMJqNC9fIHDjPeJMIaou0TZYT0uNb9OZ7ZhT7smQ SaHcGxtK0SVmJvGNagc6RldrHFbemLbwVpeI4NopRHynQqzkVtsfAlK8VD92SYbp olFsJZWuHVkHgccuI1Hx0+RUp1VGj1PPV+0JmGZeG2ybLloU2rjjMbRmkNjTxub2 U1vzCGpBSaBfYQLjLHDwQk1AqRENlZxDqCkXFro8eqT6TFHdtw27KIT+ov1Qyofi q3Uj1w7tPpcFMSDfiWNRE0XGYCjELDo19oPqQthIMQ5X+/3YpCqZceR4vMR6n9ol Lp/0KmjAzqU+LqD2fmFLttKvZUxW8aECTGIcDHGCPJDklwDW3l7DUQ08Wj5Fh/KE f5c9fF3u87WUAJu4Vh9C+ewXZtzL0LD46lYgpn7fv5w9sLS4zQ3CIC3udjJ5Gc/v 8VhPQaU1Enn7NW+4IHnfSeP6G5rzLEtl0PreC4k= -----END CERTIFICATE----- |
Wir erhalten mit dem leicht angepassten Programm für mehrere Zertifikate:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
package de.wenzlaff.zertifikate; import java.io.FileInputStream; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.util.Iterator; import java.util.List; /** * Public Zertifikate einlesen im PEM Format (Base64) und Parameter auf der Konsole ausgeben. * * @author Thomas Wenzlaff */ public class ReadZertifikat { /** * digitalSignature (0): Dieser Schlüsselverwendungszweck gibt an, dass der * öffentliche Schlüssel zur Erzeugung digitaler Signaturen verwendet werden * kann. Dies wird typischerweise für die Authentifizierung und * Integritätsprüfung von Daten verwendet. * * nonRepudiation (1): Dieser Zweck stellt sicher, dass der Inhaber des privaten * Schlüssels nicht abstreiten kann, dass er eine bestimmte Aktion ausgeführt * hat. Es wird oft in Zusammenhang mit digitalen Signaturen verwendet, um die * Nichtabstreitbarkeit von Transaktionen zu gewährleisten. * * keyEncipherment (2): Dieser Zweck ermöglicht die Verschlüsselung von * Schlüsseln, die zur Verschlüsselung von Daten verwendet werden. Es wird * häufig bei der SSL/TLS-Verschlüsselung von Kommunikationskanälen eingesetzt. * * dataEncipherment (3): Dieser Zweck ermöglicht die direkte Verschlüsselung von * Daten mit dem öffentlichen Schlüssel. Es wird oft bei der symmetrischen * Verschlüsselung von Daten verwendet. * * keyAgreement (4): Dieser Zweck legt fest, dass der öffentliche Schlüssel zur * Vereinbarung eines geheimen Schlüssels verwendet werden kann. Es wird * typischerweise in Schlüsselaustauschalgorithmen wie Diffie-Hellman verwendet. * * keyCertSign (5): Dieser Zweck ermöglicht es dem Schlüssel, andere Zertifikate * zu signieren. Es wird normalerweise für Zertifizierungsstellen verwendet, um * Zertifikate zu signieren. * * cRLSign (6): Dieser Zweck ermöglicht es dem Schlüssel, * Zertifikatswiderruflisten (CRLs) zu signieren. Eine CRL listet Zertifikate * auf, die nicht mehr gültig sind. * * encipherOnly (7): Dieser Zweck gibt an, dass der öffentliche Schlüssel nur * zum Verschlüsseln von Daten, nicht aber zum Entschlüsseln, verwendet werden * kann. * * decipherOnly (8): Dieser Zweck gibt an, dass der öffentliche Schlüssel nur * zum Entschlüsseln von Daten, nicht aber zum Verschlüsseln, verwendet werden * kann. */ private final static String[] KEYUSAGE = { "digitalSignature (0)", "nonRepudiation (1)", "keyEncipherment (2)", "dataEncipherment (3)", "keyAgreement (4)", "keyCertSign (5)", "cRLSign (6)", "encipherOnly (7)", "decipherOnly (8)" }; public static void main(String[] args) { try { // Pfad zur public.pem Datei String certificateFile = "src/main/resources/fullchain.pem"; // junitec.pem"; // Zertifikat-Factory erstellen CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); // Zertifikat aus der Datei laden FileInputStream fis = new FileInputStream(certificateFile); List<X509Certificate> cert = (List<X509Certificate>) certFactory.generateCertificates(fis); fis.close(); printZertifikat(cert); } catch (Exception e) { System.out.println(e.getLocalizedMessage()); } } private static void printZertifikat(List<X509Certificate> certs) { for (Iterator<X509Certificate> iterator = certs.iterator(); iterator.hasNext();) { X509Certificate cert = iterator.next(); // Zertifikatsdetails ausgeben System.out.println("Subject: " + cert.getSubjectDN()); System.out.println("Issuer: " + cert.getIssuerDN()); System.out.println("Serial Number: " + cert.getSerialNumber()); System.out.println("Not Before: " + cert.getNotBefore()); System.out.println("Not After: " + cert.getNotAfter()); System.out.println("Signature Algorithm: " + cert.getSigAlgName()); System.out.println("Public Key Algorithm: " + cert.getPublicKey().getAlgorithm()); System.out.println("Public Key Format: " + cert.getPublicKey().getFormat()); System.out.println("Public Key: " + cert.getPublicKey()); if (cert.getKeyUsage() != null) { for (int i = 0; i < cert.getKeyUsage().length; i++) { System.out.println("Key Usage: " + KEYUSAGE[i] + "=" + cert.getKeyUsage()[i]); } } System.out.println("----------------------------------"); } } } |
Das liefert dann an erster Stelle mein Zertifikat, das abgelaufen ist und das Intermediate und Root Zertifikat von Let’s Encrypt das noch ein Jahr läuft:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
Subject: CN=wenzlaff.de Issuer: CN=(STAGING) Ersatz Edamame E1, O=(STAGING) Let's Encrypt, C=US Serial Number: 21856742637557729643189321558864557697723651 Not Before: Thu Sep 21 22:07:45 CEST 2023 Not After: Wed Dec 20 21:07:44 CET 2023 Signature Algorithm: SHA384withECDSA Public Key Algorithm: EC Public Key Format: X.509 Public Key: Sun EC public key, 256 bits public x coord: 20522047306020171526492533334088814385057060102650248702644963710852589176973 public y coord: 43040140176355486686317641104830429722000531355346320508979443376752912166159 parameters: secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7) Key Usage: digitalSignature (0)=true Key Usage: nonRepudiation (1)=false Key Usage: keyEncipherment (2)=false Key Usage: dataEncipherment (3)=false Key Usage: keyAgreement (4)=false Key Usage: keyCertSign (5)=false Key Usage: cRLSign (6)=false Key Usage: encipherOnly (7)=false Key Usage: decipherOnly (8)=false ---------------------------------- Subject: CN=(STAGING) Ersatz Edamame E1, O=(STAGING) Let's Encrypt, C=US Issuer: CN=(STAGING) Bogus Broccoli X2, O=(STAGING) Internet Security Research Group, C=US Serial Number: 239722583176241246267376851195455831394 Not Before: Fri Sep 04 02:00:00 CEST 2020 Not After: Mon Sep 15 18:00:00 CEST 2025 Signature Algorithm: SHA384withECDSA Public Key Algorithm: EC Public Key Format: X.509 Public Key: Sun EC public key, 384 bits public x coord: 39055670817196206634112805739087837785379650533911125217666763772083582887223163398065401470258134325240919037181681 public y coord: 23327400887751732362888420536300512101589420886300136687246982557380055873654921769761219188175216279581770503267399 parameters: secp384r1 [NIST P-384] (1.3.132.0.34) Key Usage: digitalSignature (0)=true Key Usage: nonRepudiation (1)=false Key Usage: keyEncipherment (2)=false Key Usage: dataEncipherment (3)=false Key Usage: keyAgreement (4)=false Key Usage: keyCertSign (5)=true Key Usage: cRLSign (6)=true Key Usage: encipherOnly (7)=false Key Usage: decipherOnly (8)=false ---------------------------------- Subject: CN=(STAGING) Bogus Broccoli X2, O=(STAGING) Internet Security Research Group, C=US Issuer: CN=(STAGING) Pretend Pear X1, O=(STAGING) Internet Security Research Group, C=US Serial Number: 194509337234663007530683018855596888220 Not Before: Fri Sep 04 02:00:00 CEST 2020 Not After: Mon Sep 15 18:00:00 CEST 2025 Signature Algorithm: SHA256withRSA Public Key Algorithm: EC Public Key Format: X.509 Public Key: Sun EC public key, 384 bits public x coord: 9074164407970444472956800303401573252771916211060558560002359794783721533190850831050356498605145091538185241645116 public y coord: 26778658773998350277898360255004711869705227153309417047910731555227820426910392802514956741565248792892085665404273 parameters: secp384r1 [NIST P-384] (1.3.132.0.34) Key Usage: digitalSignature (0)=false Key Usage: nonRepudiation (1)=false Key Usage: keyEncipherment (2)=false Key Usage: dataEncipherment (3)=false Key Usage: keyAgreement (4)=false Key Usage: keyCertSign (5)=true Key Usage: cRLSign (6)=true Key Usage: encipherOnly (7)=false Key Usage: decipherOnly (8)=false ---------------------------------- |
Die verwenden also auch Elliptische-Kurven-Kryptografie.
Wenn man noch die checkValidity Methode in die Schleife einführt, bekommt man noch eine gültigkeits Check. Bei dem ersten Zertifikat gib es dann:
Certificat expired: NotAfter: Wed Dec 20 21:07:44 CET 2023
weil es abgelaufen ist.
1 2 3 4 5 6 7 8 9 |
try { cert.checkValidity(); } catch (CertificateExpiredException e) { System.out.println("Certificat expired: " + e.getLocalizedMessage()); } catch (CertificateNotYetValidException e) { System.out.println("Certificat not valid: " + e.getLocalizedMessage()); } |