使用自签名证书将J2ME应用程序连接到https

时间:2015-07-09 13:16:45

标签: java tomcat java-me midp

我知道之前曾问过这个问题。但我真的不知道该怎么做。

我在tomcat服务器上创建了一个j2me应用程序和一个web服务,它在HTTP上工作得很好,现在我需要连接到HTTPS / TLS。

要做到这一点,我按照以下步骤操作:

  1. 使用KeyTool我在服务器端生成.keystore文件。
  2. 我在tomcat中正确运行HTTPS(在网络浏览器中)。
  3. 我拿了.keystore,然后把它导入我的WTK钥匙商店。使用Mekeytool。
  4. 当我尝试连接到我的https://server-ip/webservice时,请使用以下代码段:

    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);
        }
    }
    

    它抛出此异常:

    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)
    

    请帮忙。谢谢。

1 个答案:

答案 0 :(得分:0)

通过搜索超过15天,通过为tomcat和JDK安装旧版本解决了此异常问题。

这可能发生在WTK和tomcat / JDK版本的区别中,这些版本处理HTTPS / SSL连接。

  1. for tomcat 1.5
  2. for java version JKD 1.5_0_u7
  3. 我希望这可以帮助别人。