OpenPGP vagy S/MIME?

Szóval minden úgy kezdődött, hogy kaptam egy feladatot:

http://hup.hu/node/137107

Háromféle digitális aláírás került a látókörömbe: OpenPGP, S/MIME és DKIM.

Ezek közül csak az első kettő minősül end-to-end digitális aláírásnak, vagyis csak erre a kettőre igaz, hogy az aláírást a levél feladójának számítógépe, az aláírás ellenőrzését pedig a címzett számítógépe végzi. A DKIM esetében a titkos kulcs a feladó tartomány kimenő levélszerverein van (azokon, amelyekre a tartomány SPF rekordjai mutatnak), itt történik az aláírás is. Az aláírás ellenőrzését a címzett tartomány leveleit fogadó szerverek (amelyekre a tartomány MX rekordjai mutatnak) végzik. Éppen ezért a DKIM nem end-to-end aláírás, már csak azért sem, mert nem felhasználónként, hanem tartományonként van egy-egy külön titkos-nyilvános kulcspár. A titkos kulcsot természetesen nem adja ki az SMTP szerver, a nyilvános kulcsot viszont egy TXT típusú DNS bejegyzésben teszi közzé a tartomány adminisztrátora. A levelet befogadó SMTP szerver egy Authentication-Results nevű mail headert hoz létre, amiben feltünteti, hogy milyen eredménnyel járt a levél DKIM aláírásának (és egyéb authentikációs jellemzők) ellenőrzése. A küldő szerver a DKIM aláírásí művelet paramétereit, és magát az aláírást a DKIM-Signature nevű mail headerben helyezi el. A DKIM nem csak abban különbözik a másik két digitális aláírási szabványtól, hogy nem biztosít end-to-end védelmet, hanem abban is, hogy nem a levél törzsében, hanem a fejlécében található, és nem csak a levél törzsét, hanem néhány fejlécmezőt (pl. from, to, subject, date, message-id, user-agent, stb.) is aláír. Ez alapján azt is gondolhatnánk, hogy nagyobb biztonságot, ad, de egyrészt nem tudja lekezelni a levél törzsének semmilyen változását, ami a levél befogadása után történik, másrészt nem találtam olyan levelezőklienst, amely képes lenne a DKIM aláírás ellenőrzésére. Csak a levél forrásának manuális ellenőrzésére (pl. az Authentication-Results mező átnézésére) hagyatkozhatunk. Ha azonban ezt kiegészítjük azzal, hogy a Google levelezőrendszere semmilyen módon nem teszi lehetővé, hogy a levél feladója meghamisítsa a saját email címét, akkor már egy viszonylag elfogadható biztonsági megoldást kapunk.

Az OpenPGP és S/MIME aláírási rendszerek tesztelését három levelezőkliensen végeztem: A Gmail webes felületén, az Outlook-on és a Kmail-en. A Kmail mindent minden formában támogat, toronymagasan kiemelkedik a mezőnyből. Az Outlook csak az S/MIME rendszerrel kompatibilis, abból is csak a Kmail által támogatott kétféle aláírási módszer egyikét támogatja aktívan, de a másikat is értelmezni tudja, viszont a MIME szerkezet menet közbeni módosulásaival (pl. levlista lábléc hozzáadása) nem sok értelmes dolgot tud kezdeni. A Gmail webes felülete egyik rendszert sem ismeri, a legjobb esetben is ismeretlen típusú csatolt fájlként jeleníti meg a digitális aláírások minden fajtáját, mint az Outook az OpenPGP-t. Mivel az Outlook csak az S/MIME-t támogatja, és elvileg Windows alapú vállalati rendszert akarunk építeni, valamint legjobb tudomásom szerint a magyar jog is csak bizonyos jogi és technikai feltételeknek megfelelő X.509 tanúsítványokra épülő S/MIME aláírásokat fogad el bizonyító erejűnek, ezért nyilvánvalóan az S/MIME felé kell orientálódnunk.

Ennek ellenére azért az OpenPGP-t is górcső alá vettem. A két digitális aláírási rendszer között sok hasonlóság van. Nyilván mindkettő hash kivonatot készít a levélről, majd ezt a felhasználó titkos kulcsával titkosítja. A nyilvános kulcsok tanúsítványokból nyerhetők ki. Az S/MIME X.509 tanúsítványokat használ, az ott megszokott PKI infrastruktúrára alapozva. Az OpenPGP saját tanúsítványszabvánnyal rendelkezik, a tanúsítványai egy teljesen nyilvános világszintű felhőben tárolódnak, és közösségi alapon bárki aláírhatja őket. Erre épül az ún. web of trust megbízhatóságvizsgálat. Mindkét szabvány csak a levél törzsét írja alá, bár legalább az egyik esetében (S/MIME) folynak már fejlesztések olyan irányban, hogy bizonyos fejlécmezőket átmásoljanak a levél törzsébe és ott aláírják őket, de a gyakorlatban nem láttam ennek semmi eredményét. Szövegszerkesztővel átírtam néhány OpenPGP és S/MIME módon aláírt levél from, to és subject fejlécmezőjét, de mind a Kmail mind az Outlook ezután is szemrebbenés nélkül érvényesnek találta az aláírásokat. A levéltörzs módosítására már természetesen mindketten felkapták a fejüket.

