手工ssl握手的java实现

zphenhs4  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(238)

我需要一些帮助来实现android智能手机和服务器之间的手动ssl握手。在我的例子中,背景为什么是通信的加密/解密。android只是一个代理,它不应该知道服务器和javacard applet之间交换了什么数据,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
....

然后发送握手信息并等待响应。这里的问题是,我不知道必须以哪种格式发送参数(比如客户机hello:protocolversion、random、sessionid、ciphersuites、compressionmethod)。或者它会不会起作用?
我检查的另一个方法是
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本身我认为)这正是我不想要的方式!
我想有可能发送我自己的握手参数到服务器,可以捕捉到服务器的响应,并将其转发到我的javacard applet。我知道以后我得自己处理加密。
我希望我的问题是可以理解的和背景为什么我需要这个了。否则请给一个小提示,我会尽我所能完成的信息。
提前谢谢!

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题