Запрос сертификата клиента включен на сервере Apache и настроен SSL. Все работает с браузером, таким как Chrome. Но мы пытаемся создать клиентское приложение для аутентификации с сертификатом SmartCard PKCS11 напрямую (без браузера).handshake_failure при попытке установления подлинности TLS Аутентификация клиента с помощью смарт-карты
Вот основной код:
String configName = "d:/config.txt";
SunPKCS11 sunpkcs11 = new SunPKCS11(configName);
Security.addProvider(sunpkcs11);
KeyStore keyStore = null;
keyStore = KeyStore.getInstance("PKCS11",sunpkcs11);
keyStore.load(null, pin.toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, pin.toCharArray());
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(kmf.getKeyManagers(), null, null);
SSLContext.setDefault(ctx);
final SSLSocketFactory factory = ctx.getSocketFactory();
final SSLSocket socket = (SSLSocket) factory.createSocket("xx.xx.xx.xx", 443);
socket.startHandshake();
PrintWriter out = new PrintWriter(socket.getOutputStream());
String fileName = "/Login";
out.print("GET " + fileName + " HTTP/1.0\r\n");
out.print("\r\n");
out.flush();
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
while ((line = in.readLine()) != null)
System.out.println(line);
Ошибки при шаге Рукопожатия работает.
Stack исключение след:
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
Exception in thread "main" javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failu
В журналах Apache мы получаем следующее:
Certificate Verification: Error (20): unable to get local issuer certificate
И Java App происходит эта ошибка:
Warning: no suitable certificate found - continuing without client authentication
*** Certificate chain
<Empty>
Спасибо @pedrofb, я использовал 'Windows-MY', он всплывает и запрашивает PIN2. Но эта ошибка возникает «Исключение в потоке» main «javax.net.ssl.SSLHandshakeException: Ошибка подписи сертификата проверяется –
как мы можем передать запрос pin2 через код? –
Я думаю, если окно выскочит, и это был не ты, был водитель. Поэтому вы не сможете поставить PIN2 по коду (проверьте техническую спецификацию смарт-карты). Производители смарт-карт делают это, чтобы предотвратить попадание PIN2 в неправильные руки. – pedrofb