A kmail kétféle OpenPGP aláírást támogat:

1.: A régebbi, az ún. inline OpenPGP használata már nem javasolt: Nem a MIME szabványon alapul, hanem saját üzenetformátummal dolgozik. A legtöbb általam kipróbált levelezőkliens még csak megjeleníteni sem tudja rendesen, nem hogy ellenőrizni a hitelességét.

2.: Az OpenPGP/MIME módszer esetében a levél törzse szabványos MIME, az aláírás csatolt fájlként van jelen.

S/MIME aláírásból szintén kétfélét támogat a kmail:

1.: Az OpenPGP/MIME-hoz teljesen hasonló az S/MIME aláírás, de persze a saját kriptográfiájával.

2.: Az S/MIME-nak van egy ún. opaque (nem transzparens?) aláírási módszere is: Ebben az esetben az egész levétörzs egy kódolt csatolmányba van beágyazva.

Az általam vizsgált három levelezőprogram közül csak a Kmail képes mind a négy típusú aláírás létrehozására, mint ahogy az inline OpenPGP-t is csak ez jeleníti meg helyesen, de nem ellenőrzi rajta az aláírást, sőt ki sem írja, hogy alá van-e írva. A másik három aláírástípust tökéletesen kezeli mind küldőként, mind fogadóként, és rendkívül esztétikusan, informatívan jelzi, hogy a levél megbízható-e, ha igen, miért, stb.

Az Outlook csak az S/MIME szabványt ismeri, és ebből opaque típusút is tud értelmezni, de írni nem. Az OpenPGP-t ismeretlen típusú csatolásként vagy - az inline OpenPGP esetében - zagyva kódként jeleníti meg.

A Gmail webes felülete mindkét fajta aláírással ellátott levelet ismeretlen típusú csatolással ellátott levélként vagy zagyva kódként jeleníti meg. Az aláírási infrastruktúra webmail-be ágyazása nem számít biztonságosnak, mert ehhez a szolgáltató rendszerébe kellene feltölteni a titkos kulcsot, és a fentiek értelmében egyébként sem számítana end-to-end kriptográfiának. Vannak olyan böngésző-kiegészítők (browser pluginok), amelyek bizonyos általuk ismert/támogatott webmail rendszerek (pl. gmail, google apps for business, horde, stb.) JavaScript kódját módosítva/kibővítve lehetővé teszik a weben keresztül end-to-end digitális aláírást, de ezek használatát nem tekintettem komoly alternatívának az alábbi okok miatt:

-Nem megbízhatónak tűnő fejlesztők (Mi van, ha a plugin ellopja a titkos kulcsomat, és elküldi a fejlesztőjének, aki ebből hasznot húz?)
-Félkész állapotra utaló verziószámok.
-A böngészők és webmail rendszerek fejlődést nem mindig naprakészen követő kód.
-Rossz felhasználói élmény.

Miután mindezeket megvizsgáltam, eldöntöttem, hogy az S/MIME szabvány a befutó, minden valószínűség szerint Outlook használatával.

Tettem egyébként még egy érdekes kísérletet: Mi történik, ha a digitálisan aláírt levelet átküldöm egy levlistán (konkrétan mailman-en), ami módosítja a levél törzsét. Azt találtam, hogy a mailman nem nyúl bele a MIME törzs egyetlen összetevőjébe sem, hanem egy új MIME szakaszt fűz a levélhez, ebben van a levlista láblécének szövege. Ennek az az eredménye, hogy a levél lábléc feletti része továbbra is érvényesen alá van írva digitálisan. A kmail továbbra is esztétikus és informatív tájékoztatást nyújt arról, hogy a levél mely része megbízható, és melyik nem, az Outlook viszont megbicsaklik ezen a teszten.

