2013-03-15

Polkuja älykorttien kanssa osa2 - Toimii

Kuinka älykortteja voidaan hyödyntää, ihan käytännössä? Kuinka niiden vaatimien ohjelmistojen asennus onnistuu ja mitkä palvelut tukevat älykortteja? Haistellaanpa HST-korttia. Näytän, että sitä voi todella käyttää ja se toimii. Esimerkkinä kirjaudun ssh-yhteydellä etäkoneelle käyttäen PIN-koodia ja HST-korttiani.
 Myöhemmin käyn läpi myös FSFE:n (Free Software Foundation Europe) OpenPGP-korttia. Lisäksi uskon, että jotain tietoja saan ulos myös vanhentuneista korteista, kuten vanhat pankkiautomaattikortit ja eTampere-kortti, vähintäänkin niiden tunnisteet eli minkä tyypin kortti on kyseessä sekä kortin uniikit IDt.

Varoitus, teknoa edessä!


Varsinaisena työkaluna tässä toimii Debian GNU/Linux. Windowsia käytän vain siinä äärimmäisessä tapauksessa, kun kokeilen PIN-koodin syöttöä. Useat kortit nimittäin lukittuvat kolmen väärän PIN-koodin syötön jälkeen, enkä kaikilla korteilla ole vielä keksinyt tapaa avata niitä admin-PIN koodilla.

Windowsissa käytän Fujitsun mPollux kortinlukijaohjelmistoa, joka löytyy vrk.fi:n sivuilta ja Linuxissa pcscd:tä. USB-kortinlukijani, mallia SCR531, firmware täytyi päivittää versiosta 4.*- >5.22, ennen kuin sain sen toimimaan uudemmilla korteilla.


Asennettavat softat Linux puolella

  • pcscd
  • pcsc-tool
  • opensc
  • myöhemmin  jotain udev-scriptejä gnupg-korttia varten

Komennolla pcsc_scan näkee, onko kortti sisällä lukijassa ja mitä se sisältää. dmesg antaa vihjeen lukijasta. OpenPGP kortista tietoja saa vaikka "gpg --card-status" komennolla.

dmesg-tuloste, kun kortin lukija liitettiin tietokoneeseen:

[30008.992128] usb 6-2: new full-speed USB device number 3 using uhci_hcd
[30009.195216] usb 6-2: New USB device found, idVendor=04e6, idProduct=e001
[30009.195226] usb 6-2: New USB device strings: Mfr=1, Product=2, SerialNumber=5
[30009.195234] usb 6-2: Product: SCRx31 USB Smart Card Reader
[30009.195240] usb 6-2: Manufacturer: SCM Microsystems Inc.
[30009.195246] usb 6-2: SerialNumber: 502000D4


Käynnistetään kortinlukijan ja kortin välisen liikenteen hoitava framework:
root@kone:/ $ /etc/init.d/pcscd start

Luetaan korttia:
root@kone:/ $ pcsc_scan 
PC/SC device scanner
V 1.4.20 (c) 2001-2011, Ludovic Rousseau
Compiled with PC/SC lite version: 1.8.3
Using reader plug'n play mechanism
Scanning present readers...
0: SCM Microsystems Inc. SCR 331 [CCID Interface] (502000D4) 00 00

Thu Mar 14 21:59:02 2013
Reader 0: SCM Microsystems Inc. SCR 331 [CCID Interface] (502000D4) 00 00
  Card state: Card removed, 

...SYÖTETÄÄN KORTTI SISÄÄN ...

Thu Mar 14 22:00:40 2013
Reader 0: SCM Microsystems Inc. SCR 331 [CCID Interface] (502000D4) 00 00
  Card state: Card inserted, 
  ATR: 3B 7B 94 00 00 80 62 12 51 56 46 69 6E 45 49 44

ATR: 3B 7B 94 00 00 80 62 12 51 56 46 69 6E 45 49 44
+ TS = 3B --> Direct Convention
+ T0 = 7B, Y(1): 0111, K: 11 (historical bytes)
  TA(1) = 94 --> Fi=512, Di=8, 64 cycles/ETU
    62500 bits/s at 4 MHz, fMax for Fi = 5 MHz => 78125 bits/s
  TB(1) = 00 --> VPP is not electrically connected
  TC(1) = 00 --> Extra guard time: 0
