2017-02-21 21 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"; 
    } 
} 
} 

keytoolは

のkeytool -import -aliasクライアント-file client.cer -keystore MyKeystore -storepassディレクトリのmystore

のkeytool -import -alias私のトラストストアを作成するためのコマンドserver-file server.cer -keystore MyKeystore -storepass mystore

また、2つの証明書を私のcacertsキーストアに追加しました。

+0

ここでは、接続に使用するコード、トラストストアの作成、および証明書のインポートのためのコードを記述してください。ところで、必要なサーバーの証明書をインポートしたことはありますか? – 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(); 
    } 
関連する問題