SZERK 2014.12.11: Azt, hogy bizonyos S/MIME kulcspárok csak aláírásra vagy titkosításra használhatóak, a nyilvános kulcsot hordozó X.509 tanúsítvány keyUsage (esetleg extKeyUsage, basicConstraints) attribútuma határozza meg. Azaz a kulcspár technikailag bármilyen kriptográfiai feladatra alkalmas, de a szóban forgó attribútumok alapján a kriptográfiai szoftvernek meg kell tagadnia bizonyos feladatok végrehajtását. Az S/MIME esetében ezek az attribútumok nyújtanak támogatást ahhoz, hogy a felhasználónak külön kulcsa legyen az általa küldött levelek aláírására és a neki írt titkosított levelek dekódolására. A két kulcspárra pedig azért van szükség, mert az aláíró titkos kulcshoz SOHA SENKI más nem férhet hozzá, csak a kulcs tulajdonosa, a dekódoló titkos kulcsról viszont a felhasználó munkáltatója vagy más felettes szerve (pl. az állam) biztonsági másolatot készíthet egy jogilag és technikailag jól védett tárolóba (ún. key escrow), hogy ha a felhasználó esetleg meghalna vagy kilépne, akkor is olvashatóak maradjanak a neki írt titkosított levelek az arra illetékesek számára. Itt ugye az a probléma, hogy aki jogosult kinyerni a "zálogból" a dekódoló titkos kulcsot, az onnantól meg tudja hamisítani az adott felhasználó digitális aláírását, ez pedig ellentmond az ún. Non-repudiation követelménynek. Tehát: megfelelő bizalmassági szint eléréséhez külön kulcspár kell a levelek aláírásához, illetve a titkosított levelek fogadásához.

Hozzászólások

Szép munka, köszönjük.
Meg tudnád írni esetleg, hogy milyen verziójú szoftverekkel tesztelted?

Fuszenecker_Róbert

S/MIME esetén két dolog van:
Levél aláírása
Levél titkosítása

Viszont a titkosításhoz titkosító tanúsítvány kell, ezt nem feltétlenül tudja minden alapból. A tanúsítvány tulajdonságai között meg tudod nézni, hogy mire jó.

Viszont szerintem nem jó amit írsz.

Egy tanúsítvány lehet a titkosító és aláíró tanúsítvány is egyben (pl. a startSSL-es ilyen). Az X509 tanúsítvány világ is privát és publikus kulcsokból épül, az, hogy most csak a levél van aláírva, vagy az egész levél titkosítva mindegy, mert mindegyik a privát kulccsal történik, majd a másik fél a publikus kulcs alapján dekódolja a levelet és /vagy ellenőrzi annak sértetlenségét. (a publikus kulcs állapotát meg pl. a visszavonási listák alapján)

A tanúsítvány állapotát CRL-en kívül OCSP protokollal is lehet ellenőrizni. Mindkét típusú ellenőrzéshez szükség lehet valamiféle URL-re, ami adott esetben szintén kiolvasható a tanúsítvány valamely attribútumából.

Az igaz, hogy nem kötelező külön aláíró és titkosító tanúsítványt (és egyben kulcspárt) fenntartani, csak ha ezt a biztonsági házirend szigorúsága megköveteli. Elvileg "best practice" a két külön tanúsítvány fenntartása, de a gyakorlatban sokan ugyanazt használják mindkét célra.

Az egy elterjedt tévhit, hogy egy általad írt levél titkosításához (az aláíráshoz hasonlóan) a saját titkos kulcsodat használod, és a címzett a nyilvános kulcsoddal bontja fel. Bár kriptográfiailag ez kivitelezhető, de ha így lenne, akkor bárki visszafejthetné a titkosított leveleidet, hiszen a nyilvános kulcsodhoz bárki hozzáférhet.

Ha titkosított levelet küldesz, akkor a CÍMZETT nyilvános kulcsával titkosítod be, ő pedig a saját titkos kulcsával kulcsával fejti vissza. Valójában nem is kellene saját tanúsítvánnyal rendelkezned ahhoz, hogy valakinek titkosított levelet küldhess, az ő tanúsítványát (benne a nyilvános kulccsal) viszont be kell szerezned előtte.

> Az egy elterjedt tévhit, hogy egy általad írt levél titkosításához (az aláíráshoz hasonlóan) a saját titkos kulcsodat használod

Úr isten, ez komoly, hogy ezt sokan így gondolják???? Ha erről beszélek, én az elsők között mesélem el, hogy ez hogy működik, ezért naívan úgy képzeltem, hogy azok az emberek akik egyáltalán eljutnak odáig, hogy digitális aláírás vagy levéltitkosítás kétkulcsos módon, azok képesek felfogni, hogy ez csak úgy működhet, ahogy az utolsó bekezdésben írod:

Túloldal publikus kulcsával titkosítok, saját titkos kulcsommal hitelesítek. Ha mind a kettőt akarom, akkor javasolt ezt a sorrend.