+ Historical bytes: 80 62 12 51 56 46 69 6E 45 49 44
  Category indicator byte: 80 (compact TLV data object)
    Tag: 6, len: 2 (pre-issuing data)
      Data: 12 51
    Tag: 5, len: 6 (card issuer's data)
      Card issuer data: 46 69 6E 45 49 44

Possibly identified card (using /usr/share/pcsc/smartcard_list.txt):
3B 7B 94 00 00 80 62 12 51 56 46 69 6E 45 49 44
3B 7B 94 00 00 80 62 1[1,2] 51 56 46 69 6E 45 49 44
        Finnish Electronic ID card (fineid card www.fineid.fi)

ATR kertoo tässä kortin tyypistä jotain ja tunnistaa sen (oikein) suomalaiseksi HST-kortiksi.



root@kone: ~$ opensc-tool -n
Using reader with a card: SCM Microsystems Inc. SCR 331 [CCID Interface] (502000D4) 00 00
SetCOS

Selvä, HST kortin tyyppi on SetCOS eli Setec:in valmistama kortti.

Mitä  algroritmejä kortti osaa?
root@kone: ~$ opensc-tool --list-algorithms

Using reader with a card: SCM Microsystems Inc. SCR 331 [CCID Interface] (502000D4) 00 00
Algorithm: rsa
Key length: 1024
Flags: padding ( pkcs1 ) hashes ( sha1 )

Algorithm: rsa
Key length: 2048
Flags: padding ( pkcs1 ) hashes ( sha1 )

Tiesin, että kortilla on kaksi salaista avainta, joista toinen on allekirjoitukseen (ilmeisesti tuo 1024bittinen) ja toinen salaukseen (2048bittinen). Seuraavaksi haluan ryhtyä käyttämään kortin avainpareja. 
Haluan käyttää älykortin prosessoria kryptologiseen operaatioon.

Koska se, miten X.509 varmenne on tallennettu kuvataan  pkcs15-standardissa, on komentokin osuvasti pkcs15-tool

Seuraava näyttää kortilla olevat varmenteet ([todentamis- ja salausvarmenne], [allekirjoitusvarmenne], [VRK Root CA], [VRK Gov. CA for Citizen Qualified Certificates])

root@kone: ~$ pkcs15-tool -c    
X.509 Certificate [todentamis- ja salausvarmenne]
        Object Flags   : [0x0]
        Authority      : no
        Path           : xxxxxxxx
        ID             : 45
        Access Rules   : read:;
        Encoded serial : 02 04 AAAAAAAAAA

Oman todentamisavaimen saa ulos selkokielisenä parsittuna
pkcs15-tool -r 45 | openssl x509 -noout -text

Tuossa 45 oli luettavan varmenteen id, tulos lähetetään eteenpäin ('|') , -noout jättää tulostamatta ASCII-varmenteen ja -text tekee selkokielisen parsinnan. 

Näytetään mun privat avaimet:

root@kone:~$ pkcs15-tool -k
Using reader with a card: SCM Microsystems Inc. SCR 331 [CCID Interface] (502000D4) 00 00
Private RSA Key [todentamis- ja salausavain]
        Object Flags   : [0x1], private
        Usage          : [0x26], decrypt, sign, unwrap
        Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
        Access Rules   : execute:01;
        ModLength      : 2048
        Key ref        : 0 (0x0)
        Native         : yes
        Path           : 3f004b01
        Auth ID        : 01
        ID             : 45

Private RSA Key [allekirjoitusavain]
        Object Flags   : [0x1], private
        Usage          : [0x200], nonRepudiation
        Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
        Access Rules   : execute:02;
        ModLength      : 2048
        Key ref        : 0 (0x0)
        Native         : yes
        Path           : 3f0050164b02
        Auth ID        : 02
        ID             : 46

Access Flags:it vaikuttavat mielenkiintoiselta. sensitive, alwaysSensitive, neverExtract, local.
Joku noista varmasti tarkoittaa sitä, että avainta ei koskaan saa ulos kortilta vaan sitä
voidaan operoida vain kortin prosessorilla. Joku muu operaatio taas tarkoittaa sitä, että käyttöön tarvitaan
PIN-koodi, mutta muuten kaikki vaikuttavat hyvin samankaltaisilta. Koska olin varma, ettei niitä salaisia avaimia näytetä, saatoin ajaa tämän komennon.

Käyttökohde: ssh-yhteys etäkoneeseen HST kortin avaimella

1) kopioi HST-kortin julkinen avain ssh-palvelimelle normaaliin tapaan
1.1) nouda julkinen avain kortilta (id:stä 45 täss)
pkcs15-tool --read-ssh-key 45 > kortti.pub
ssh-copy-id -i kortti.pub user@etakone

2)  varmista, että käyttäjällä ei ole pääsyä olemassaoleviin priva-avaimiin

Käytä opensc-kirjaston kautta avainta

root@kone :~# ssh -I /usr/lib/i386-linux-gnu/opensc-pkcs11.so user@etakone
Enter PIN for 'HENKILOKORTTI (perustunnusluku)':

...syötä tähän PIN1 koodisi ..

 etakone%   # ! perillä ollaan

Tässä tapauksessa käytettiin kortilla sijaitsevaa salaista avainta, jota ei pitäisi voida pystyä kopioimaan. Vastapäässä oli julkinen avain, jonka avulla pystytään vahvistamaan autentikoitu yhteys. Salasanoja ei lähetetty verkon yli.