Java за цифрово подписване на документи в уеб


Достъп до смарт карти от Java



страница7/14
Дата14.08.2018
Размер1.94 Mb.
1   2   3   4   5   6   7   8   9   10   ...   14

1.2.Достъп до смарт карти от Java


От версия 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


Каталог: books -> signatures
books -> В обятията на шамбала
books -> Книга се посвещава с благодарност на децата ми. Майка ми и жена ми ме научиха да бъда мъж
books -> Николай Слатински “Надеждата като лабиринт” София, Издателство “виденов & син”, 1993 год
books -> София, Издателство “Българска книжница”, 2004 год. Рецензенти доц д. ик н. Димитър Йончев, проф д-р Нина Дюлгерова Научен редактор проф д-р Петър Иванов
books -> Николай Слатински “Измерения на сигурността” София, Издателство “Парадигма”, 2000 год
books -> Книга 2 щастие и успех предисловие
books -> Превръщане на числа от една бройна система в друга
books -> Тантриското преобразяване
signatures -> Java за цифрово подписване на документи в уеб


Поделитесь с Вашими друзьями:
1   2   3   4   5   6   7   8   9   10   ...   14


База данных защищена авторским правом ©obuch.info 2019
отнасят до администрацията

    Начална страница