Mondjuk pl. a parancssori GPG nem is hagyja, hogy a titkosítást elronts, hisz amikor titkosítok, megkérdezi a címzettet, pont azért, hogy a publikus kulcsát tudja használni - kivéve, ha szimetrikus kódolást használok (de az ugye egykulcsos). És aki használta valaha ezt az eszközt, feltűnhetett, hogy a saját kulcsához szükséges jelmondatot titkosítás esetén nem is kéri be, kizárólag aláírásnál, illetve persze dekódolásnál. (Persze tudom, a legtöbb ember életében nem használta - és nem is akarja - a parancssori eszközöket; nekem pontosan a különböző webmail miatt kell a mai napig elő-előkapnom a parancssori gpg-t; igaz grafikus felülethez van kgpg, meg gpg-crypter, de egyelőre azok helyett valami még jobbat keresek. Az előbbi a fél KDE-t magával rántja, az utóbbinak sajnos vannak hiányosságai, bár GTK-s puritánságában már közelíti az ideálist.)

A kiinduló felvetéshez: amúgy leginkább az kellene, hogy végre a webmail gyártók is felfogják, hogy a digitálisan aláírt illetve titkosított levelezés szükséges valami, amit rendesen kellene támogatni. Nyilván vállalati szinten az S/MIME kezelése lenne az elvárható, de az OpenPGP támogatás is igen ildomos lenne. Persze jól megcsinálni úgy, hogy mégse kompromittálódjon a privát kulcsom (se akarva, se akaratlanul).

Semmilyen értelemben nem vagyok fejlesztő, de néhány olyan dolgot tapasztaltam, miközben digitális aláírás témában kutakodtam, ami alapján azt feltételezem, hogy a webböngészők biztosítanak valami olyan API-t, amit a weboldalak JavaScript kódja olyan formában tud használni, mint a frontendek a GPG-t vagy a GPG egy smartcardot, azaz jól körülhatárolt kriptográfiai szolgáltatásokat nyújt anélkül, hogy a titkos kulcsokat kiadná. Ha ez tényleg így van, és minden böngésző azonos - valamilyen szabvány által meghatározott - API-t biztosít a weboldalak számára, akkor egyszerűen erre a JavaScript API-ra kellene építeni a webmailek kriptográfiai megoldásait, és akkor biztosított lenne az end-to-end biztonság, és nem kellene feltölteni a titkos kulcsokat a webmail szerverre. Persze amúgy is ilyen irányba haladnak a fejlesztések, csak azt nem értem, miért kell ehhez böngésző plugin?

A tanúsítvány állapotát CRL-en kívül OCSP protokollal is lehet ellenőrizni. Mindkét típusú ellenőrzéshez szükség lehet valamiféle URL-re, ami adott esetben szintén kiolvasható a tanúsítvány valamely attribútumából.

kérdés: mi van akkor, ha a CRL/OCSP elérhetősége blokkolva van (pl DDos)? Akkor szépen validdá válik minden revoke-olt, de még a lejárati idején belül lévő tanusítvány?
Többször nekifutottam már a kérdésnek, de megoldást még nem találtam...

(Még ha blacklist helyett lenne egy whitelist (tudomásom szerint nincs), de ez se jó megoldás, mert egy hasonló szitu mellett minden valid cert blokkolásra kerülne. )
--
"The only valid measurement of code quality: WTFs/min"

Annyit azért tegyünk hozzá, hogy a kliens oldali (linuxos) levelezők jó része mind a két-félét támogatja (S/MIME, OpenPGP, akár titkosításról, akár aláírásról van szó). Pl. a Thunderbird, vagy a Claws-Mail is - jellemzően az enigmail segítségével. (Viszont ezen funkciók webmailen keresztüli elérhetősége szerintem katasztrófa.)

PGP témához...

http://secushare.org/PGP
épp e 15-ös listát olvasgatom, amikor a 11-esnél elég "jópofa kis hibába" ütköztem, miszerint pár emailkliens IMAP-on át menti a piszkozatot sima szövegként a szerverre! :D
továbbá sokaknak fel sem tűnt e jelenség..

amúgy pedig köszi a leírást, tetszett!

11. Complexity: Storing a draft in clear text on the server

Update: These days mail tools are too complicated. Here come enigmail that is in charge of encrypting mails before they leave Thunderbird. But wait, didn't Thunderbird just store a draft? Yes, and since I happen to have IMAP configured it stored the draft to my server. Did it bother that I had checked the flag that I intend to encrypt the mail? No, the draft is on the server in the clear. I look around and find out that Claws has been having the same bug. I'm not surprised, after all it's the most natural way of doing things. One person implements IMAP, another implements PGP support, and they never bump into each other and realise that the default behaviour of a mail agent that supports both is to do what it should in no way ever do: send the unencrypted mail to the server. This makes the entire effort to use PGP useless. I looked around for warnings, but even the best manuals for doing PGP correctly are aware of a lot of problems, but not this one. I am only on day three of really using PGP, and I already discovered a security flaw that no-one has talked about much ever before. Is this normal? I have Thunderbird 17.0.8 and you?

P.S. I recommend you to turn off saving mail drafts to the server.