Martin Szotkowski
Vývojové prostředí pro SSL označované jako SSLref je možné získat u firmy Netscape. Diky bývalým exportním omezením USA a Kanady byl omezen export tohoto software. Na australském serveru ftp://ftp.psy.uq.edu.au/pub/Crypto/SSL/ se objevil ‚free‘ ekvivalent tohoto software pod názvem SSLeay (bližší informace na http://www.psy.uq.edu.au/~ftp/Crypto). Navíc SSLeay nemá žádna omezeni ani na délku šifrovacích klíčů. Pokud si vyvinete vlastni software v tomto prostředí nebo použijete software vyvinuty na bázi SSLeay, pak při šifrování např. algoritmem IDEA a 128 bitovým klíčem se asi netřeba ničeho obávat.
Na uvedeném serveru jsou též informace o HTTPS serverech Apache a NCSA a o klientech Mosaic přepracovaných za využití SSLeay, tj. umožňujících celosvětově používat dlouhé klíče. Dále jsou tam informace i o software vyvinutém na SSLeay pro mnohé aplikační protokoly (např. TELNET, FTP,...). Software pro TELNET pres SSL lze nalézt na http://www.psy.uq.edu.au/~ftp/Crypto/telnet.html. Software pro RSH pres SSL lze např. nalézt na http://www.quick.com.au/ftp/pub/sjg/ .
Vývoj SSLeay byl přerušen v roce 1998 odchodem autora SSLeay Erika A. Younga do komerční skupiny (z jeho iniciál je odvozena přípona SSLeay).
Poslední, avšak nevydanou, verzí SSLeay byla verze 0.9.1b. Na tuto verzi navázala nová skupina vývojářů, kteří přejmenovali projekt na OpenSSL. Oficiální stránky projektu jsou na http://www.openssl.org. V době psaní tohoto textu byla vydána verze 0.9.6a, která oproti SSLeay obsahuje spoustu rozšíření, jak v utilitách a podporovaných standardech, tak také nové začlenění využití kryptogafického hardware.
OpenSSL je možné stáhnout, jako programový balík ve formě zdrojových kódů, který je možné přeložit na řadě operačních systémů např. Unix, VMS, MacOS, MS Windows, DOS, apod.
Pro přeložení je nutné mít nainstalovaný Perl a překladač jazyka C. Instalace se provádí ve dvou krocích. Nejprve se pomocí dávky v Perlu vytvoří několik souborů makefile pro daný operační systém; ve druhém kroku se překladačem jazyka C přeloží příslušné zdrojové texty za pomocí vytvořených souborů makefile. Je nutné poznamenat, že na tyto akce jsou připraveny skripty, které vše udělají za vás.
Překlad trvá delší dobu, během které je možné si pročíst důležité soubory umístěné v hlavním adresáři, jako např. často kladené otázky (soubor FAQ), hlavní rysy aplikace (README), změny vůči předchozím verzím (NEWS a CHANGES) a důležité licenční podmínky (LICENSE). Je nutné připomenout, že OpenSSL toolkit je licencován ve stylu licencí Apache, což ve zkratce znamená, že je volně použitelný a šiřitelný pro komerční i nekomerční účely s podmínkou jednoduchých omezení uvedených v licenčních podmínkách.
Popišme si ještě strukturu a význam důležitých adresářů a souborů. Adresář apps obsahuje zdroj pro vytvoření spustitelného programu OpenSSL. V certs jsou uloženy testovací certifikáty. Nejdůležitější je adresář crypto, který obsahuje zdrojové texty celého OpenSSL. Je dále přehledně členěn na jednotlivé skupiny jako např. asn1, x509, apod. Adresář Doc obsahuje zdroj pro unixovou nápovědu man. V Adresáři Util jsou skripty pro Perl.
Jakmile se nám překlad podařil získali jsme (podle druhu překladu) spustitelný program openssl, dále pak knihovny ssleay, ve kterém je API pro SSL a libeay, ve kterém je API pro veškerou kryptografii a řadu prográmků pro testování funkčnosti.
OpenSSL je možné používat dvěma způsoby. Buď jako řádkovou utilitu pro provádění kryptografických operací a nebo jako knihovnu API pro využití ve svých programech.
V případě že chceme začít programovat s použitím API, tak z důvodu nedostatečné dokumentace (jak to u Open projektů často bývá) je výhodné hledat inspiraci přímo ve zdrojových textech spustitelného openssl. Musím říci, že zdrojové texty jsou plné maker, které jsou z počátku nepřehledné, ale postupem času v nich najdete souvislosti. Jestliže vám přesto něco nebude jasné je možné se zeptat v jedné z konferencí, které jsou součástí projektu. Tyto konference jsou velice živé a chválím autory programu, kteří odpovídají promptně na všechny vznesené dotazy. Přihlášení a archiv těchto konferencí najdete na domovské stránce na adrese http://www.openssl.org/support/.
Hlavni aplikaci je program openssl*), který spouští jednotlivé aplikace. Program openssl je možné buď spustit bez parametru, pak získáme prompt ze kterého spouštíme aplikace.
C:\openssl>
openssl
OpenSSL> aplikace
Nebo na příkazovém řádku přímo specifikujeme aplikaci s parametry:
C:\openssl>
openssl aplikace parametry
Programy pracující s OpenSSL většinou využívají proměnné prostředí, ve kterých se dají předdefinovat používané adresáře, konfigurační soubory, adresář s certifikáty apod. Ovšem všechny tyto nastavení se dají také specifikovat jako parametry aplikace.
Pomoci programu openssl lze spustit následující aplikace:
ans1parse |
Rozpitvávání zprav v jazyce ASN.1 |
Ca |
Podepisování žádostí o certifikáty a CRL |
Ciphers |
Seznam podporovaných šifer |
crl |
Práce s CRL |
crl2pkcs7 |
Konverze CRL a certifikátu do zprav tvaru PKCS#7 |
dgst |
Kontrolní součet |
dhparam dh gendh |
Manipulace s Diffle-Hellman parametry |
dsa |
Manipulace s DSA |
dsaparam |
Generování DSA parametrů |
enc |
Šifrování/dešifrování a kódování/dekódování Base64 |
errstr |
Převod chybových kódů na text |
errstr |
Konverze číselných chybových hlášek na řetězce |
gendsa |
Generování klíčů z DSA parametrů |
genrsa |
Generování dvojice soukromý/veřejný klíč pro RSA |
nseq |
Pro práci s Netscape certifikáty |
passwd |
Generování a práce s hesly |
pkcs12 |
Export klíče a certifikátu dle normy PKCS#12 |
pkcs7 |
Práce se zprávami dle normy PKCS#7 |
pkcs8 |
Práce s privátním klíčem dle normy PKCS#8 |
rand |
Generování pseudonáhodných čísel |
Req |
Generování žádosti o certifikáty dle PKCS#10 |
rsa rsautl |
Manipulace s RSA klíči |
s_client s_server s_time sess_id |
Programy pro SSL/TLS spojení |
smime |
Práce s maily dle normy S/MIME |
Speed |
Benchmark testy |
Spkac |
Generování žádosti o certifikát v Netscape formátu (SPK) |
Verify |
Verifikace certifikátu |
version |
Vypíše aktuální verzi OpenSSL |
x509 |
Práce s certifikáty dle X509 včetně jejich podepisování |
Podporované funkce pro kontrolní součet:
md2, md4, md5, mdc2, rmd160, sha, sha1
Podporované šifry:
base64, bf, bf-cbc, bf-cfb, bf-ecb, bf-ofb, cast, cast-cbc, cast5-cbc, cast5-cfb, cast5-ecb, cast5-ofb, des, des-cbc, des-cfb, des-ecb, des-ede, des-ede-cbc, des-ede-cfb, des-ede-ofb, des-ede3, des-ede3-cbc, des-ede3-cfb, des-ede3-ofb, des-ofb, des3, desx, idea, idea-cbc, idea-cfb, idea-ecb, idea-ofb, rc2, rc2-40-cbc, rc2-64-cbc, rc2-cbc, rc2-cfb, rc2-ecb, rc2-ofb, rc4, rc4-40, rc5, rc5-cbc, rc5-cfb, rc5-ecb, rc5-ofb
Pro výpis všech aplikací zadejte:
$ openssl -?
pro výpis nápovědy k jednotlivým aplikacím zadejte:
$ openssl aplikace
-?
Příklad:
V kapitole 2.3.10 jme odchytli hlavičku protokolu HTTP, kterou se autentizuje klient:
Authorization: Basic
RG9zdGFsZWs6aGVzbG8=
Řekli jsme si, že řetězec uvedený zcela vpravo obsahuje Base64 kódované jméno uživatele a jeho heslo, nyní si to můžeme ověřit. Řetězec RG9zdGFsZWs6aGVzbG8= uložíme do souboru vstup.txt.
Budeme chtít provést dekódování Base64souboru vstup.txt. Z předchozí tabulky zjistíme, že dekódování provádí aplikací enc. Proto nejprve zjistíme její syntaxi (zkráceno):
C:\OpenSSL>openssl enc -?
options are
-in <file>
input file
-out <file>
output fileencrypt
-e
encrypt
-d
decrypt
-a/-base64
base64 encode/decode, depending on encryption flag
-k
key is the next argument
-kfile
key is the first line of the file argument
-K/-iv
key/iv in hex is the next argument
-[pP]
print the iv/key (then exit if -P)
-bufsize <n>
buffer size
Pro dekódování použijeme tedy aplikaci enc s parametry:
· –a, tj. kódování/dekódování Base64,
· -d, tj. dešifrování/dekódování,
· -in jméno souboru, tj. zadání jména souboru se vstupními daty.
C:\OpenSSL>openssl
enc -a -d -in vstup.txt
Dostalek:heslo
A nyní již víme, že uživatelem byl uživatel „Dostalek“ s heslem „heslo“.
Podívejme se nyní blíže na některé aplikace. Aby výklad nebyl příliš strohý, zadejme si úkol, vytvořit jednoduchou certifikační autoritu CA, která podepíše testovací certifikát.
Důležité upozornění: Toto v žádném případe není návod na konstrukci certifikační autority, ale pouze vyklad k programu OpenSSL. Setkávám se často s názorem: "Certifikační autorita není nic náročného - stáhl jsem si z Internetu OpenSSL a během odpoledne mi certifikační autorita chodila". Toto tvrzeni lze přirovnat k tvrzeni: "Dopoledne jsem se naučil jezdit na koloběžce, takže odpoledne už budu řídit letadlo". Certifikační autorita je především zodpovědnost za perfektně pracující tým, který na jedné straně přijímá žádosti o certifikaty a na druhé straně vydává certifikáty. Přitom vydat dva certifikáty různým osobám o se stejným předmětem se rovna krachu cele certifikační autority. Reálná certifiklační autorita podepisuje certifikáty na bezpečném hardware, který je nutné do OpenSSL zakomponovat. Takže dále vydaný certifikát nelze zaměňovat s certifikátem opravdové certifikační autority - např. s http://www.ica.cz.
Nejprve si připravíme adresářovou strukturu, kterou později budeme využívat. V nějakém základním adresáři (např. CA) vytvořme adresáře data, data/new_cert, private.
Pro správnou funkci některých aplikací je nutné mít připravený konfigurační soubor. Jeho šablona se nachází v souboru apps/openssl.cnf. Tuto šablonu si trochu upravíme a uložíme přímo do souboru CA/a.con:
#
Konfiguracni souvor OpenSSL pouzivany v nasem pripade ####################################################################
####################################################################
dir
=
./data
# Pracovni adresar se jmenuje data #pro
podpis certifikatu c.1 je treba nasl.radek !!!!!!!! #
x509_extensions =
x509v3_extensions # Pouzita rozsireni X.509 v 3
# Dale
nasleduji pravidla zadavani jednotlivych rozlisitelnych jmen: # Pravidla
pro CA: ####################################################################
[
req_distinguished_name ] stateOrProvinceName
= State or Province Name (full name) localityName
= Mesto organizationName
= Nazev organizace organizationalUnitName
= Nazev organizacni jednotky commonName
= Jmeno emailAddress
= E-mailova adresa [ req_attributes ] [ x509v3_extensions ] |
Nejprve je nutné vygenerovat dvojici veřejný/soukromý klíč a nultý certifikát certifikační autority. Výsledný certifikát bude uložen v souboru private/CA0.txt. Tímto soukromým klíčem pak v následujícím kroku podepíšeme první certifikát certifikační autority. K vytvoření kořenového certifikátu, kterým je právě nultý certifikát, se používá aplikace req s přepínačem –x509. Nyní se vsak vraťme k vytvoření nultého certifikátu:
#
Vygenerovani dvojice klicu a samopodepsaneho nulteho certifikatu: Loading
'screen' into random state - done Generating
a 1024 bit RSA private key ................................++++++ ........++++++ writing
new private key to 'klice.pem' Enter PEM
pass phrase:Pristupove helso k soukr. klici Verifying
password - Enter PEM pass phrase:Pristupove helso k soukr. klici ----- You are
about to be asked to enter information that will be incorporated into your
certificate request. What you
are about to enter is what is called a Distinguished Name or a DN. There are
quite a few fields but you can leave some blank For some
fields there will be a default value, If you
enter '.', the field will be left blank. ----- Oznaceni
zeme (2 pismena) []:CZ State or
Province Name (full name) [Morava]: Mesto
[]:Brno Nazev
organizace []:PVT, a.s. Nazev organizacni jednotky []:VPV Jmeno
[]:CA-Martin E-mailova
adresa []:martin.szotkowski@ica.cz |
Nejprve byl načten konfigurační soubor a.con z něhož budou vzaty údaje o jménech souboru, délce klíče, ale i o jednotlivých rozlišitelných jménech, které budou součásti certifikátu.
Dále byla vygenerována dvojice klíčů. Zadali jsme přístupové heslo (pass phrase) kterým bude zašifrován soukromý klíč uložený v souboru klice.pem (viz konfigurační soubor a.con). Vždy při použiti tohoto soukromého klice bude soukromý klíč zpřístupněn až po zadáni tohoto hesla.
Nakonec jsme dotazováni na rozlišitelná jména do předmětu certifikátu. Opět vše v režii konfiguračního souboru a.con.
Výsledný nultý certifikát (private/CA0.txt):
Certificate: Data: Version: 3 (0x2) Serial Number: 0 (0x0) Signature Algorithm:
md5WithRSAEncryption Issuer: C=CZ, ST=Morava, L=Brno,
O=PVT, a.s., OU=VPV, CN=CA-Martin/Email=martin.szotkowski@ica.cz Validity Not Before: Jun 13 14:26:10 2001
GMT Not After : Jul 13 14:26:10 2001
GMT Subject: C=CZ, ST=Morava, L=Brno,
O=PVT, a.s., OU=VPV, CN=CA-Martin/Email=martin.szotkowski@ica.cz Subject Public Key Info: Public Key Algorithm:
rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:b3:0d:8f:df:42:01:f9:ae:29:cb:50:8c:a4:30:
ad:81:27:41:13:c6:c6:ee:95:7a:e6:2f:8f:fd:ff:
cd:ac:25:e3:50:1a:26:44:fc:cd:43:22:64:28:fa:
8f:95:48:8f:1f:80:cf:b3:b9:41:58:f3:74:8c:ec: ce:61:5d:92:10:ec:eb:0c:64:4a:2d:ee:f0:8f:5f:
2a:3f:63:6a:3a:65:5b:10:ec:79:d7:4b:7a:49:4a:
dd:b4:56:1f:3c:d9:6f:7a:55:19:b0:a0:69:8d:24:
f6:81:04:ba:3c:e4:cf:de:2b:a4:8e:46:5f:bf:25: e1:81:80:33:ee:09:7d:fb:4b Exponent: 65537 (0x10001) Signature Algorithm:
md5WithRSAEncryption
a5:86:7d:61:18:f1:7f:7e:14:c2:24:4f:4f:cf:b4:87:03:37:
1e:5b:03:fd:32:c4:a8:2b:1f:75:b2:a2:a6:f4:af:e4:bf:17: b1:d6:ca:85:de:62:6c:0c:00:69:ab:71:fa:41:d6:e4:94:bc:
ba:8a:f2:a0:2d:e7:ff:76:1e:da:90:da:47:7a:9d:8d:8f:31:
4d:24:11:7b:e7:3a:a2:6e:0f:9d:79:ed:9c:ca:db:be:c4:22:
58:42:88:e2:e4:bf:ab:71:91:6b:11:a7:b5:8d:f5:61:8b:42: 06:4f:ce:3d:00:4b:da:06:3c:39:09:23:5f:0d:d0:28:e4:67: 6c:30 -----BEGIN
CERTIFICATE----- MIICjjCCAfegAwIBAgIBADANBgkqhkiG9w0BAQQFADCBjDELMAkGA1UEBhMCQ1ox DzANBgNVBAgTBk1vcmF2YTENMAsGA1UEBxMEQnJubzESMBAGA1UEChMJUFZULCBh LnMuMQwwCgYDVQQLEwNWUFYxEjAQBgNVBAMTCUNBLU1hcnRpbjEnMCUGCSqGSIb3 DQEJARYYbWFydGluLnN6b3Rrb3dza2lAaWNhLmN6MB4XDTAxMDYxMzE0MjYxMFoX DTAxMDcxMzE0MjYxMFowgYwxCzAJBgNVBAYTAkNaMQ8wDQYDVQQIEwZNb3JhdmEx DTALBgNVBAcTBEJybm8xEjAQBgNVBAoTCVBWVCwgYS5zLjEMMAoGA1UECxMDVlBW MRIwEAYDVQQDEwlDQS1NYXJ0aW4xJzAlBgkqhkiG9w0BCQEWGG1hcnRpbi5zem90 a293c2tpQGljYS5jejCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAsw2P30IB +a4py1CMpDCtgSdBE8bG7pV65i+P/f/NrCXjUBomRPzNQyJkKPqPlUiPH4DPs7lB WPN0jOzOYV2SEOzrDGRKLe7wj18qP2NqOmVbEOx510t6SUrdtFYfPNlvelUZsKBp jST2gQS6POTP3iukjkZfvyXhgYAz7gl9+0sCAwEAATANBgkqhkiG9w0BAQQFAAOB gQClhn1hGPF/fhTCJE9Pz7SHAzceWwP9MsSoKx91sqKm9K/kvxex1sqF3mJsDABp q3H6QdbklLy6ivKgLef/dh7akNpHep2NjzFNJBF75zqibg+dee2cytu+xCJYQoji 5L+rcZFrEae1jfVhi0IGT849AEvaBjw5CSNfDdAo5GdsMA== -----END
CERTIFICATE----- |
Vygenerovaný soukromý klíč (soubor klice.pem - jméno je specifikováno v konfiguračním souboru a.con) jsem přenesl do adresáře private:
mv
klice.pem private |
a vypsal (všimněte si, že se jedna o "opravdový" formát PEM):
-----BEGIN
RSA PRIVATE KEY----- Proc-Type:
4,ENCRYPTED DEK-Info:
DES-EDE3-CBC,42A196E7FDF09711 XSWTLBfsn8OE8itehSSWOly/h394rijneFaC58XaUBmH9inxl56Qg5n0LaV8Kwvl edlVEdttshbwRqeUuvOsmsQNchpMbyCNH64fp+lVmzo90MuE80TrlY86bDZ907gB xWI9jWxmjPx5TMWRwQx/rG//xlJn2RBwpeBqHjw+eNB/TzubuyPq4nraSysF/mlr Ahxg5L2nxFuUSvsjtAkyJNDT0PGOZ1uACcTsaY0uaty1Vtb/ptk+4zgoi8SHXYjr YEtIJ616vnHny96Zo9BeCo7moBnOnEOuaoUbms0zaItewe2k9cSYyM0YwDnuzTfE kfYiqTCPrf0C3vllUFnbWtPTtftY9Wik/I+8PH5STComWmWXOGKD7yiwMceNVi8c Csi/xs6FdwirNSgtLgZH6DmrmMpU4WSLelXIMoPdoyKexENyT0+rhFcef38QCt77 AwphqIHWVl6fXMKJBMBTh65msEkDDW1Y2q2z9Ep5iReH8PQCzymSZ/T2mmuTqIgc fmaT8aQpaAIzdLXvQmqo4z3HRLLqbsZigg46+D2udWH7n9rEqEyjLJiamBHbsHUu CrJr+wIYWQSimtfIDCMt3IOgWwcsQqiJJBbOnTVYVmQ6QgbMXtnV2ijJMmlhoadl hxdZIS5aVa0Rb7IR4+kZe3Jy4phGg/1GllJdPRt369kBUrLScSEa9dddGUT5hCzY vqyjjv7/ZDq3GGeb64m2ubfzLGif91ZB88QY/Rgq45XmkoVL2wXLf734Lzg5qU03 xvFfPktE41PKsqLOmwwqhIuown+MSdCJtXQODyLzFbg= -----END
RSA PRIVATE KEY----- |
Pro správnou činnost naší testovací certifikační autority jsou nezbytné dvě databáze:
#
Vytvorime prazdny soubor pro databazi předmětů ./data/index #
Vytvirune soubor s aktualnim cislem certifikatu |
Nyní již můžeme přistoupit k vytvořeni certifikátu číslo 1, který uložíme do souboru CA1.txt v adresáři private. Jako žádost využijeme kořenový certifikát ze souboru CA0.txt, který se nachází ve stejném adresáři (přepínač –ss_cert).
Poznámka: v konfiguračním souboru a.con je nutné upravit řádek s názvem soboru certifikátu CA (je označen vykřičníky) na CA0.txt.
#
Vytvoreni certifikatu cislo 1: Using
configuration from a.con Loading
'screen' into random state - done Enter PEM
pass phrase: Check that
the request matches the signature Signature
ok The
Subjects Distinguished Name is as follows countryName :PRINTABLE:'CZ' stateOrProvinceName :PRINTABLE:'Morava' localityName :PRINTABLE:'Brno' organizationName :PRINTABLE:'PVT, a.s.' organizationalUnitName:PRINTABLE:'VPV' commonName :PRINTABLE:'CA-Martin' emailAddress
:IA5STRING:'martin.szotkowski@ica.cz' Certificate
is to be certified until Jun 14 07:08:07 2002 GMT (365 days) Sign the
certificate? [y/n]:y 1 out of 1
certificate requests certified, commit? [y/n]y Write out
database with 1 new entries Data Base
Updated |
Opět byl nejprve načten soubor a.con, pote následovala výzva o zadaní přístupového hesla k soukromému klíči. Je vypsán předmět certifikátu a jsme dotázáni, zda-li se má certifikát vytvořit.
Poslední dva řádky vyjadřuji skutečnost, ze databáze předmětů certifikátů byla doplněna o předmět nove vytvořeného certifikátu.
Jak jsme uvedli v kapitole o certifikačních autoritách, tak žádost o vydáni certifikátu musí byt podepsána soukromým klíčem příslušejícím k veřejnému klíči uvedeném v žádosti. Nepodepsané nebo neplatně podepsané žádosti CA neakceptuje a to ani ta naše testovací.
Výsledný certifikát je mezi závorkami: „BEGIN CERTIFICATE“ a
„END CERTIFICATE“. Úvodní text je v podstatě jen pro člověka čitelná poznámka
(certifikát ve formátu PEM je zase lepe čitelný pro počítač):
Using configuration from a.con
Enter PEM pass phrase:
Check that the request matches the
signature (kontrola podpisu na zadosti o certifikat)
Signature ok
Jedinecne jmeno:
countryName
:PRINTABLE:'CZ'
stateOrProvinceName
:PRINTABLE:'Cechy'
localityName
:PRINTABLE:'Ceske Budejovice'
organizationName
:PRINTABLE:'PVT,a.s.'
organizationalUnitName:PRINTABLE:'VCU'
commonName
:PRINTABLE:'CA'
emailAddress
:IA5STRING:'dostalek@pvt.net'
Datum ukonceni platnosti certifikatu
je Mar 14 10:00:50 1999 GMT (365 dni)
Vytvorit certifikat ? [y/n]:y
Write out
database with 1 new entries
Data Base Updated
*) Ve starších verzích označovaných jako SSLeay se na místo programu openssl používal program ssleay, ale vše ostatní bylo obdobné.