Мой код работает правильно, когда я использую алгоритм подписи RSA_SHA256 с подходящей смарт-картой на основе pkcs11. У меня есть еще одна подготовленная смарт-карта с алгоритмом подписи SHA384withECDSA (эллиптическая кривая).
Мой Java-код получает ошибку в операторе «KeyStore.Entry enter = ks.getEntry(alias, null);».
Я использую jdk 22. Думаю, есть ли в jdk22 ошибка, связанная с криптографией эллиптических кривых.
У вас есть опыт работы с этим? Как я могу исправить ошибку?
Часть кода, связанная с ошибкой
...
...
...
...
приложение общедоступного класса
{
публичный статический вывод строки;
Код: Выделить всё
static CallbackHandler handler = callbacks -> {
for (Callback cb : callbacks) {
if (cb instanceof PasswordCallback) {
((PasswordCallback) cb).setPassword(pin.toCharArray());
} else {
System.out.println("CallbackHandler hatası");
throw new UnsupportedCallbackException(cb);
}
}
};
public static void main(String[] args) throws Exception {
try{
String pkcs11DriverPath = "C:/Windows/System32/akisp11.dll";
String alias = "1234567891ABCD";
String certSerial = "112233445678934567";
String Slot = getSlot(certSerial);
pin = "123456";
Provider pkcs11Provider = createPkcs11Provider(pkcs11DriverPath, Slot);
Security.addProvider(pkcs11Provider);
KeyStore.Builder builder = KeyStore.Builder.newInstance("PKCS11", pkcs11Provider, new KeyStore.CallbackHandlerProtection(handler));
KeyStore ks = builder.getKeyStore();
ks.load(null, pin.toCharArray());
KeyStore.Entry entry = ks.getEntry(alias, null);
.....
.....
} catch (Exception e) {
e.printStackTrace();
}
}
private static Provider createPkcs11Provider(String pkcs11Path, String slot) throws Exception {
Provider configured_p = null;
try {
String config = "name = pkcs11SmartCard\n" + "library = " + libraryPath + "\n" + "slot = " + slot + "\n";
java.nio.file.Path tmpCfg = java.nio.file.Files.createTempFile("pkcs11-", ".cfg");
java.nio.file.Files.write(tmpCfg, config.getBytes(java.nio.charset.StandardCharsets.UTF_8));
Provider p = Security.getProvider("SunPKCS11");
if (p == null) {
throw new RuntimeException("SunPKCS11 provider not available in this JDK.");
}
configured_p = p.configure(tmpCfg.toAbsolutePath().toString());
} catch (Exception e) {
e.printStackTrace();
}
return configured_p;
}
public static String getSlot(String cert_sn) {
String slot = "";
try {
......
......
return slot;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
...
...
java.security.KeyStoreException: неподдерживаемые параметры
в jdk.crypto.cryptoki/sun.security.pkcs11.P11KeyStore.loadPkey(P11KeyStore.java:1385)
at jdk.crypto.cryptoki/sun.security.pkcs11.P11KeyStore.engineGetEntry(P11KeyStore.java:971)
в java.base/java.security.KeyStore.getEntry(KeyStore.java:1575)
в pkt.mvn.App.main(App.java:269)
Вызвано: java.io.IOException: поддерживаются только именованные ECParameters
в java.base/sun.security.util.ECParameters.engineInit(ECParameters.java:149)
в java.base/java.security.AlgorithmParameters.init(AlgorithmParameters.java:311)
at java.base/sun.security.util.ECUtil.getECParameterSpec(ECUtil.java:190)
на jdk.crypto.cryptoki/sun.security.pkcs11.P11KeyStore.loadPkey(P11KeyStore.java:1381)
Подробнее здесь: https://stackoverflow.com/questions/798 ... -statement
Мобильная версия