Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
How to use Czech qualified digital signature in communication with authorities without proprietary software

About (EN)

Qualified digital signature is considered equal to physical signature by laws of the Czech Republic (and probably other European countries). It is based on standard X509 certificates but majority of manuals and directions from authorities are based on proprietary technologies with bad reputation (java applets, explorer 10, activex etc.). I tried and documented here to use a more sane approach using common open source software. This is work in progress and the rest is in Czech.

Úvod

Kvalifikovaný digitální podpis je českými (a pravděpodobně i jinými evropskými) zákony považován za ekvivalentní podpisu fyzickému. Je založen na standardních X509 certifikátech, ale většina návodů a instrukcí z úřadů je založena na proprietárních technologiích s nevalnou pověstí (java applety, explorer 10, activex prvky atd.). Zkusil jsem a zdokumentoval zde trochu rozumější přístup s použitím běžných opensourcových programů. Informace budu průběžně aktualizovat.

Upozornění

  • Tento návod není určen pro úplné laiky, předpokládá všeobecnou znalost použitých nástrojů a základních principů asymetrické kryptografie. Měl by sloužit pouze jako referenční příručka pro urychlení práce, ne jako zdroj vzdělání o digitálním podpisu. Otrocké kopírování zde uvedených příkazů bez pochopení kontextu může mít fatální bezpečnostní následky. Kromě několika výjimek v dokumentu NEJSOU vyznačeny místa, kde by nesprávné pochopení mohlo vést k nějakým problémům, proto postupujte podle vlastních znalostí.
  • Ačkoli je digitální podpis jako takový standardizován, specifikace některých drobností (např. informace obsažené v certifikátu) se průběžně mění.
  • Prosím o pull requesty (resp. diffy, jelikož je tohle zatím jen Gist)

Vytvoření

Standardní kvalifikovaný certifikát u ICA

openssl req -sha256 -config zadost-ica-vytvoreni.cnf -newkey rsa:2048 -nodes -utf8 -out novak.req -keyout private-key.pem
  • Na ověřovacím místě se ujistit, že bude vygenerován i IK MPSV.
  • V případě použití titulu v commonName je potřeba mít buď titul zapsaný v některém z osobních dokladů nebo v živnosti a nebo přinést s sebou do ověřovacího místa i příslušný diplom.
  • Privátní klíč nebude zaheslovaný! Je rozumné mít pro generování malý offline počítač (např. Raspberry)

Obnova u ICA

...

Zaměstnanecký kvalifikovaný/komerční certifikát u Post Signum

Stejný příkaz, jen jiná konfigurace - zadost-post-vytvoreni-zamestnanec.cnf. Tato konfigurace byla vytvořena podle vzoru žádosti, kterou vygeneruje nativní aplikace od Post Signum. Jelikož ale u zaměstnaneckého certifikátu jsou pro certifikát směrodatná data zadaná firmou předem, tak by asi v žádosti samotné nemusely být informace žádné a je možné, že není potřeba vůbec žádná konfigurace, jak je to vidět v návodu u Post Signum, ale ruku do ohně bych za to nedal.

Použití pro podatelnu Finanční správy

Podpis podání

openssl
engine dynamic -pre SO_PATH:/usr/lib/engines/engine_pkcs11.so -pre ID:pkcs11 -pre NO_VCHECK:1 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:/usr/lib/x86_64-linux-gnu/opensc-pkcs11.so
# hodnoty pro inkey mozno zjistit pomoci pkcs11-tool
smime -sign -engine pkcs11 -in <formular>.xml -out <formular-podepsany>.p7s -inkey <reader-slot>:<private-key-id> -signer <public-cert>.pem -keyform engine -outform DER -nodetach

Proč nefunguje následující command line ekvivalent? http://opensc.1086184.n5.nabble.com/question-on-using-engine-pkcs11-with-openssl-smime-on-command-line-td13304.html

openssl smime -sign -config pkcs11-engine.cnf -engine pkcs11 -in <formular>.xml -out <formular-podepsany>.p7s -inkey 1:2 -outform DER -keyform ENGINE -signer rezac.pem -nodetach

Odeslání do podatelny

