{"id":17684,"date":"2021-11-05T18:20:39","date_gmt":"2021-11-05T17:20:39","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=17684"},"modified":"2025-03-28T10:33:42","modified_gmt":"2025-03-28T09:33:42","slug":"impfzertifikat-valedierung","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=17684","title":{"rendered":"Impfzertifikat validierung mit dem Raspberry Pi und Python und das zu &#8222;Don&#8217;t Shut Me Down&#8220;"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/11\/Impfen-qr-code-check-scaled.jpg\" alt=\"\" width=\"2560\" height=\"1919\" class=\"aligncenter size-full wp-image-17687\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/11\/Impfen-qr-code-check-scaled.jpg 2560w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/11\/Impfen-qr-code-check-300x225.jpg 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/11\/Impfen-qr-code-check-1024x768.jpg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/11\/Impfen-qr-code-check-768x576.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/11\/Impfen-qr-code-check-1536x1151.jpg 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/11\/Impfen-qr-code-check-2048x1535.jpg 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><br \/>\nSeit dem 10. Juni 2021 werden Impf-Zertifikate (sogenannte Impfbescheinigungen) in Deutschland in Impfzentren ausgegeben. Den QR-Code kann man auch mit einem Raspberry Pi validieren (von lateinisch validus \u201ekr\u00e4ftig, wirksam, fest\u201c) und den Inhalt des QR-Codes im Klartext ausgeben. Am Beispiel eines Raspberry Pi Zero W sind folgende 6 Schritte n\u00f6tig.<\/p>\n<p>1. Wir brauchen das Impfzertifikat, also den QR-Code als PNG oder JPG-Bild in einer Datei z.B. max-mustermann.png.<br \/>\nWie z.B.:<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/11\/mustermann-schmitt.png\" alt=\"qr-code impfzertifikat\" width=\"504\" height=\"498\" class=\"aligncenter size-full wp-image-17693\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/11\/mustermann-schmitt.png 504w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/11\/mustermann-schmitt-300x296.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/11\/mustermann-schmitt-100x100.png 100w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/11\/mustermann-schmitt-120x120.png 120w\" sizes=\"auto, (max-width: 504px) 100vw, 504px\" \/><br \/>\nAber nur den QR-Code, nicht die ganze Seite des Impfzertifikats. &#8230; <!--more--><\/p>\n<p>Wer nicht sein eigenes nehmen will, kann sich <a href=\"https:\/\/github.com\/eu-digital-green-certificates\/dgc-testdata\/tree\/main\/DE\/2DCode\/png\" rel=\"noopener\" target=\"_blank\">hier<\/a> deutsche Testzertifikate runterladen, z.B. das <a href=\"https:\/\/github.com\/eu-digital-green-certificates\/dgc-testdata\/tree\/main\/DE\/2DCode\/png\" rel=\"noopener\" target=\"_blank\">1.png<\/a>.<\/p>\n<pre class=\"lang:default decode:true \" >\r\n\/\/ 2. legen wir uns ein neues Verzeichnis auf dem Pi an und gehen dort rein\r\nmkdir Impfzertifikat-Check\r\ncd Impfzertifikat-Check\/\r\n\r\n\/\/ 3. installieren wir die libzbar0 Abh\u00e4ngikgeit\r\nsudo apt install libzbar0\r\n\r\n\/\/ 4. Clonen wir das Repo und wechseln in das Verzeichnis\r\ngit clone https:\/\/github.com\/IT-Berater\/vacdec.git\r\ncd vacdec\r\n\r\n\/\/ 5. Wir installieren alle Abh\u00e4ngikeiten aus der requirements.txt\r\npip3 install -r requirements.txt\r\n\r\n# 6 Starten wir die Zertifikatsvaledierung des Impfzertifikat aus der max-musterman.png Datei (ein jpg w\u00fcrde auch gehen)\r\n\/\/ .\/vacdec --image-file [image] z.B.:\r\n\r\n.\/vacdec --image-file ..\/max-mustermann.png\r\n\r\n<\/pre>\n<p>Schon erhalten wir die Ausgabe ob das Zertifikat g\u00fcltig ist, und was da so drinne steht, z.B. Auszugsweise mal ein ung\u00fcltiges (anonymisiert \ud83d\ude09 )<\/p>\n<pre class=\"lang:yaml decode:true \" >\r\n\r\n2021-05-05 11:29:45,199 [INFO ]  Protected header key reference missing, using the unprotected one\r\n2021-01-05 11:29:45,201 [INFO ]  COVID certificate signed with X.509 certificate.\r\n2021-01-05 11:29:45,205 [INFO ]  X.509 in DER form has SHA-256 beginning with: 8ede3316d.....c6a3a3\r\n2021-01-05 11:29:45,237 [INFO ]  Skip verify as no key found from database\r\n2021-01-05 11:29:45,242 [INFO ]  Certificate as JSON: {\r\n  \"1\": \"DE\",\r\n  \"4\": 1622725423,\r\n  \"6\": 1619167131,\r\n  \"-260\": {\r\n    \"1\": {\r\n      \"v\": [\r\n        {\r\n          \"ci\": \"01DE\/84503\/11...9007\/DXSGWLW......9A3#S\",\r\n          \"co\": \"DE\",\r\n          \"dn\": 2,\r\n          \"dt\": \"2021-02-02\",\r\n          \"is\": \"Bundesministerium f\u00fcr Gesundheit\",\r\n          \"ma\": \"ORG-100...5\",\r\n          \"mp\": \"EU\/1\/20\/1528\",\r\n          \"sd\": 2,\r\n          \"tg\": \"8405...06\",\r\n          \"vp\": \"11193...007\"\r\n        }\r\n      ],\r\n      \"dob\": \"1964-08-12\",\r\n      \"nam\": {\r\n        \"fn\": \"Schmitt Mustermann\",\r\n        \"gn\": \"Erika D\u00f6rte\",\r\n        \"fnt\": \"SCHMITT&lt;MUSTERMANN\",\r\n        \"gnt\": \"ERIKA&lt;DOERTE\"\r\n      },\r\n      \"ver\": \"1.0.0\"\r\n    }\r\n  }\r\n}<\/pre>\n<p>Was die Felder so bedeuten, kann der <a href=\"https:\/\/health.ec.europa.eu\/system\/files\/2021-06\/covid-certificate_json_specification_en_0.pdf\" rel=\"noopener\" target=\"_blank\">Spec (PDF, engl.)<\/a> entnommen werden. So z.B.<\/p>\n<pre class=\"lang:default decode:true \" >v\/dt ist das Datum der \u00cdmpfung\r\nv\/sd Anzahl der Impfungen<\/pre>\n<p>Mein Impfzertifikat ist nat\u00fcrlich g\u00fcltig:<\/p>\n<pre class=\"lang:default decode:true \" >\r\n2021-11-05 11:12:06,315 [INFO ]  Protected header key reference missing, using the unprotected one\r\n2021-08-05 11:12:06,318 [INFO ]  COVID certificate signed with X.509 certificate.\r\n2021-08-05 11:12:06,321 [INFO ]  X.509 in DER form has SHA-256 beginning with: d.......\r\n2021-08-05 11:12:06,351 [INFO ]  Found the raw key from DB-file certs\/roots\/Digital_Green_Certificate_Signing_Keys.json!\r\n2021-08-05 11:12:06,905 [INFO ]  Signature verified ok\r\n2021-08-05 11:12:06,993 [INFO ]  Certificate as JSON: {\r\n  \"1\": \"DE\",\r\n ...\r\n<\/pre>\n<p>Weitere ausf\u00fchrliche Infos gibt es bei der EU Elektronische Gesundheitsdienste (eHealth) .<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Seit dem 10. Juni 2021 werden Impf-Zertifikate (sogenannte Impfbescheinigungen) in Deutschland in Impfzentren ausgegeben. Den QR-Code kann man auch mit einem Raspberry Pi validieren (von lateinisch validus \u201ekr\u00e4ftig, wirksam, fest\u201c) und den Inhalt des QR-Codes im Klartext ausgeben. Am Beispiel eines Raspberry Pi Zero W sind folgende 6 Schritte n\u00f6tig. 1. Wir brauchen das Impfzertifikat, &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=17684\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eImpfzertifikat validierung mit dem Raspberry Pi und Python und das zu &#8222;Don&#8217;t Shut Me Down&#8220;\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":{"footnotes":""},"categories":[220,4606,2469,79,4023,1023,1319],"tags":[4168,5076,5077,1257,5078,2235],"class_list":["post-17684","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-crypto","category-github-projekte","category-programmierung","category-python","category-raspberry-pi","category-sicherheit-2","tag-impfen","tag-impfung","tag-impfzertifikat","tag-json","tag-validierung","tag-zertifikat"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/17684","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=17684"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/17684\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=17684"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=17684"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=17684"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}