TLSv1.2 SSL Chat Java,SSLContext不可用

时间:2013-12-12 21:06:35

标签: java eclipse security ssl

运行我的SSL聊天程序时遇到问题。我在Ubuntu中使用Eclipse。我尝试运行此代码

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

import javax.net.ssl.*;

import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.Principal;
import java.security.cert.*;

public class SSLSocketClient {

    private static String host;

    public static void main(String[] args) {
        String cipher = null;
        String portNo;
                int port = 0;
        boolean mykeystore = false;
        boolean chat = false;

        if (args.length == 5) {

            for (int i = 0; i < args.length; i++) {

                if (args[i].equals("-host")) {
                    host = args[++i];
                    continue;
                }
                if (args[i].equals("-port")) {
                    portNo = args[++i];
                    port = Integer.parseInt(portNo);
                    continue;
                }
                if (args[i].equals("-cipher")) {
                    cipher = args[++i];
                    continue;
                }
                if (args[i].equals("-chat")) {
                    chat = true;
                    continue;
                }

                if (args[i].equals("-mykeystore")) {
                    mykeystore = true;
                    continue;
                }
            }

        }

        else {
            System.out.println("Please check again parameter!");
        }

        if (mykeystore) {
            System.setProperty("javax.net.ssl.trustStore", "mykeystore");
            System.setProperty("javax.net.ssl.trustStorePassword", "kosuke");
        }

        SSLContext sc;
        try {
            sc = SSLContext.getInstance("TLSv1.2");
            sc.init(null, null, null);
            SSLSocketFactory factory = (SSLSocketFactory) sc.getSocketFactory();
        SSLSocket mysslsocket = (SSLSocket) factory.createSocket(host, port);

            if (cipher != null) {
                String[] cipherarray = { cipher };
                mysslsocket.setEnabledCipherSuites(cipherarray);
            }

            SSLSession session= mysslsocket.getSession();

            X509Certificate cert;


            // cert = (X509Certificate) session.getPeerCertificates()[0];

        //  System.out.println(session.getPeerHost() + "has presented a certificate belonging to: ");
            //Principal p=cert.getSubjectDN();




            //if(chat) {
                //BufferedReader in = new BufferedReader( new InputStreamReader(System.in));
                //BufferedWriter out = new BufferedWriter( new OutputStreamWriter( mysslsocket.getOutputStream()));

                //while(true) {
                    //String s= in.readLine();
                        //if (!s.equals("")) {
                            //out.write(s);
                            //out.write(" \r\n ");
                            //out.flush();
                            //if (s.equals(".")) break;
                    //  }
                //}
        //  }

            mysslsocket.startHandshake();
            mysslsocket.close();

        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (KeyManagementException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

当我尝试在终端

中运行参数时
java SSLSocketClient -host localhost -port 11111 -mykeystore

我得到了回应:

java.security.NoSuchAlgorithmException: TLSv1.2 SSLContext not available

    at sun.security.jca.GetInstance.getInstance(GetInstance.java:159)
    at javax.net.ssl.SSLContext.getInstance(SSLContext.java:142)
    at SSLSocketClient.main(SSLSocketClient.java:61)

我不知道我的代码中有什么问题。我已经将密钥库复制到程序源代码但仍然无法正常工作。请帮帮我

由于

1 个答案:

答案 0 :(得分:4)

在Java 7之前,

TLSv1.2未添加到默认JCE提供程序。请参阅Java 6Java 7标准算法名称引用。

如果您坚持使用Java 6或更早版本并且绝对需要TLS 1.2,请尝试使用Bouncy Castle提供程序。