curl -X POST -H "content-type:application/octet-stream" --data-binary @<formular-podepsany>.p7s "https://adisepo.mfcr.cz/adistc/epo_podani?test=1&email=<email>"
HOME=/temp
RANDFILE= ${ENV::HOME}/.rnd
engines = engine_section
[ engine_section ]
pkcs11 = pkcs11_section
[ pkcs11_section ]
engine_id = pkcs11
dynamic_path = /usr/lib/engines/engine_pkcs11.so
MODULE_PATH = /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so
init = 0
HOME = .
RANDFILE = $ENV::HOME/.rnd
oid_section = new_oids
[ new_oids ]
oid_mpsv=1.3.6.1.4.1.11801.2.1
[ req ]
default_bits = 2048
default_keyfile = privkey.pem
default_md = sha256
distinguished_name = req_distinguished_name
string_mask = utf8only
req_extensions = v3_req # The extensions to add to a certificate request
[ req_distinguished_name ]
countryName = Country Name (2 znaky kod) (C OID=2.5.4.6)
countryName_default = CZ
commonName = Titul Jmeno Prijmeni (CN OID=2.5.4.3)
commonName_default = Ing. Karel Novák
givenName = Krestni jmeno (GN OID=2.5.4.42)
givenName_default = Karel
surname = Prijmeni (SN OID=2.5.4.4)
surname_default = Novák
# Nasledujici polozky nebyly v inicialni zadosti, ale byly do ni pridany autoritou pri podpisu.
# Jejich hodnoty je mozne vycist z prvotne vydaneho certifikatu.
serialNumber = serialNumber (OID=2.5.4.5)
serialNumber_default = ICA - 12345678
name = Jmeno (Name OID=2.5.4.41)
name_default = Ing. Karel Novák
oid_mpsv = IK MPSV (OID=1.3.6.1.4.1.11801.2.1)
oid_mpsv_default = 1234567890
[ v3_req ]
# Extensions to add to a certificate request
# basicConstraints = CA:FALSE # podle novych pravidel ICA je treba tohle zakomentovat
keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment
subjectAltName = email:karel.novak@novakovi.cz
HOME = .
RANDFILE = $ENV::HOME/.rnd
oid_section = new_oids
[ new_oids ]
oid_mpsv=1.3.6.1.4.1.11801.2.1
[ req ]
default_bits = 2048
default_keyfile = privkey.pem
default_md = sha256
distinguished_name = req_distinguished_name
string_mask = utf8only
req_extensions = v3_req # The extensions to add to a certificate request
[ req_distinguished_name ]
countryName = Country Name (2 znaky kod) (C OID=2.5.4.6)
countryName_default = CZ
commonName = Titul Jmeno Prijmeni (CN OID=2.5.4.3)
commonName_default = Ing. Karel Novák
givenName = Krestni jmeno (GN OID=2.5.4.42)
givenName_default = Karel
surname = Prijmeni (SN OID=2.5.4.4)
surname_default = Novák
# Email zamerne neni v DN, ale v subjectAltName
# Name nesmi byt v inicialni zadosti
# oid_mpsv nesmi byt v inicialni zadost
[ v3_req ]
# Extensions to add to a certificate request
# basicConstraints = CA:FALSE # podle novych pravidel ICA je treba tohle zakomentovat
keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment
subjectAltName = email:karel.novak@novakovi.cz
HOME = .
RANDFILE = $ENV::HOME/.rnd
[ req ]
default_bits = 2048
default_keyfile = privkey.pem
default_md = sha256
distinguished_name = req_distinguished_name
string_mask = utf8only
req_extensions = v3_req # The extensions to add to a certificate request
[ req_distinguished_name ]
countryName = Country Name (2 znaky kod) (C OID=2.5.4.6)
countryName_default = CZ
organizationName = Firma [IČ číslo] (O OID=2.5.4.10)
organizationName_default = IBM a.s. [IČ 12345678]
organizationalUnitName = Číslo zaměstnance (OU OID=2.5.4.11)
organizationalUnitName_default = 69
commonName = Titul Jmeno Prijmeni (CN OID=2.5.4.3)
commonName_default = Karel Novák
[ v3_req ]
subjectAltName = email:karel@novakovi.cz
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment