✍️
E-İmza Rehberi Bireysel ve Kurumsal Elektronik İmza Portalı

Java 21 LTS PKCS#11 SunPKCS11 Provider Konfigürasyon ve Syntax Hatası (libakisp11.dll)

Kurum içi doküman yönetim sistemimizi Java 8'den modern Java 21 LTS sürümüne yükselttik. Ancak e-imza entegrasyonu için kullandığımız `sun.security.pkcs11.SunPKCS11` provider'ını yüklerken sürekli olarak syntax hatası (ProviderException: Error parsing configuration) alıyoruz. Eski konfigürasyon dosyamızda basitçe `name = AKIS`, `library = C:\Windows\System32\libakisp11.dll` yazılıydı ve sorunsuz çalışıyordu. Java 21 ortamında PKCS#11 sağlayıcısını Akis tabanlı akıllı kartlar (TÜBİTAK Kamu SM vb.) için nasıl doğru tanımlamalı ve başlatmalıyız?
Durum: Çözüldü Kategori: Soru-Cevap

2 Cevap

✓

Uygulamanızı Java 8'den Java 21 LTS sürümüne taşırken karşılaştığınız bu hata, Java platformunun güvenlik mimarisindeki evriminden kaynaklanmaktadır. Java 9 ile başlayan modüler sistem (Project Jigsaw) geçişi ve sonrasındaki Java sürümleri (özellikle Java 11 ve 17 sonrası), Java Cryptography Architecture (JCA) içerisinde PKCS#11 sağlayıcısının yapılandırılma şeklinde köklü, geriye dönük uyumluluğu bozan değişiklikler getirmiştir. Java 21 LTS sürümünde eski sun.security.pkcs11.SunPKCS11 sınıfının constructor kullanımı tamamen kullanımdan kaldırılmış (deprecated ve removed) olup, yerine standart java.security.Provider API'si üzerinden yeni configure() metodu getirilmiştir. Aldığınız ProviderException: Error parsing configuration hatası, Java'nın yeni güvenlik sağlayıcısı yapılandırma mantığını beklerken sizin kodunuzun eski başlatma formatını kullanmaya çalışmasından kaynaklanmaktadır.

Java 21 LTS için Doğru PKCS#11 Konfigürasyonu ve Entegrasyon Adımları:

Öncelikle konfigürasyon dosyanızın içeriği temel olarak doğru olsa da, sağlayıcıyı kod içerisinde başlatma şeklinizi değiştirmeniz gerekmektedir. Yeni yaklaşımda Security.getProvider("SunPKCS11") metodunu kullanmalı ve ardından konfigürasyon dosyasının yolunu parametre olarak geçmelisiniz.

İşte adım adım yapmanız gerekenler ve güncel Java kod örneği:

  • Adım 1: PKCS#11 Konfigürasyon Dosyasının (pkcs11.cfg) Hazırlanması: Dosya yollarındaki kaçış karakterlerine dikkat etmeniz çok önemlidir. Windows ortamında dosya yollarını çift ters eğik çizgi ile belirtin. Dosyanızı şu şekilde oluşturun:
    name=AKIS
    library=C:\\Windows\\System32\\libakisp11.dll
    Bazı durumlarda, 64-bit Java kullanıyorsanız ve sisteminizdeki DLL 32-bit ise SysWOW64 klasörüne veya doğrudan AKİS kurulum dizinine (örneğin C:\\Program Files\\Akis\\libakisp11.dll) yönlendirme yapmanız gerekebilir. İşletim sistemi ve Java bit mimarisinin eşleştiğinden emin olun.
  • Adım 2: Java 21 Uyumlu Sağlayıcı Yükleme Kodu: Eski new sun.security.pkcs11.SunPKCS11(config) kullanımını aşağıdaki yeni ve desteklenen API ile değiştirin:

String configName = "C:\\path\\to\\pkcs11.cfg";
Provider p = Security.getProvider("SunPKCS11");
p = p.configure(configName);
Security.addProvider(p);

Alternatif Inline Konfigürasyon: Java 21'de konfigürasyon içeriğini dosya yerine InputStream veya inline String olarak vermek de mümkündür. --add-exports ve --add-opens gibi JVM argümanlarına genellikle uygulamanız modüler bir yapıda değilse doğrudan ihtiyaç duyulmaz, ancak strict modüler sistemde jdk.crypto.cryptoki modülüne yetki vermeniz gerekebilir. Bu yapılandırmalar, 5070 Sayılı Elektronik İmza Kanunu kapsamında Nitelikli Elektronik Sertifikalar (NES) ile güvenli iletişim kurmak için kullanılan standart PKCS#11 API'sinin Java tarafındaki en güncel, güvenli ve uzun vadeli entegrasyon yöntemidir.

Yanıtlayan
Sistem Yöneticisi D.

Yukarıdaki değerli bilgilere ek olarak, doğrudan JCA sağlayıcılarıyla uğraşmak yerine 5070 sayılı kanuna tam uyumlu imzalama işlemlerini yönetmek için bir wrapper (sarmalayıcı) kütüphane kullanmayı düşünebilirsiniz. Örneğin, Türkiye'de yaygın olarak kullanılan TÜBİTAK Kamu SM tarafından sağlanan MA3API veya açık kaynaklı DSS (Digital Signature Services) kütüphaneleri, Java 21 dahil modern Java sürümleriyle uyumlu çalışacak şekilde güncellenmektedir.

Eğer uygulamanız çok fazla farklı ESHS (Elektronik Sertifika Hizmet Sağlayıcısı) desteklemek zorundaysa, her biri için ayrı PKCS#11 konfigürasyon dosyaları yönetmek ve JNI bellek sızıntılarıyla uğraşmak yerine, bu soyutlama katmanlarını kullanmak sizi JVM seviyesindeki syntax ve sağlayıcı değişimlerinden korur. DLL yolunu dinamik olarak tespit eden kütüphaneler iş yükünüzü hafifletecektir. Unutmayın ki PKCS#11 kütüphanesi doğrudan C tabanlı bir kütüphane olduğu için Java'nın çöp toplayıcısı (Garbage Collector) tarafından yönetilmez; oturum (session) açma ve kapatma işlemlerini finally blokları içerisinde manuel olarak yapmayı kesinlikle ihmal etmeyin, aksi takdirde token kısa sürede kilitlenecektir.

Yanıtlayan
Yazılım Mimarı K.