2017-02-21 1 views
2

서버에 SSL 연결을 설정하려고합니다. Truststore를 만들고 신뢰할 수있는 항목으로 서버 인증서를 가져 왔으며 키 저장소에 가져 왔습니다. 서버 관리자는 인증서를 키 스토어로 가져 왔습니다. 내가 연결을 시도 할 때, 나는이 오류를 얻을 : 서버에서치명적인 경고 (bad_certificate)를 받았음

Received fatal alert: bad_certificate

을, 그들은이 오류가 점점 :

javax.net.ssl.SSLHandshakeException: null cert chain

내가 아마도 잘못된 일을 할 수있는 무엇을? 어떻게 해결합니까 이 오류? 나는이 문제에 대해 오랫동안 싸우고있다.

내 고객 번호

import java.io.*; 
import java.net.*; 
import java.security.*; 


import java.util.Enumeration; 
import javax.net.ssl.*; 

public class SSLConnect { 

public String MakeSSlCall(String meternum) { 
    String message = ""; 
    FileWriter file = null; 
    try { 
     file = new FileWriter("C:\\SSLCERT\\ClientJavalog.txt"); 

    } catch (Exception ee) { 
     message = ee.getMessage(); 

    } 
    //writer = new BufferedWriter(file); 
    try { 
     file.write("KeyStore Generated\r\n"); 
     KeyStore keystore = KeyStore.getInstance("JKS"); 
     keystore.load(new FileInputStream("C:\\SSLCERT\\newclientkeystore"), "client".toCharArray()); 
     file.write("KeyStore Generated\r\n"); 
     Enumeration enumeration = keystore.aliases(); 
     while (enumeration.hasMoreElements()) { 
      String alias = (String) enumeration.nextElement(); 
      file.write("alias name: " + alias + "\r\n"); 
      keystore.getCertificate(alias); 
      file.write(keystore.getCertificate(alias).toString() + "\r\n"); 
     } 
     TrustManagerFactory tmf =TrustManagerFactory.getInstance("SunX509"); 
     tmf.init(keystore); 
     file.write("KeyStore Stored\r\n"); 
     SSLContext context = SSLContext.getInstance("SSL"); 
     TrustManager[] trustManagers = tmf.getTrustManagers(); 
     context.init(null, trustManagers, null); 

     SSLSocketFactory f = context.getSocketFactory(); 
     file.write("About to Connect to Ontech\r\n"); 
     SSLSocket c = (SSLSocket) f.createSocket("192.168.1.16", 4447); 
     file.write("Connection Established to 196.14.30.33 Port: 8462\r\n"); 
     file.write("About to Start Handshake\r\n"); 
     c.startHandshake(); 

     file.write("Handshake Established\r\n"); 
     file.flush(); 
     file.close(); 
     return "Connection Established"; 
    } catch (Exception e) { 
     try { 
      file.write("An Error Occured\r\n"); 
      file.write(e.getMessage() + "\r\n"); 
      file.flush(); 
      file.close(); 
     } catch (Exception eee) { 
      message = eee.getMessage(); 
     } 
     return "Connection Failed"; 
    } 
} 
} 

키 도구

키 도구 -import -alias 클라이언트 - 파일 client.cer -keystore MyKeystore -storepass의 mystore

키 도구 -import -alias 내 신뢰 만들기위한 명령 server-file server.cer -keystore MyKeystore -storepass mystore

또한 cacerts 키 저장소에 두 인증서를 추가했습니다.

+0

신뢰 저장소 생성 및 인증서 가져 오기를 위해 연결에 사용하는 코드를 여기에 작성해야합니다. BTW, 필요한 서버의 인증서를 가져 왔습니까? – Gangnus

+0

@Gangnus 내 인증서를 저장하기 위해 내 코드와 keytool 명령을 추가했습니다. 내가 여기서 잘못하고 있는게 있니? –

+0

귀하의 질문에 대한 가능한 결론을 내리게되었습니다. 코드가없는 질문은 쓸데없는 것으로 간주됩니다. 그리고 당신의 경우에는 정말 그렇게되었습니다. 폐회에 대한 투표가 귀하의 패스트 에디션에 의해 뒷받침 되었기 때문에 기쁩니다. 또한 코드가 실패한 곳을 표시하는 것이 좋습니다. 소켓 생성 또는 핸드 셰이크? 또한 여기에 예외에서 얻은 스택 추적을 넣어야합니다. 그리고 어쩌면 소켓 'c'의 내용, 실패 전후. 당신의 스타일에 관해서는, 미래를 위해서 '파일'대신에 로거를 사용하도록 조언 할 것입니다. 그리고 'c'라는 이름도별로 말하지 않습니다. – Gangnus

답변

0

오래되었지만 비슷한 문제가 발생했습니다. 여기 내 작업 코드는 다음과 같습니다.

Properties systemProps = System.getProperties(); 
    systemProps.put("javax.net.debug","ssl"); 
    systemProps.put("javax.net.ssl.trustStore","<path to trustore>"); 
    systemProps.put("javax.net.ssl.trustStorePassword","password"); 
    System.setProperties(systemProps); 

    SSLContext sslcontext; 
    KeyStore keyStore; 
    final char[] JKS_PASSWORD = "password".toCharArray(); 
    final char[] KEY_PASSWORD = "password".toCharArray(); 

    try { 
     final InputStream is = new FileInputStream("<path_to_keystore.pkcs12>"); 
     keyStore = KeyStore.getInstance("pkcs12"); 
     keyStore.load(is, JKS_PASSWORD); 
     final KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
     kmf.init(keyStore, KEY_PASSWORD); 

     sslcontext=SSLContext.getInstance("TLS"); 
     sslcontext.init(kmf.getKeyManagers(), null, new java.security.SecureRandom()); 
    } catch (Exception ex) { 
     throw new IllegalStateException("Failure initializing default SSL context", ex); 
    } 

    SSLSocketFactory sslsocketfactory = sslcontext.getSocketFactory(); 
    DataOutputStream os = null; 

    try { 
     SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(); 
     sslsocket.connect(new InetSocketAddress(host, port), connectTimeout); 
     sslsocket.startHandshake(); 

     os = new DataOutputStream(sslsocket.getOutputStream()); 
     // log.info("Sending echo packet"); 
     String toSend = "{\"echo\":\"echo\"}"; 
     os.writeBytes(toSend); 
    } catch (UnknownHostException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
관련 문제