connect J2ME application to https with self-signed certificate

自作多情 提交于 2019-12-11 02:07:24

问题


I know this question was asked before. but i really don't know how to do this.

I created a j2me app and a webservice in a tomcat server, it works perfect on HTTP, Now i need to connect to HTTPS/TLS.

To do that i followed this steps:

  1. using KeyTool i generate a .keystore file in the server–side.
  2. i run HTTPS correctly in tomcat (in web browser).
  3. i took the .keystore and i import it to my WTK keys stores. by using Mekeytool.

When i try to connect to my https://server-ip/webservice, using this snippet of code:

public class HttpsMIDlet extends MIDlet implements CommandListener, Runnable {
private Display mDisplay;
private Form mForm;

public void startApp() {
    mDisplay = Display.getDisplay(this);

    if (mForm == null) {
        mForm = new Form("HttpsMIDlet");

        mForm.addCommand(new Command("Exit", Command.EXIT, 0));
        mForm.addCommand(new Command("Send", Command.SCREEN, 0));
        mForm.setCommandListener(this);
    }

    mDisplay.setCurrent(mForm);
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}

public void commandAction(Command c, Displayable s) {
    if (c.getCommandType() == Command.EXIT)
        notifyDestroyed();
    else {
        Form waitForm = new Form("Connecting...");
        mDisplay.setCurrent(waitForm);
        Thread t = new Thread(this);
        t.start();
    }
}

public void run() {
    String url = "https://server-ip/webserive";

    try {
        // Query the server and retrieve the response.
        HttpsConnection hc = (HttpsConnection) Connector.open(url);

        SecurityInfo si = hc.getSecurityInfo();
        Certificate c = si.getServerCertificate();
        String subject = c.getSubject();
        System.out.println();

        String s = "Server certificate subject: \n" + subject;
        Alert a = new Alert("Result", s, null, null);
        a.setTimeout(Alert.FOREVER);
        mDisplay.setCurrent(a, mForm);

        hc.close();
    } catch (IOException ioe) {
        Alert a = new Alert("Exception", ioe.toString(), null, null);
        System.out.println(ioe.toString());
        a.setTimeout(Alert.FOREVER);
        mDisplay.setCurrent(a, mForm);
    }
}

It throws this Exception:

java.io.IOException: Bad record type (21) or version (3.3)
at com.sun.midp.ssl.Record.rdRec(+284)
at com.sun.midp.ssl.Record.rdRec(+5)
at com.sun.midp.ssl.Handshake.getNextMsg(+17)
at com.sun.midp.ssl.Handshake.rcvSrvrHello(+5)
at com.sun.midp.ssl.Handshake.doHandShake(+29)
at com.sun.midp.ssl.SSLStreamConnection.<init>(+173)
at com.sun.midp.ssl.SSLStreamConnection.<init>(+12)
at com.sun.midp.io.j2me.https.Protocol.connect(+214)
at com.sun.midp.io.j2me.http.Protocol.streamConnect(+57)
at com.sun.midp.io.j2me.http.Protocol.startRequest(+12)
at com.sun.midp.io.j2me.http.Protocol.sendRequest(+38)
at com.sun.midp.io.j2me.http.Protocol.sendRequest(+6)
at com.sun.midp.io.j2me.http.Protocol.openInputStream(+9)

Some help please. thank you.


回答1:


By doing search for more than 15 days, this Exception issue solved by installing an old versions for both tomcat and JDK.

This may be occurred in differentiation of the WTK and tomcat/JDK versions, which handle the HTTPS/SSL connection.

  1. for tomcat 1.5
  2. for java version JKD 1.5_0_u7

I hope this may help others.



来源:https://stackoverflow.com/questions/31318651/connect-j2me-application-to-https-with-self-signed-certificate

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!