2016-12-06 18 views
0

Я использую JAVA 8. Я пытаюсь подключить сервер Socket с использованием клиентских сертификатов и дерева сертификатов.Ошибка подключения SSL-соединения

У меня есть следующее, предоставленные клиентом:

  1. Client CERT (PEM)
  2. Private Key (PEM)
  3. CA Tree (PEM) - 4 Сертификаты

У меня есть созданный keystore.jks, используя следующие этапы:

  1. Объединения сертификата клиента и CA дерева в одном файле PEM с помощью кошки

  2. хохлатой PKCS12 файла из объединенного файла шифруется с помощью секретного ключа (OpenSSL Command)

  3. Сформирован JKS файла ключей с помощью Keytool

Я создал trustore.jks, используя следующие шаги:

  1. Разделить дерево CA (4 сертификата) в 4 разных файлах
  2. генерируемый файл trustore используя Keytool путем импорта каждого файла один на один

Мой Пример кода выглядит следующим образом:

package com.tutorial.exception.customize; 

import javax.net.ssl.SSLHandshakeException; 
import javax.net.ssl.SSLSocket; 
import javax.net.ssl.SSLSocketFactory; 
import java.io.*; 
import java.security.cert.CertPathValidatorException; 
import java.security.cert.CertificateException; 
import java.util.Scanner; 

/** 
* Created by SomnathG on 12/1/2016. 
*/ 
public class Client { 
    public Client() { 

     System.setProperty("javax.net.ssl.keyStore", {keystore Location}); 
     System.setProperty("javax.net.ssl.keyStorePassword", {password}); 
     System.setProperty("javax.net.ssl.trustStore", {trustore location}); 
     System.setProperty("javax.net.ssl.trustStorePassword", {password}); 
     System.setProperty("javax.net.debug", "all"); 

     System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true"); 
    } 

    public void connectHost(){ 
     SSLSocketFactory sslSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
     SSLSocket sslSocket = null; 
     try { 

      sslSocket = (SSLSocket) sslSocketFactory.createSocket(host, port); 
      sslSocket.setEnabledProtocols(new String[] {"TLSv1.2"}); 

      sslSocket.startHandshake(); 

      InputStream inputStream = sslSocket.getInputStream(); 
      OutputStream outputStream = sslSocket.getOutputStream(); 
      System.out.println("Sending request to Socket Server"); 
      outputStream.write("Hello".getBytes()); 
      outputStream.write("exit".getBytes()); 
      byte[] messageByte = new byte[1000]; 
      boolean end = false; 
      String dataString = ""; 
      int bytesRead = 0; 
      String messageString = ""; 
      DataInputStream in = new DataInputStream(sslSocket.getInputStream()); 

      while(!end) 
      { 
       bytesRead = in.read(messageByte); 
       messageString += new String(messageByte, 0, bytesRead); 
       if (messageString.length() == 100) 
       { 
        end = true; 
       } 
      } 
      System.out.println("MESSAGE: " + messageString); 
      // byte[] read = (byte[]) ois.readObject(); 
      //String s2 = new String(read); 
      //System.out.println("" + s2); 
      //System.out.println("Message: " + message); 
      //close resources 

      //System.out.println(receive(inputStream)); 


     }catch (IOException e) { 
      e.printStackTrace(); 
      System.out.println("====="); 
      System.out.println(e.getMessage()); 
      System.out.println("====="); 
      CertPathValidatorException ce = new CertPathValidatorException(e); 
      System.out.println("******"); 
      System.out.println(ce.getIndex()); 
      System.out.println(ce.getReason()); 
      System.out.println("******"); 
      //e.printStackTrace(); 
     } 

    } 

    public static void main(String[] args){ 
     new Client().connectHost(); 
    } 
} 

я получаю следующее исключение после выполнения кода:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: basic constraints check failed: this is not a CA certificate 
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949) 
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302) 
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296) 
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1509) 
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216) 
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979) 
at sun.security.ssl.Handshaker.process_record(Handshaker.java:914) 
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062) 
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) 
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) 
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) 
at com.tutorial.exception.customize.Client.connectHost(Client.java:33) 
at com.tutorial.exception.customize.Client.main(Client.java:82) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 

После анализа журнала я нашел сообщения «clientHello» и «serverHello», но после этого приложения выбрасывает вышеупомянутое исключение.

Что я делаю неправильно? Пожалуйста посоветуй.

Спасибо, Сомнате Гуо

+0

'CertPathValidatorException: основные ограничения Не удалось выполнить проверку: это не CA certificate' звучит как у вас есть CA сертификаты в неправильном месте или поменять местами с некоторыми другой сертификат. –

+0

Я создаю truststore jks, используя сертификаты CA. Нужно ли добавлять сертификат клиента в файл доверия? –

ответ

0

я понял, вопрос после анализа отладки ла.

«BasicConstraints» отсутствовал на сертификатах сервера V3, и поэтому java не смог распознать сертификат как действительный сертификат. Как только это ограничение было добавлено, клиент смог рукопожатие с сервером и возможность общаться с сервером.

BasicConstraints: [ CA: истинный PathLen: 2147483647 ]