Однажды я реализовал нечто похожее на это, но, к сожалению, драйвер смарт-карты глючил, поэтому драйвер пытался вызвать собственный обратный вызов ПИН-кода, реализованный в самом драйвере время от времени. Но давайте предположим, что ваш драйвер работает лучше.
Прежде всего, вам необходимо реализовать CallbackHandler , документация дает хороший обзор концепции. В вашем случае это интересный случай с PasswordCallback .
Затем создайте KeyStore
следующим образом (обработка исключений пропущена)
Provider provider = Security.getProvider("SunMSCAPI");
CallbackHandler cbh = // your implementation
KeyStore.ProtectionParameter protection = new KeyStore.CallbackHandlerProtection(cbh);
//get a handle of the CAPI KeyStore as before
KeyStore.Builder keystoreBuilder = KeyStore.Builder.newInstance("Windows-MY",
provider,
protection);
KeyStore store = keystoreBuilder.getKeyStore();
Затем, чтобы получить доступ к закрытому ключу, сделайте следующее:
KeyStore.Entry ke = store.getEntry(alias, null);
if (!(ke instanceof KeyStore.PrivateKeyEntry))
throw new RuntimeException("The entry is not a private key.");
PrivateKey key = ((KeyStore.PrivateKeyEntry) ke).getPrivateKey();
Поставщик автоматически сгенерирует соответствующие PasswordCallback
s для отправки на ваш CallbackHandler
. При обработке обратного вызова вы просто передадите свой кешированный пароль.
Само собой разумеется, что кеширование паролей обычно осуждается;)