{"id":21697,"date":"2024-05-03T02:57:37","date_gmt":"2024-05-03T00:57:37","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=21697"},"modified":"2024-05-02T21:50:17","modified_gmt":"2024-05-02T19:50:17","slug":"schluesselverwendungszwecke-aus-zertifikat-mit-java-auslesen-und-ausgeben","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=21697","title":{"rendered":"Schl\u00fcsselverwendungszwecke aus X509 Zertifikaten im PEM Format mit Java auslesen und im Klartext ausgeben"},"content":{"rendered":"<p>Jedes Jahr am ersten Donnerstag im Mai ist Welt-Passwort-Tag. Er dient dazu, das Bewusstsein f\u00fcr die Bedeutung starker Passw\u00f6rter zu sch\u00e4rfen. Also gestern. Dann mal heute ein kleines Javaprogramm zu Entspannung das den Verwendungszweck eine Zertifikats ausgibt. Schl\u00fcsselverwendungszwecke sind wichtig f\u00fcr die ordnungsgem\u00e4\u00dfe Verwendung und Interpretation von Zertifikaten und spielen eine entscheidende Rolle bei der Sicherstellung der Sicherheit und Integrit\u00e4t von Kommunikationen und Daten. In ASN.1 (&#8222;Abstract Syntax Notation One&#8220;) ist das beschrieben. ASN.1 ist eine formale Sprache zur Beschreibung von Datenstrukturen und -inhalten, die unabh\u00e4ngig von einer bestimmten Programmiersprache oder Hardwareplattform ist. ASN.1 wird h\u00e4ufig in der Telekommunikations- und Netzwerktechnik sowie in der Kryptografie verwendet.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/05\/crypto.mp4.gif\" alt=\"\" width=\"512\" height=\"288\" class=\"aligncenter size-full wp-image-21698\" \/><\/p>\n<p>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. <!--more--><\/p>\n<pre class=\"lang:java decode:true \" >package de.wenzlaff.zertifikate;\r\n\r\nimport java.io.FileInputStream;\r\nimport java.security.cert.CertificateFactory;\r\nimport java.security.cert.X509Certificate;\r\n\r\n\/**\r\n * Public Zertifikat einlesen und Parameter auf der Konsole ausgeben.\r\n * \r\n * @author Thomas Wenzlaff\r\n *\/\r\npublic class ReadZertifikat {\r\n\r\n\t\/**\r\n\t * digitalSignature (0): Dieser Schl\u00fcsselverwendungszweck gibt an, dass der\r\n\t * \u00f6ffentliche Schl\u00fcssel zur Erzeugung digitaler Signaturen verwendet werden\r\n\t * kann. Dies wird typischerweise f\u00fcr die Authentifizierung und\r\n\t * Integrit\u00e4tspr\u00fcfung von Daten verwendet.\r\n\t * \r\n\t * nonRepudiation (1): Dieser Zweck stellt sicher, dass der Inhaber des privaten\r\n\t * Schl\u00fcssels nicht abstreiten kann, dass er eine bestimmte Aktion ausgef\u00fchrt\r\n\t * hat. Es wird oft in Zusammenhang mit digitalen Signaturen verwendet, um die\r\n\t * Nichtabstreitbarkeit von Transaktionen zu gew\u00e4hrleisten.\r\n\t * \r\n\t * keyEncipherment (2): Dieser Zweck erm\u00f6glicht die Verschl\u00fcsselung von\r\n\t * Schl\u00fcsseln, die zur Verschl\u00fcsselung von Daten verwendet werden. Es wird\r\n\t * h\u00e4ufig bei der SSL\/TLS-Verschl\u00fcsselung von Kommunikationskan\u00e4len eingesetzt.\r\n\t * \r\n\t * dataEncipherment (3): Dieser Zweck erm\u00f6glicht die direkte Verschl\u00fcsselung von\r\n\t * Daten mit dem \u00f6ffentlichen Schl\u00fcssel. Es wird oft bei der symmetrischen\r\n\t * Verschl\u00fcsselung von Daten verwendet.\r\n\t * \r\n\t * keyAgreement (4): Dieser Zweck legt fest, dass der \u00f6ffentliche Schl\u00fcssel zur\r\n\t * Vereinbarung eines geheimen Schl\u00fcssels verwendet werden kann. Es wird\r\n\t * typischerweise in Schl\u00fcsselaustauschalgorithmen wie Diffie-Hellman verwendet.\r\n\t * \r\n\t * keyCertSign (5): Dieser Zweck erm\u00f6glicht es dem Schl\u00fcssel, andere Zertifikate\r\n\t * zu signieren. Es wird normalerweise f\u00fcr Zertifizierungsstellen verwendet, um\r\n\t * Zertifikate zu signieren.\r\n\t * \r\n\t * cRLSign (6): Dieser Zweck erm\u00f6glicht es dem Schl\u00fcssel,\r\n\t * Zertifikatswiderruflisten (CRLs) zu signieren. Eine CRL listet Zertifikate\r\n\t * auf, die nicht mehr g\u00fcltig sind.\r\n\t * \r\n\t * encipherOnly (7): Dieser Zweck gibt an, dass der \u00f6ffentliche Schl\u00fcssel nur\r\n\t * zum Verschl\u00fcsseln von Daten, nicht aber zum Entschl\u00fcsseln, verwendet werden\r\n\t * kann.\r\n\t * \r\n\t * decipherOnly (8): Dieser Zweck gibt an, dass der \u00f6ffentliche Schl\u00fcssel nur\r\n\t * zum Entschl\u00fcsseln von Daten, nicht aber zum Verschl\u00fcsseln, verwendet werden\r\n\t * kann.\r\n\t *\/\r\n\tprivate final static String[] KEYUSAGE = { \"digitalSignature (0)\", \"nonRepudiation (1)\", \"keyEncipherment (2)\", \"dataEncipherment (3)\", \"keyAgreement (4)\", \"keyCertSign (5)\",\r\n\t\t\t\"cRLSign (6)\", \"encipherOnly (7)\", \"decipherOnly (8)\" };\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\ttry {\r\n\t\t\t\/\/ Pfad zur public.pem Datei\r\n\t\t\tString certificateFile = \"src\/main\/resources\/junitec.pem\";\r\n\r\n\t\t\t\/\/ Zertifikat-Factory erstellen\r\n\t\t\tCertificateFactory certFactory = CertificateFactory.getInstance(\"X.509\");\r\n\r\n\t\t\t\/\/ Zertifikat aus der Datei laden\r\n\t\t\tFileInputStream fis = new FileInputStream(certificateFile);\r\n\t\t\tX509Certificate cert = (X509Certificate) certFactory.generateCertificate(fis);\r\n\t\t\tfis.close();\r\n\r\n\t\t\tprintZertifikat(cert);\r\n\t\t} catch (Exception e) {\r\n\t\t\tSystem.out.println(e.getLocalizedMessage());\r\n\t\t}\r\n\t}\r\n\r\n\tprivate static void printZertifikat(X509Certificate cert) {\r\n\t\t\/\/ Zertifikatsdetails ausgeben\r\n\t\tSystem.out.println(\"Subject: \" + cert.getSubjectDN());\r\n\t\tSystem.out.println(\"Issuer: \" + cert.getIssuerDN());\r\n\t\tSystem.out.println(\"Serial Number: \" + cert.getSerialNumber());\r\n\t\tSystem.out.println(\"Not Before: \" + cert.getNotBefore());\r\n\t\tSystem.out.println(\"Not After: \" + cert.getNotAfter());\r\n\t\tSystem.out.println(\"Signature Algorithm: \" + cert.getSigAlgName());\r\n\t\tSystem.out.println(\"Public Key Algorithm: \" + cert.getPublicKey().getAlgorithm());\r\n\t\tSystem.out.println(\"Public Key Format: \" + cert.getPublicKey().getFormat());\r\n\t\tSystem.out.println(\"Public Key: \" + cert.getPublicKey());\r\n\r\n\t\tif (cert.getKeyUsage() != null) {\r\n\t\t\tfor (int i = 0; i &lt; cert.getKeyUsage().length; i++) {\r\n\t\t\t\tSystem.out.println(\"Key Usage: \" + KEYUSAGE[i] + \"=\" + cert.getKeyUsage()[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n<p>Bei der ASN.1 ist die Reihenfolge wichtig und vorgegeben.<\/p>\n<p>Hier die Ausgabe meines Test-Zertifikats:<\/p>\n<pre class=\"lang:default decode:true \" >\r\n\r\nSubject: EMAILADDRESS=twsoft@wenzlaff.de, CN=twsoft, OU=TWSoft, O=TWSoft, L=Langenhagen, ST=Niedersachsen, C=DE\r\nIssuer: EMAILADDRESS=twsoft@wenzlaff.de, CN=twsoft, OU=TWSoft, O=TWSoft, L=Langenhagen, ST=Niedersachsen, C=DE\r\nSerial Number: 45521139012893712\r\nNot Before: Wed Sep 20 17:56:00 CEST 2023\r\nNot After: Tue Sep 20 17:56:00 CEST 2033\r\nSignature Algorithm: SHA256withECDSA\r\nPublic Key Algorithm: EC\r\nPublic Key Format: X.509\r\nPublic Key: Sun EC public key, 256 bits\r\n  public x coord: 7847305581951803941119194674600619464028909064136780803637335908887482071409\r\n  public y coord: 67478637330025718738233376092290736072849257229343002138129277920180053761167\r\n  parameters: secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7)\r\nKey Usage: digitalSignature (0)=false\r\nKey Usage: nonRepudiation (1)=false\r\nKey Usage: keyEncipherment (2)=false\r\nKey Usage: dataEncipherment (3)=false\r\nKey Usage: keyAgreement (4)=false\r\nKey Usage: keyCertSign (5)=true\r\nKey Usage: cRLSign (6)=true\r\nKey Usage: encipherOnly (7)=false\r\nKey Usage: decipherOnly (8)=false\r\n\r\n<\/pre>\n<p>Wer da Zertifikate auch einlesen will, kann diesen public Key in eine Datei (junitec.pem) speichern, oder das sch\u00f6ne Base64-Format bewundern. Das Base64-Format verwendet einen festgelegten Zeichensatz von <strong>64 Zeichen<\/strong>, bestehend aus 26 Gro\u00dfbuchstaben (A-Z), 26 Kleinbuchstaben (a-z), den Zahlen 0-9 und den Sonderzeichen &#8222;+&#8220; und &#8222;\/&#8220;. Das Base64 ist eine Kodierung, <strong>keine<\/strong> Verschl\u00fcsselung:<\/p>\n<pre class=\"lang:default decode:true \" >\r\n-----BEGIN CERTIFICATE-----\r\nMIICsDCCAlWgAwIBAgIIAKG5PBiifBAwCgYIKoZIzj0EAwIwgZExCzAJBgNVBAYT\r\nAkRFMRYwFAYDVQQIEw1OaWVkZXJzYWNoc2VuMRQwEgYDVQQHEwtMYW5nZW5oYWdl\r\nbjEPMA0GA1UEChMGVFdTb2Z0MQ8wDQYDVQQLEwZUV1NvZnQxDzANBgNVBAMTBnR3\r\nc29mdDEhMB8GCSqGSIb3DQEJARYSdHdzb2Z0QHdlbnpsYWZmLmRlMB4XDTIzMDky\r\nMDE1NTYwMFoXDTMzMDkyMDE1NTYwMFowgZExCzAJBgNVBAYTAkRFMRYwFAYDVQQI\r\nEw1OaWVkZXJzYWNoc2VuMRQwEgYDVQQHEwtMYW5nZW5oYWdlbjEPMA0GA1UEChMG\r\nVFdTb2Z0MQ8wDQYDVQQLEwZUV1NvZnQxDzANBgNVBAMTBnR3c29mdDEhMB8GCSqG\r\nSIb3DQEJARYSdHdzb2Z0QHdlbnpsYWZmLmRlMFkwEwYHKoZIzj0CAQYIKoZIzj0D\r\nAQcDQgAEEVlq5U8aNVpVJGqJyxLgII\/qR9+6zlLEJrnPPxr3+XGVL44mPtC4vuae\r\n\/P90zbnFAX0kJNKgMAQzzVc7Hahcj6OBlDCBkTAPBgNVHRMBAf8EBTADAQH\/MB0G\r\nA1UdDgQWBBQTOIh+tM2gVgZNkZXZ2XUrHx\/4uDAfBgNVHSMEGDAWgBQTOIh+tM2g\r\nVgZNkZXZ2XUrHx\/4uDALBgNVHQ8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMB4G\r\nCWCGSAGG+EIBDQQRFg94Y2EgY2VydGlmaWNhdGUwCgYIKoZIzj0EAwIDSQAwRgIh\r\nAITGM2uZCVHEtTdwI0il7Q+vl\/9PWXAMBO4Izpy38nzmAiEAgBpoO7DLEM1+DuGF\r\nZrgr01jmE7oTmpIzr5cxKqB740I=\r\n-----END CERTIFICATE-----\r\n<\/pre>\n<p>Oder hier mal ein altes Lets Encrpyt Zertifikat von mir, welche 3 Zerfifikate, also die ganze Zertifikatskette enth\u00e4lt:<\/p>\n<pre class=\"lang:default decode:true \" >-----BEGIN CERTIFICATE-----\r\nMIIDszCCAzmgAwIBAgITAPrnMZk+Z5yosfm0BuvwOqTtAzAKBggqhkjOPQQDAzBV\r\nMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXKFNUQUdJTkcpIExldCdzIEVuY3J5cHQx\r\nJDAiBgNVBAMTGyhTVEFHSU5HKSBFcnNhdHogRWRhbWFtZSBFMTAeFw0yMzA5MjEy\r\nMDA3NDVaFw0yMzEyMjAyMDA3NDRaMBYxFDASBgNVBAMTC3dlbnpsYWZmLmRlMFkw\r\nEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELV8RMOwAfTuqnMqal0Sn00XZozj6Uc4X\r\nNSemCjUUSI1fJ9smr5TkwwtMLEMgiPoYIdqce4ulrGyP\/bxtO+rtD6OCAiUwggIh\r\nMA4GA1UdDwEB\/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw\r\nDAYDVR0TAQH\/BAIwADAdBgNVHQ4EFgQUsMg\/uVwIOV3gVf5+8mgdlyFUGqgwHwYD\r\nVR0jBBgwFoAU6\/klwoAoZuJtCJIy88LhrcP\/NUUwXQYIKwYBBQUHAQEEUTBPMCUG\r\nCCsGAQUFBzABhhlodHRwOi8vc3RnLWUxLm8ubGVuY3Iub3JnMCYGCCsGAQUFBzAC\r\nhhpodHRwOi8vc3RnLWUxLmkubGVuY3Iub3JnLzAnBgNVHREEIDAeggt3ZW56bGFm\r\nZi5kZYIPd3d3LndlbnpsYWZmLmRlMBMGA1UdIAQMMAowCAYGZ4EMAQIBMIIBAwYK\r\nKwYBBAHWeQIEAgSB9ASB8QDvAHUAsMyD5aX5fWuvfAnMKEkEhyrH6IsTLGNQt8b9\r\nJuFsbHcAAAGKuZH4YwAABAMARjBEAiAlW6rjk4qr\/iKR5p2IOS+69WEQ56VmKUJG\r\nnoZmmeUVAwIgEFqipzuijXtbZSNuPyMwRCW0bgR20Ho8vC3v+k9SntUAdgCqbLDF\r\nyfTEnY2OqQw5F+DXCtkiEL8Ff0FQk4LMNQyYRgAAAYq5kfpoAAAEAwBHMEUCIQD2\r\nnwrMTf2RYuBQ2rsjotfoSpUpxvyueCPRKYN0Y0FbZAIgCbO1WpExuJuaX+C7ozLA\r\nQp9aBIqOFE15QuGk+No5nGgwCgYIKoZIzj0EAwMDaAAwZQIwTHmN1qxxhiSYMCkJ\r\n+mJgCRQsWcTjyKU+9YFagVBeiYc9tz3MWIlPQOjlUy2T+iOiAjEA\/+lL7Dagx6H7\r\njTtHmrQJyH34z+IMlSVP3ZDfuc0PQtKucltvbXuIdyDPT12NoZ50\r\n-----END CERTIFICATE-----\r\n-----BEGIN CERTIFICATE-----\r\nMIIDCzCCApGgAwIBAgIRALRY4992FVxZJKOJ3bpffWIwCgYIKoZIzj0EAwMwaDEL\r\nMAkGA1UEBhMCVVMxMzAxBgNVBAoTKihTVEFHSU5HKSBJbnRlcm5ldCBTZWN1cml0\r\neSBSZXNlYXJjaCBHcm91cDEkMCIGA1UEAxMbKFNUQUdJTkcpIEJvZ3VzIEJyb2Nj\r\nb2xpIFgyMB4XDTIwMDkwNDAwMDAwMFoXDTI1MDkxNTE2MDAwMFowVTELMAkGA1UE\r\nBhMCVVMxIDAeBgNVBAoTFyhTVEFHSU5HKSBMZXQncyBFbmNyeXB0MSQwIgYDVQQD\r\nExsoU1RBR0lORykgRXJzYXR6IEVkYW1hbWUgRTEwdjAQBgcqhkjOPQIBBgUrgQQA\r\nIgNiAAT9v\/PJUtHOTk28nXCXrpP665vI4Z094h8o7R+5E6yNajZa0UubqjpZFoGq\r\nu785\/vGXj6mdfIzc9boITGusZCSWeMj5ySMZGZkS+VSvf8VQqj+3YdEu4PLZEjBA\r\nivRFpEejggEQMIIBDDAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUH\r\nAwIGCCsGAQUFBwMBMBIGA1UdEwEB\/wQIMAYBAf8CAQAwHQYDVR0OBBYEFOv5JcKA\r\nKGbibQiSMvPC4a3D\/zVFMB8GA1UdIwQYMBaAFN7Ro1lkDsGaNqNG7rAQdu+ul5Vm\r\nMDYGCCsGAQUFBwEBBCowKDAmBggrBgEFBQcwAoYaaHR0cDovL3N0Zy14Mi5pLmxl\r\nbmNyLm9yZy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3N0Zy14Mi5jLmxlbmNy\r\nLm9yZy8wIgYDVR0gBBswGTAIBgZngQwBAgEwDQYLKwYBBAGC3xMBAQEwCgYIKoZI\r\nzj0EAwMDaAAwZQIwXcZbdgxcGH9rTErfSTkXfBKKygU0yO7OpbuNeY1id0FZ\/hRY\r\nN5fdLOGuc+aHfCsMAjEA0P\/xwKr6NQ9MN7vrfGAzO397PApdqfM7VdFK18aEu1xm\r\n3HMFKzIR8eEPsMx4smMl\r\n-----END CERTIFICATE-----\r\n-----BEGIN CERTIFICATE-----\r\nMIIEmTCCAoGgAwIBAgIRAJJVIr2Em\/sOzhBD2bEnEJwwDQYJKoZIhvcNAQELBQAw\r\nZjELMAkGA1UEBhMCVVMxMzAxBgNVBAoTKihTVEFHSU5HKSBJbnRlcm5ldCBTZWN1\r\ncml0eSBSZXNlYXJjaCBHcm91cDEiMCAGA1UEAxMZKFNUQUdJTkcpIFByZXRlbmQg\r\nUGVhciBYMTAeFw0yMDA5MDQwMDAwMDBaFw0yNTA5MTUxNjAwMDBaMGgxCzAJBgNV\r\nBAYTAlVTMTMwMQYDVQQKEyooU1RBR0lORykgSW50ZXJuZXQgU2VjdXJpdHkgUmVz\r\nZWFyY2ggR3JvdXAxJDAiBgNVBAMTGyhTVEFHSU5HKSBCb2d1cyBCcm9jY29saSBY\r\nMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABDr0vsNZAswMWDiWwNOgMNBxT9rSwSyj\r\n6BUKkfQDLJJdZwtve+XkKsnEfgAr2HpQPK38BVzmzB2Fydt1ywfnQIzyVTidjnLI\r\n01ajuHXA1rvq0NlSC3ZyUWMqZ1dTDE4VcaOB7TCB6jAOBgNVHQ8BAf8EBAMCAQYw\r\nDwYDVR0TAQH\/BAUwAwEB\/zAdBgNVHQ4EFgQU3tGjWWQOwZo2o0busBB2766XlWYw\r\nHwYDVR0jBBgwFoAUtfNl8v6wCpIf+zx980SgrGMlwxQwNgYIKwYBBQUHAQEEKjAo\r\nMCYGCCsGAQUFBzAChhpodHRwOi8vc3RnLXgxLmkubGVuY3Iub3JnLzArBgNVHR8E\r\nJDAiMCCgHqAchhpodHRwOi8vc3RnLXgxLmMubGVuY3Iub3JnLzAiBgNVHSAEGzAZ\r\nMAgGBmeBDAECATANBgsrBgEEAYLfEwEBATANBgkqhkiG9w0BAQsFAAOCAgEAMkp5\r\netLOxM4+a6EqX2hmAd+yNUSNCA7+MYn\/VrwJnpkWe8zuC+fILYMYRuByWs\/zeFmo\r\n56Jc7td5N9I+QN0rYSeEbgdTAMeaBjZ3P6eJxM1Aa76Abrj5ULfq8XhOE37SYgFb\r\nZS9YPOQ4wuisCXHrrmu4ZdZJmzXIQX562xBeJxf0o4LBqS2C3SmpkPY+f8lTtmFO\r\n\/I6qSSl8T5XyNE385zNXaRd8rMJqNC9fIHDjPeJMIaou0TZYT0uNb9OZ7ZhT7smQ\r\nSaHcGxtK0SVmJvGNagc6RldrHFbemLbwVpeI4NopRHynQqzkVtsfAlK8VD92SYbp\r\nolFsJZWuHVkHgccuI1Hx0+RUp1VGj1PPV+0JmGZeG2ybLloU2rjjMbRmkNjTxub2\r\nU1vzCGpBSaBfYQLjLHDwQk1AqRENlZxDqCkXFro8eqT6TFHdtw27KIT+ov1Qyofi\r\nq3Uj1w7tPpcFMSDfiWNRE0XGYCjELDo19oPqQthIMQ5X+\/3YpCqZceR4vMR6n9ol\r\nLp\/0KmjAzqU+LqD2fmFLttKvZUxW8aECTGIcDHGCPJDklwDW3l7DUQ08Wj5Fh\/KE\r\nf5c9fF3u87WUAJu4Vh9C+ewXZtzL0LD46lYgpn7fv5w9sLS4zQ3CIC3udjJ5Gc\/v\r\n8VhPQaU1Enn7NW+4IHnfSeP6G5rzLEtl0PreC4k=\r\n-----END CERTIFICATE-----\r\n\r\n<\/pre>\n<p>Wir erhalten mit dem leicht angepassten Programm f\u00fcr mehrere Zertifikate:<\/p>\n<pre class=\"lang:java decode:true \" >package de.wenzlaff.zertifikate;\r\n\r\nimport java.io.FileInputStream;\r\nimport java.security.cert.CertificateFactory;\r\nimport java.security.cert.X509Certificate;\r\nimport java.util.Iterator;\r\nimport java.util.List;\r\n\r\n\/**\r\n * Public Zertifikate einlesen im PEM Format (Base64) und Parameter auf der Konsole ausgeben.\r\n * \r\n * @author Thomas Wenzlaff\r\n *\/\r\npublic class ReadZertifikat {\r\n\r\n\t\/**\r\n\t * digitalSignature (0): Dieser Schl\u00fcsselverwendungszweck gibt an, dass der\r\n\t * \u00f6ffentliche Schl\u00fcssel zur Erzeugung digitaler Signaturen verwendet werden\r\n\t * kann. Dies wird typischerweise f\u00fcr die Authentifizierung und\r\n\t * Integrit\u00e4tspr\u00fcfung von Daten verwendet.\r\n\t * \r\n\t * nonRepudiation (1): Dieser Zweck stellt sicher, dass der Inhaber des privaten\r\n\t * Schl\u00fcssels nicht abstreiten kann, dass er eine bestimmte Aktion ausgef\u00fchrt\r\n\t * hat. Es wird oft in Zusammenhang mit digitalen Signaturen verwendet, um die\r\n\t * Nichtabstreitbarkeit von Transaktionen zu gew\u00e4hrleisten.\r\n\t * \r\n\t * keyEncipherment (2): Dieser Zweck erm\u00f6glicht die Verschl\u00fcsselung von\r\n\t * Schl\u00fcsseln, die zur Verschl\u00fcsselung von Daten verwendet werden. Es wird\r\n\t * h\u00e4ufig bei der SSL\/TLS-Verschl\u00fcsselung von Kommunikationskan\u00e4len eingesetzt.\r\n\t * \r\n\t * dataEncipherment (3): Dieser Zweck erm\u00f6glicht die direkte Verschl\u00fcsselung von\r\n\t * Daten mit dem \u00f6ffentlichen Schl\u00fcssel. Es wird oft bei der symmetrischen\r\n\t * Verschl\u00fcsselung von Daten verwendet.\r\n\t * \r\n\t * keyAgreement (4): Dieser Zweck legt fest, dass der \u00f6ffentliche Schl\u00fcssel zur\r\n\t * Vereinbarung eines geheimen Schl\u00fcssels verwendet werden kann. Es wird\r\n\t * typischerweise in Schl\u00fcsselaustauschalgorithmen wie Diffie-Hellman verwendet.\r\n\t * \r\n\t * keyCertSign (5): Dieser Zweck erm\u00f6glicht es dem Schl\u00fcssel, andere Zertifikate\r\n\t * zu signieren. Es wird normalerweise f\u00fcr Zertifizierungsstellen verwendet, um\r\n\t * Zertifikate zu signieren.\r\n\t * \r\n\t * cRLSign (6): Dieser Zweck erm\u00f6glicht es dem Schl\u00fcssel,\r\n\t * Zertifikatswiderruflisten (CRLs) zu signieren. Eine CRL listet Zertifikate\r\n\t * auf, die nicht mehr g\u00fcltig sind.\r\n\t * \r\n\t * encipherOnly (7): Dieser Zweck gibt an, dass der \u00f6ffentliche Schl\u00fcssel nur\r\n\t * zum Verschl\u00fcsseln von Daten, nicht aber zum Entschl\u00fcsseln, verwendet werden\r\n\t * kann.\r\n\t * \r\n\t * decipherOnly (8): Dieser Zweck gibt an, dass der \u00f6ffentliche Schl\u00fcssel nur\r\n\t * zum Entschl\u00fcsseln von Daten, nicht aber zum Verschl\u00fcsseln, verwendet werden\r\n\t * kann.\r\n\t *\/\r\n\tprivate final static String[] KEYUSAGE = { \"digitalSignature (0)\", \"nonRepudiation (1)\", \"keyEncipherment (2)\", \"dataEncipherment (3)\", \"keyAgreement (4)\", \"keyCertSign (5)\",\r\n\t\t\t\"cRLSign (6)\", \"encipherOnly (7)\", \"decipherOnly (8)\" };\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\ttry {\r\n\t\t\t\/\/ Pfad zur public.pem Datei\r\n\t\t\tString certificateFile = \"src\/main\/resources\/fullchain.pem\"; \/\/ junitec.pem\";\r\n\r\n\t\t\t\/\/ Zertifikat-Factory erstellen\r\n\t\t\tCertificateFactory certFactory = CertificateFactory.getInstance(\"X.509\");\r\n\r\n\t\t\t\/\/ Zertifikat aus der Datei laden\r\n\t\t\tFileInputStream fis = new FileInputStream(certificateFile);\r\n\t\t\tList&lt;X509Certificate&gt; cert = (List&lt;X509Certificate&gt;) certFactory.generateCertificates(fis);\r\n\t\t\tfis.close();\r\n\r\n\t\t\tprintZertifikat(cert);\r\n\t\t} catch (Exception e) {\r\n\t\t\tSystem.out.println(e.getLocalizedMessage());\r\n\t\t}\r\n\t}\r\n\r\n\tprivate static void printZertifikat(List&lt;X509Certificate&gt; certs) {\r\n\r\n\t\tfor (Iterator&lt;X509Certificate&gt; iterator = certs.iterator(); iterator.hasNext();) {\r\n\t\t\tX509Certificate cert = iterator.next();\r\n\t\t\t\/\/ Zertifikatsdetails ausgeben\r\n\t\t\tSystem.out.println(\"Subject: \" + cert.getSubjectDN());\r\n\t\t\tSystem.out.println(\"Issuer: \" + cert.getIssuerDN());\r\n\t\t\tSystem.out.println(\"Serial Number: \" + cert.getSerialNumber());\r\n\t\t\tSystem.out.println(\"Not Before: \" + cert.getNotBefore());\r\n\t\t\tSystem.out.println(\"Not After: \" + cert.getNotAfter());\r\n\t\t\tSystem.out.println(\"Signature Algorithm: \" + cert.getSigAlgName());\r\n\t\t\tSystem.out.println(\"Public Key Algorithm: \" + cert.getPublicKey().getAlgorithm());\r\n\t\t\tSystem.out.println(\"Public Key Format: \" + cert.getPublicKey().getFormat());\r\n\t\t\tSystem.out.println(\"Public Key: \" + cert.getPublicKey());\r\n\r\n\t\t\tif (cert.getKeyUsage() != null) {\r\n\t\t\t\tfor (int i = 0; i &lt; cert.getKeyUsage().length; i++) {\r\n\t\t\t\t\tSystem.out.println(\"Key Usage: \" + KEYUSAGE[i] + \"=\" + cert.getKeyUsage()[i]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tSystem.out.println(\"----------------------------------\");\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n<p>Das liefert dann an erster Stelle mein Zertifikat, das abgelaufen ist und das Intermediate und Root Zertifikat von Let&#8217;s Encrypt das noch ein Jahr l\u00e4uft:<\/p>\n<pre class=\"lang:default decode:true \" >Subject: CN=wenzlaff.de\r\nIssuer: CN=(STAGING) Ersatz Edamame E1, O=(STAGING) Let's Encrypt, C=US\r\nSerial Number: 21856742637557729643189321558864557697723651\r\nNot Before: Thu Sep 21 22:07:45 CEST 2023\r\nNot After: Wed Dec 20 21:07:44 CET 2023\r\nSignature Algorithm: SHA384withECDSA\r\nPublic Key Algorithm: EC\r\nPublic Key Format: X.509\r\nPublic Key: Sun EC public key, 256 bits\r\n  public x coord: 20522047306020171526492533334088814385057060102650248702644963710852589176973\r\n  public y coord: 43040140176355486686317641104830429722000531355346320508979443376752912166159\r\n  parameters: secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7)\r\nKey Usage: digitalSignature (0)=true\r\nKey Usage: nonRepudiation (1)=false\r\nKey Usage: keyEncipherment (2)=false\r\nKey Usage: dataEncipherment (3)=false\r\nKey Usage: keyAgreement (4)=false\r\nKey Usage: keyCertSign (5)=false\r\nKey Usage: cRLSign (6)=false\r\nKey Usage: encipherOnly (7)=false\r\nKey Usage: decipherOnly (8)=false\r\n----------------------------------\r\nSubject: CN=(STAGING) Ersatz Edamame E1, O=(STAGING) Let's Encrypt, C=US\r\nIssuer: CN=(STAGING) Bogus Broccoli X2, O=(STAGING) Internet Security Research Group, C=US\r\nSerial Number: 239722583176241246267376851195455831394\r\nNot Before: Fri Sep 04 02:00:00 CEST 2020\r\nNot After: Mon Sep 15 18:00:00 CEST 2025\r\nSignature Algorithm: SHA384withECDSA\r\nPublic Key Algorithm: EC\r\nPublic Key Format: X.509\r\nPublic Key: Sun EC public key, 384 bits\r\n  public x coord: 39055670817196206634112805739087837785379650533911125217666763772083582887223163398065401470258134325240919037181681\r\n  public y coord: 23327400887751732362888420536300512101589420886300136687246982557380055873654921769761219188175216279581770503267399\r\n  parameters: secp384r1 [NIST P-384] (1.3.132.0.34)\r\nKey Usage: digitalSignature (0)=true\r\nKey Usage: nonRepudiation (1)=false\r\nKey Usage: keyEncipherment (2)=false\r\nKey Usage: dataEncipherment (3)=false\r\nKey Usage: keyAgreement (4)=false\r\nKey Usage: keyCertSign (5)=true\r\nKey Usage: cRLSign (6)=true\r\nKey Usage: encipherOnly (7)=false\r\nKey Usage: decipherOnly (8)=false\r\n----------------------------------\r\nSubject: CN=(STAGING) Bogus Broccoli X2, O=(STAGING) Internet Security Research Group, C=US\r\nIssuer: CN=(STAGING) Pretend Pear X1, O=(STAGING) Internet Security Research Group, C=US\r\nSerial Number: 194509337234663007530683018855596888220\r\nNot Before: Fri Sep 04 02:00:00 CEST 2020\r\nNot After: Mon Sep 15 18:00:00 CEST 2025\r\nSignature Algorithm: SHA256withRSA\r\nPublic Key Algorithm: EC\r\nPublic Key Format: X.509\r\nPublic Key: Sun EC public key, 384 bits\r\n  public x coord: 9074164407970444472956800303401573252771916211060558560002359794783721533190850831050356498605145091538185241645116\r\n  public y coord: 26778658773998350277898360255004711869705227153309417047910731555227820426910392802514956741565248792892085665404273\r\n  parameters: secp384r1 [NIST P-384] (1.3.132.0.34)\r\nKey Usage: digitalSignature (0)=false\r\nKey Usage: nonRepudiation (1)=false\r\nKey Usage: keyEncipherment (2)=false\r\nKey Usage: dataEncipherment (3)=false\r\nKey Usage: keyAgreement (4)=false\r\nKey Usage: keyCertSign (5)=true\r\nKey Usage: cRLSign (6)=true\r\nKey Usage: encipherOnly (7)=false\r\nKey Usage: decipherOnly (8)=false\r\n----------------------------------\r\n<\/pre>\n<p>Die verwenden also auch <a href=\"http:\/\/blog.wenzlaff.de\/?p=20850\" rel=\"noopener\" target=\"_blank\">Elliptische-Kurven-Kryptografie<\/a>.<\/p>\n<p>Wenn man noch die checkValidity Methode in die Schleife einf\u00fchrt, bekommt man noch eine g\u00fcltigkeits Check. Bei dem ersten Zertifikat gib es dann:<br \/>\n<strong><br \/>\nCertificat expired: NotAfter: Wed Dec 20 21:07:44 CET 2023<\/strong><\/p>\n<p>weil es abgelaufen ist.<\/p>\n<pre class=\"lang:default decode:true \" >\r\n\r\ntry {\r\n\r\n\tcert.checkValidity();\r\n\r\n} catch (CertificateExpiredException e) {\r\nSystem.out.println(\"Certificat expired: \" + e.getLocalizedMessage());\r\n} catch (CertificateNotYetValidException e) {\r\nSystem.out.println(\"Certificat not valid: \" + e.getLocalizedMessage());\r\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Jedes Jahr am ersten Donnerstag im Mai ist Welt-Passwort-Tag. Er dient dazu, das Bewusstsein f\u00fcr die Bedeutung starker Passw\u00f6rter zu sch\u00e4rfen. Also gestern. Dann mal heute ein kleines Javaprogramm zu Entspannung das den Verwendungszweck eine Zertifikats ausgibt. Schl\u00fcsselverwendungszwecke sind wichtig f\u00fcr die ordnungsgem\u00e4\u00dfe Verwendung und Interpretation von Zertifikaten und spielen eine entscheidende Rolle bei der &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=21697\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eSchl\u00fcsselverwendungszwecke aus X509 Zertifikaten im PEM Format mit Java auslesen und im Klartext ausgeben\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[220,4606,5811,5,2658],"tags":[5980,5977,5976,4714,5803,999,5978,5982,5984,2178,5807,5979,5983,5981,2235],"class_list":["post-21697","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-crypto","category-elliptische-kurven","category-java","category-test-thema","tag-abstract-syntax-notation-one","tag-asn","tag-asn-1","tag-base64","tag-certificate","tag-check","tag-einlesen","tag-ha384withecdsa","tag-impot","tag-java","tag-pem","tag-schluesselverwendungszwecke","tag-valid","tag-x509","tag-zertifikat"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/21697","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=21697"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/21697\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=21697"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=21697"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=21697"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}