От версия 1.5 на Java 2 платформата стандартно се поддържа достъп до смарт карти посредством интерфейса PKCS#11 (Cryptographic Token Interface Standard). Връзката с него се осъществява чрез доставчика на криптографски услуги “Sun PKCS#11 Provider”.
Програмен интерфейс PKCS#11
Както знаем, PKCS#11 е стандарт, който предоставя програмен интерфейс за достъп до смарт карти и други криптоустройства (security tokens), и най-често е имплементиран в динамична библиотека (.dll или .so файл), която се доставя заедно с драйверите за смарт картата.
Например, ако използваме ISO 7816 съвместима Utimaco Safeware смарт карта, PKCS#11 имплементацията за тази карта се съдържа в софтуера “Utimaco SafeGuard Smartcard Provider”, който идва заедно с картата. След инсталиране на този софтуер под Windows XP, библиотеката, която имплементира PKCS#11 е файлът C:\WINDOWS\system32\pkcs201n.dll. При други смарт карти и други операционни системи тази библиотека се намира съответно в друг файл, но би трябвало да е налична.
Sun PKCS#11 Provider
В Java 1.5 достъп за до смарт карти се използва доставчикът на криптографски услуги “Sun PKCS#11 Provider”.
За разлика от повечето JCA доставчици, Sun PKCS#11 Provider не имплементира директно криптографска функционалност, а разчита на машиннозависима (native) PKCS#11 имплементация, към която пренасочва всички операции. Тази имплементация трябва да е реализирана като .dll файл в Windows или .so файл в UNIX и Linux [Sun PKCS#11].
Например ако използваме Utimaco SafeGuard Smartcard Provider за Windows, PKCS#11 имплементацията е библиотеката pkcs201n.dll. Ако използваме друга смарт карта и други драйвери, файлът е друг.
Конфигуриране на Sun PKCS#11 Provider
За да бъде използван “Sun PKCS#11 Provider”, той първо трябва да се регистрира като доставчик на криптографски услуги в JCA (Java Cryptography Architecture). Регистрацията може да стане статично или динамично (по време на изпълнение).
Статична регистрация на Sun PKCS#11 Provider
Статичната регистрация изисква да се промени файлът %JAVA_HOME%/lib/ security/java.security и в него да се добави още един доставчик на криптографски услуги, например по следния начин:
# Configuration for security providers 1..6 ommitted
security.provider.7=sun.security.pkcs11.SunPKCS11 C:\smartcards\config\pkcs11.cfg
|
Посоченият файл pkcs11.cfg трябва да съдържа настройките на Sun PKCS#11 Provider. Той представлява текстов файл, който описва някои параметри, като например пътя до PKCS#11 библиотеката.
Динамична регистрация на Sun PKCS#11 Provider
При динамична регистрация на “Sun PKCS#11 Provider” трябва да се инстанцира класът sun.security.pkcs11.SunPKCS11 като му се подаде за параметър конфигурационният файл, от който да прочете настройките си, и след това да се регистрира в JCA. Ето пример как може да стане това:
String pkcs11ConfigFile = "c:\\smartcards\\config\\pkcs11.cfg";
Provider pkcs11Provider = new sun.security.pkcs11.SunPKCS11(pkcs11ConfigFile);
Security.addProvider(pkcs11Provider);
| Конфигурационен файл на Sun PKCS#11 Provider
И при статичната и при динамичната регистрация е необходим конфигурационен файл, от който класът SunPKCS11 да прочете пътя до библиотеката, която имплементира PKCS#11 стандарта. Ето пример за такъв конфигурационен файл:
pkcs11.cfg
|
name = SmartCard
library = c:\windows\system32\pkcs201n.dll
|
Както се вижда, файлът съдържа две настройки: name и library. Стойността на параметъра name се използва при образуване на името за инстанцията на PKCS#11 доставчика в JCA, а параметърът library задава пътя до библиотеката, която имплементира PKCS#11. Ако трябва да се работи с няколко смарт карти едновременно Sun PKCS#11 Provider, трябва да се регистрира няколко пъти с различни имена.
Конфигурационният файл може да задава различни параметри, които са описани в документацията, но задължителни са само name и library.
Използване на Sun PKCS#11 Provider без конфигурационен файл
Ако не искаме да използваме външен конфигурационен файл, можем да зададем настройките на Sun PKCS#11 Provider динамично чрез поток. Ето пример как може да се направи това:
String pkcs11config =
"name = SmartCard\n" +
"library = c:\\windows\\system32\\pkcs201n.dll";
byte[] pkcs11configBytes = pkcs11config.getBytes();
ByteArrayInputStream configStream = new ByteArrayInputStream(pkcs11configBytes);
Provider pkcs11Provider = new sun.security.pkcs11.SunPKCS11(configStream);
Security.addProvider(pkcs11Provider);
| Извличане на KeyStore от смарт карта
След като сме регистрирали и конфигурирали успешно Sun PKCS#11 Provider, можем да го използваме за да извличаме сертификати и ключове от смарт карта. Това става посредством стандартния в Java клас за достъп до хранилища java.security.KeyStore.
Ето пример как можем да установим достъп защитено до хранилище за ключове и сертификати, съхранявано върху смарт карта:
char[] pin = {'1', '2', '3', '4'};
KeyStore smartCardKeyStore = KeyStore.getInstance("PKCS11");
smartCardKeyStore.load(null, pin);
|
Посоченият сорс код очаква, че Sun PKCS#11 Provider е бил успешно регистриран и конфигуриран. За прочитането на хранилище от смарт карта е необходимо да бъде посочен PIN кодът за достъп до картата.
Извличане на сертификат и личен ключ от смарт карта
След като сме установили достъп до хранилището на смарт картата, можем да извличаме от нея ключове и сертификати, както от обикновено хранилище. Всички ключове, сертификати и сертификационни вериги са записани под дадено име (alias) в хранилището. Имената могат да се извличат чрез итератор.
Ето един пример, в който се извличат и отпечатват всички сертификати от дадено хранилище заедно с информация за личните им ключове:
KeyStore keyStore = ...;
Enumeration aliasesEnum = keyStore.aliases();
while (aliasesEnum.hasMoreElements()) {
String alias = (String)aliasesEnum.nextElement();
System.out.println("Alias: " + alias);
X509Certificate cert = (X509Certificate) keyStore.getCertificate(alias);
System.out.println("Certificate: " + cert);
PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, null);
System.out.println("Private key: " + privateKey);
}
|
Примерът работи както за обикновени хранилища, така и за хранилища, разположени върху смарт карта. В случая за смарт карта за достъп до личните ключове не се изисква парола, защото PIN кодът се изпраща преди това при инстанцирането на KeyStore обекта. Затова в примера за парола се подава стойност null.
На пръв поглед изглежда, че личните ключове могат да се извличат от смарт картата, но на практика това не е така. Смарт картите не позволяват извличането на ключове, а само индиректен достъп до тях с цел подписване, верификация на подпис, шифриране и дешифриране. В горния пример не се извлича личният ключ, а само интерфейс за достъп до него.
След като е извлечен интерфейсът на даден личен ключ от смарт картата, той може да се използва за подписване на данни, както всеки друг личен ключ. Реално подписването става като се изчисли предварително хеш стойността на документа за подписване и се подаде тази хеш стойност на смарт картата за да го подпише тя със своя криптопроцесор. При успех картата връща изчислената сигнатура в резултат от подписването на хеш стойността. Така личният ключ не се излага на рискове, защото остава в тайна, скрит някъде в картата. Ето примерен код за подписване на данни по даден интерфейс към личен ключ, извлечен от смарт карта:
private static byte[] signDocument(byte[] aDocument, PrivateKey aPrivateKey)
throws GeneralSecurityException {
Signature signatureAlgorithm = Signature.getInstance("SHA1withRSA");
signatureAlgorithm.initSign(aPrivateKey);
signatureAlgorithm.update(aDocument);
byte[] digitalSignature = signatureAlgorithm.sign();
return digitalSignature;
}
|
|
Национална академия по разработка на софтуер
|
Лекторите
» Светлин Наков е преподавател по съвременни софтуерни технологии в СУ “Св. Климент Охридски”.
Той е автор на десетки научни и технически публикации и няколко книги, свързани с разработката на софтуер, заради което е търсен лектор и консултант.
През 2004 г. получава наградата "Джон Атанасов" от президента на България Георги Първанов за приноса му към развитието на информационните технологии и информационното общество.
» Мартин Кулов е изпълнителен директор във фирма “Код Атест”, където разработва проекти за повишаване качеството на софтуерните продукти в България чрез автоматизация на процесите и внедряване на системи за управление на качеството.
Мартин е опитен лектор и сертифициран от Майкрософт разработчик по програмите MCSD и MCSD.NET.
» Други инструктори с опит като преподаватели и програмисти.
|
Академията
» Национална академия по разработка на софтуер (НАРС) е център за професионално обучение на софтуерни специалисти.
» НАРС провежда задълбочени курсове по разработка на софтуер и съвременни софтуерни технологии.
» Предлагани специалности:
.NET Enterprise Developer
Java Enterprise Developer
» Качествено обучение с много практически упражнения
» Завършвате само за 3 месеца.
» Гарантирана работа след успешно завършване!
» Професионална сертификация!
» БЕЗПЛАТНО!
Учите безплатно, плащате след като завършите и започнете работа.
Стипендии от софтуерни фирми.
|
http://academy.devbg.org
|
Сподели с приятели: |