Bu sayfanın seçili sürümü ile mevcut sürümü arasındaki farkları gösterir.
esya:android:android [2013/07/22 12:41] Beytullah Yiğit created |
esya:android:android [2013/08/28 08:33] (mevcut) Beytullah Yiğit |
||
---|---|---|---|
Satır 1: | Satır 1: | ||
- | ===== ANDROID'DE IMZA ATMA ===== | + | ===== Android Platformunda Eİmza ===== |
- | Android sisteminde temel imza formatında (BES) imza oluşturulabilmektedir. Mevcut sürümde AKİS marka kart ve ACS marka kart okuyucular ile imza oluşturulabilmektedir. İmzalama sırasında kart okuyucunun android kütüphanesi kullanılmaktadır. Mevcut sürümde sadece ACS kart okuyucunun android kütüphanesi kullanılmaktadır. ACS android kütüphanesinin desteklediği kart okuyucular http://android.acs.com.hk adresinden görülebilir. Diğer kart okuyucu markalarının android kütüphaneleri yayınlanınca onlar için de destek sağlanacaktır. | + | Android sisteminde temel imza formatında (BES) imza oluşturulabilmektedir. Mevcut sürümde yalnızca AKİS marka kart ve CCID(Chip/Smart Card Interface Devices) standardına uyumlu kart okuyucular ile imza oluşturulabilmektedir. |
- | Android sisteminde imza oluşturulurken kart ile iletişim apdu komutları üzerinden sağlanmaktadır.İmzalama işlemleri için APDUSmartCard sınıfı uygun parametrelerle oluşturulmakta ve getSigner() metodunda alınan BaseSigner nesnesi imzalamada kullanılmaktadır. İmzalama işlemlerinde kullanılacak olan APDUSmartCard sınıfı oluşturulurken uygun TerminalHandler sınıfı oluşturulmalı ve bu kullanılmalıdır. Mevcut sürümde ACSTerminalHandler sınfı oluşturulabilmektedir. Kartla yapılan işlemlerde, android sistemi ilk kullanımda karta erişmek için kullanıcıdan usb erişim onayı istemektedir. Bu onay ekranının görülebilmesi ve düzgün çalışması amacıyla ACSTerminalHandler sınıfına usb erişim hakları için oluşturulmuş bir android sınıfı olan PendingIntent nesnesi verilmelidir. Android sistemindeki benzer akışlardan dolayı kart işlemleri doğrudan ana gui sınıfında yapılmamalı, AsyncTask sınıfından türetilen bir sınıf içerisinde işlemler yapılmalıdır. | + | Android sisteminde imza oluşturulurken kart ile iletişim apdu komutları üzerinden sağlanmaktadır.İmzalama işlemleri için ''APDUSmartCard'' sınıfı uygun parametrelerle oluşturulmakta ve ''getSigner()'' metodunda alınan ''BaseSigner'' nesnesi imzalamada kullanılmaktadır. İmzalama işlemlerinde kullanılacak olan ''APDUSmartCard'' sınıfı oluşturulurken, uygun ''TerminalHandler'' sınıfı oluşturulmalı ve kullanılmalıdır. Kartla yapılan işlemlerde, android sistemi ilk kullanımda, karta erişmek için kullanıcıdan usb erişim onayı istemektedir. Bu onay ekranının görülebilmesi ve düzgün çalışması amacıyla ''SCDTerminalHandler'' sınıfına usb erişim hakları için oluşturulmuş bir android sınıfı olan ''PendingIntent'' nesnesi verilmelidir. Android sistemindeki benzer akışlardan dolayı kart işlemleri doğrudan ana gui sınıfında yapılmamalı, AsyncTask sınıfından türetilen bir sınıf içerisinde işlemler yapılmalıdır. Bununla ilgili kullanım örnek kodlardan görülebilir. |
| | ||
- | Takılı olan kart okuyuculardaki sertifikaları listeleyen ve seçilen dosyayı imzalayan örnek bir android uygulaması eclipse projesi paket içerisinde bulunmaktadır. İmzalama için gerekli jar dosyaları bu örnek eclipse projesine bakılarak görülebilir. | + | Takılı olan kart okuyucudaki sertifikaları listeleyen ve seçilen dosyayı imzalayan örnek bir android uygulaması(eclipse projesi olarak) paket içerisinde bulunmaktadır. İmzalama için gerekli jar dosyaları bu örnek eclipse projesine bakılarak görülebilir. |
Android imzada test lisansı ile çalışırken sadece test sertifikaları ile işlem yapılabilecek ve işlemlerde 5 sn’lik bir gecikme yaşanacaktır. | Android imzada test lisansı ile çalışırken sadece test sertifikaları ile işlem yapılabilecek ve işlemlerde 5 sn’lik bir gecikme yaşanacaktır. | ||
- | Yukarıda bahsedilen akışla ilgili örnek bir fonksiyon aşağıdadır. Kod içerisinde gerekli kısımlarda yorumlar bulunmaktadır. | + | Yukarıda bahsedilen akışla ilgili örnek bir fonksiyon aşağıdadır. Kod içerisinde gerekli kısımlarda yorumlar bulunmaktadır. |
<sxh java> | <sxh java> | ||
- | public void signWithFirstCertificate() | + | public void signWithFirstCertificate() |
{ | { | ||
try { | try { | ||
//Burada gömülü lisans dosyası yüklenmektedir. | //Burada gömülü lisans dosyası yüklenmektedir. | ||
Resources res = getResources(); | Resources res = getResources(); | ||
- | InputStream lisansStream = res.openRawResource(R.raw.lisans); | + | InputStream lisansStream = res.openRawResource(R.raw.lisans_test); |
LicenseUtil.setLicenseXml(lisansStream); | LicenseUtil.setLicenseXml(lisansStream); | ||
lisansStream.close(); | lisansStream.close(); | ||
Activity callerActivity = this; | Activity callerActivity = this; | ||
- | //ACSTerminalHandler oluşturulurken bunu çağıran Activity parametre olarak verilmelidir. | + | //SCDTerminalHandler oluşturulurken bunu çağıran Activity parametre olarak verilmelidir. |
- | ACSTerminalHandler acsTerminalHandler = new ACSTerminalHandler((Activity)this); | + | |
- | //APDUSmartCard sınıfı uygun TerminalHandler sınıfı ile çağrılmalıdır. | + | |
- | APDUSmartCard apduSmartCard = new APDUSmartCard(acsTerminalHandler); | + | |
//Kullanıcıdan usb erişim onayı alınabilmesi için oluşturulmuş olan PendingIntent nesnesi terminal handler sınıfına verilmelidir. | //Kullanıcıdan usb erişim onayı alınabilmesi için oluşturulmuş olan PendingIntent nesnesi terminal handler sınıfına verilmelidir. | ||
- | PendingIntent permissionIntent = PendingIntent.getBroadcast(callerActivity, 0, new Intent("tr.gov.tubitak.bilgem.esya.android.signexample.USB_PERMISSION"), 0); | + | PendingIntent permissionIntent = PendingIntent.getBroadcast(callerActivity, 0, new Intent("tr.gov.tubitak.bilgem.esya.android.signexample.USB_PERMISSION"), 0); |
- | acsTerminalHandler.setPermissionIntent(permissionIntent); | + | SCDTerminalHandler terminalHandler = new SCDTerminalHandler(callerActivity,permissionIntent); |
+ | //APDUSmartCard sınıfı uygun TerminalHandler sınıfı ile çağrılmalıdır. | ||
+ | APDUSmartCard apduSmartCard = new APDUSmartCard(terminalHandler); | ||
//Akis kart iletişimi için SecureMessaging devre dışı bırakılmalıdır. | //Akis kart iletişimi için SecureMessaging devre dışı bırakılmalıdır. | ||
- | apduSmartCard.setDisableSecureMessaging(true); | + | apduSmartCard.setDisableSecureMessaging(true); |
//Bağlı kart okuyucular okunuyor. | //Bağlı kart okuyucular okunuyor. | ||
CardTerminal[] terminalList = apduSmartCard.getTerminalList(); | CardTerminal[] terminalList = apduSmartCard.getTerminalList(); | ||
Satır 38: | Satır 37: | ||
apduSmartCard.openSession(cardTerminal); | apduSmartCard.openSession(cardTerminal); | ||
//İlk kart okuyucudan sertifika listesi alınıyor. | //İlk kart okuyucudan sertifika listesi alınıyor. | ||
- | List<byte[]> signCertValueList = mApduSmartCard.getSignatureCertificates(); | + | List<byte[]> signCertValueList = apduSmartCard.getSignatureCertificates(); |
if(signCertValueList == null || signCertValueList.size() == 0) | if(signCertValueList == null || signCertValueList.size() == 0) | ||
{ | { | ||
Satır 47: | Satır 46: | ||
String cardPin = "511661"; | String cardPin = "511661"; | ||
apduSmartCard.login(cardPin); | apduSmartCard.login(cardPin); | ||
- | //İmzalamada kullanılacak BaseSigner APDUSmartCard sınıfından alınıyor. | + | //İmzalamada kullanılacak BaseSigner APDUSmartCard2 sınıfından alınıyor. |
BaseSigner signer = apduSmartCard.getSigner(signingCert.asX509Certificate(), Algorithms.SIGNATURE_RSA_SHA1); | BaseSigner signer = apduSmartCard.getSigner(signingCert.asX509Certificate(), Algorithms.SIGNATURE_RSA_SHA1); | ||
BaseSignedData bsd = new BaseSignedData(); | BaseSignedData bsd = new BaseSignedData(); | ||
+ | |||
+ | //Dosya imzalanmak istenirse | ||
//İmzalanacak olan dosya yolu | //İmzalanacak olan dosya yolu | ||
- | String sourceFilePath = "/tmp/TextForSign.txt"; | + | //String sourceFilePath = "/tmp/TextForSign.txt"; |
- | ISignable content = new SignableFile(new File(sourceFilePath)); | + | //ISignable content = new SignableFile(new File(sourceFilePath)); |
+ | |||
+ | //Veri imzalanacak. | ||
+ | ISignable content = new SignableByteArray("ImzalanacakVeri".getBytes()); | ||
bsd.addContent(content); | bsd.addContent(content); | ||
//Since SigningTime attribute is optional,add it to optional attributes list | //Since SigningTime attribute is optional,add it to optional attributes list | ||
Satır 62: | Satır 66: | ||
params.put(EParameters.P_VALIDATE_CERTIFICATE_BEFORE_SIGNING,false); | params.put(EParameters.P_VALIDATE_CERTIFICATE_BEFORE_SIGNING,false); | ||
bsd.addSigner(ESignatureType.TYPE_BES, signingCert, signer, optionalAttributes, params); | bsd.addSigner(ESignatureType.TYPE_BES, signingCert, signer, optionalAttributes, params); | ||
- | byte [] signedDocument = bsd.getEncoded(); | + | byte [] signedData = bsd.getEncoded(); |
- | String destFilePath = sourceFilePath+ ".imz"; | + | System.out.println("******** İmzalı Veri *********"); |
+ | System.out.println(Base64.encode(signedData)); | ||
+ | System.out.println("******************************"); | ||
+ | |||
+ | // Eğer imzalı hali dosyaya yazılmak istenirse | ||
+ | //String destFilePath = sourceFilePath+ ".imz"; | ||
//İmzalı hali dosyaya yazılıyor. | //İmzalı hali dosyaya yazılıyor. | ||
- | AsnIO.dosyayaz(signedDocument, destFilePath); | + | //AsnIO.dosyayaz(signedData, destFilePath); |
apduSmartCard.logout(); | apduSmartCard.logout(); | ||
apduSmartCard.closeSession(); | apduSmartCard.closeSession(); |