实施手动SSL握手

时间:2015-01-15 09:16:15

标签: java android sockets ssl javacard

我需要一些帮助来实现Android智能手机和服务器之间的手动ssl握手。 背景为什么在我的情况下是通信的加密/解密。 Android只是一个代理,它应该没有关于服务器和我的javacard applet之间交换的数据的信息,它只能与android设备通信。

我的第一个想法是在服务器的ssl端口上建立与服务器的连接,就像普通的http :(在android中)

Socket socket = new Socket("google.de", 443);
DataOutputStream os = new DataOutputStream(socket.getOutputStream());
DataInputStream is = new DataInputStream(socket.getInputStream());
// send data for the handshake
os.writeChars("Params for the SSL handshake");
// read the server response
in.read(...)
// answer with the next ssl handshake step
....

然后发送握手信息并等待响应。 这里的问题是,我不知道我将以哪种格式发送参数(如客户端问候:protocolVersion,random,sessionID,cipherSuites,compressMethod)。或者它是否有效?

我检查的另一种方式是

  

javax.net.ssl.SSLSocket中;

它自己进行握手。 例如:

 public static void main(final String[] args) throws Exception {
    final SSLContext sslContext = SSLContext.getInstance("TLSv1");
    sslContext.init(null, null, null);
    // getDefault();
    final SSLSocketFactory fac = sslContext.getSocketFactory();
    final SSLSocket socket = (SSLSocket) fac.createSocket("google.de", 443);

    socket.addHandshakeCompletedListener(new HandshakeCompletedListener() {

        @Override
        public void handshakeCompleted(final HandshakeCompletedEvent event) {
        System.out.println("Cipher:" + event.getCipherSuite());
        }
    });
    final String[] ciphers = fac.getSupportedCipherSuites();
    final String[] protocols = { "TLSv1" };
    final SSLParameters params = new SSLParameters(ciphers, protocols);
    params.setNeedClientAuth(false);
    socket.setSSLParameters(params);
    socket.startHandshake();
 }

在这种情况下,所有相关的安全信息(如秘密交换)等都将在Android上发生...(详细说明:我认为在SSLSocket本身)这完全是我的方式#&# 39;不要!

我希望有可能将握手参数发送给服务器,并可以从服务器捕获响应并将其转发到我的javacard applet。我知道我必须自己稍后处理加密。

我希望我的问题是可以理解的,也是我为什么需要这个问题的背景。否则请给出一个小提示,我会尽力完成这些信息。

提前致谢!

0 个答案:

没有答案