2016-05-23 7 views
2

Запрос сертификата клиента включен на сервере 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> 

ответ

1

Кажется, что SSLContext не в состоянии правильно использовать поставщика PKCS № 11 для доступа к смарт-карте, а затем сервер завершает соединение, потому что клиент ha s не отправил подпись.

¿Можете ли вы приложить весь журнал рукопожатия, чтобы увидеть каждый шаг в деталях?

-Djavax.net.debug=ssl 

Хром использует Windows KeyStore, поэтому это не тот же случай. Поскольку ваш Java-код использует поставщика SunPKCS11.

Вы пытались использовать смарт-карту через Windows KeyStore?

KeyStore keystore = KeyStore.getInstance("Windows-MY"); 
keystore.load(null, null); 
+0

Спасибо @pedrofb, я использовал 'Windows-MY', он всплывает и запрашивает PIN2. Но эта ошибка возникает «Исключение в потоке» main «javax.net.ssl.SSLHandshakeException: Ошибка подписи сертификата проверяется –

+0

как мы можем передать запрос pin2 через код? –

+0

Я думаю, если окно выскочит, и это был не ты, был водитель. Поэтому вы не сможете поставить PIN2 по коду (проверьте техническую спецификацию смарт-карты). Производители смарт-карт делают это, чтобы предотвратить попадание PIN2 в неправильные руки. – pedrofb