Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > SSL соединение в J2ME


Автор: HugeX 9.6.2010, 11:37
Всем добрый день!
Мне необходимо подключиться к серверу по SSL с телефона. Остановился я на том, что не могу загрузить доверенные сертификаты из InputStream.
Кто знает, помогите, пожалуйста. Ниже привожу пример своего кода:
Код

                    StreamConnection sc = (StreamConnection) Connector.open("socket://localhost:9090");

                    CertStore cs = new CertStore() {
                        public X509Certificate[] getCertificates(String string) {
                            X509Certificate[] certs = new X509Certificate[1];
                            InputStream is = this.getClass().getResourceAsStream("/trustStore.jks");
                            //???
                            return certs;
                        }
                    };

                    SSLStreamConnection.setTrustedCertStore(cs);
                    SSLStreamConnection sslsc = new SSLStreamConnection("localhost", 9090, sc.openInputStream(), sc.openOutputStream());
                    sc.close();

                    InputStream is = sslsc.openInputStream();
                    OutputStream os = sslsc.openOutputStream();

                    os.write(("Hello!").getBytes());

                    is.close();
                    os.close();
                    sslsc.close();

Автор: W0LF 9.6.2010, 13:08
http://java.sun.com/javame/reference/apis/jsr118/javax/microedition/io/SecureConnection.html

Автор: HugeX 9.6.2010, 15:04
Это не выход, все равно надо указать, какие сертификаты использовать.

Автор: ivanovpv 9.6.2010, 16:17
А где у вас сидит файл "trustStore.jks"? Можно увидеть подробно?

Автор: HugeX 9.6.2010, 17:16
Лежит он в корне jar'a, но вопрос ведь не в этом, так как InputStream я для него получаю, как для ресурса.

Автор: HugeX 10.6.2010, 09:55
Все оказалось довольно просто smile Ниже приведена окончательная версия создания объекта класса CertStore, файл terminal.cer в формате DER или PEM:
Код

                    CertStore cs = new CertStore() {
                        public X509Certificate[] getCertificates(String string) {
                            try {
                                X509Certificate[] certs = new X509Certificate[1];
                                InputStream is = this.getClass().getResourceAsStream("/terminal.cer");
                                byte[] data = new byte[is.available()];
                                is.read(data);
                                certs[0] = X509Certificate.generateCertificate(data, 0, data.length);
                                return certs;
                            } catch (Exception ex) {
                                ex.printStackTrace();
                                return null;
                            }
                        }
                    };

Автор: Dummy 10.6.2010, 12:27
HugeX, у вас что за платформа? Хилые MIDP-телефоны в принципе не знают таких вещей, как CertStore и X509Certificate. На Blackberry тоже не похоже.

Автор: HugeX 11.6.2010, 10:26
Платформа MIDP-2.0, но сейчас уже подумываю переписать под MIDP-1.0. На данный момент есть это:
Код

                    StreamConnection sc = (StreamConnection) Connector.open("socket://77.120.121.228:9090");
                    KeyStore cs = new KeyStore() {
                        public Enumeration aliases() {
                            throw new UnsupportedOperationException("Not supported yet.");
                        }

                        public Certificate getCertificate(String string) {
                            try {
                                InputStream is = this.getClass().getResourceAsStream("/terminal.cer");
                                byte[] data = new byte[is.available()];
                                is.read(data);
                                return X509Certificate.generateCertificate(data, 0, data.length);
                            } catch (Exception ex) {
                                ex.printStackTrace();
                                return null;
                            }
                        }

                        public boolean containsAlias(String string) {
                            throw new UnsupportedOperationException("Not supported yet.");
                        }

                        public int size() {
                            throw new UnsupportedOperationException("Not supported yet.");
                        }

                        public String getType() {
                            throw new UnsupportedOperationException("Not supported yet.");
                        }
                    };

                    SSLStreamConnection.setTrustedKeyStore(cs);
                    SSLStreamConnection sslsc = new SSLStreamConnection("77.120.121.228", 9090, sc.openInputStream(), sc.openOutputStream());
                    sc.close();

                    InputStream is = sslsc.openInputStream();
                    OutputStream os = sslsc.openOutputStream();

                    os.write(("Hello!").getBytes());

                    is.close();
                    os.close();
                    sslsc.close();

Использую классы com.sun.ksecurity.Certificate и com.sun.ksecurity.KeyStore, но, к сожалению, вываливает Exception NoClassDefFound для KeyStore :(

Автор: Dummy 11.6.2010, 13:00
Если под MIDP, то, я боюсь, классы com.sun.* не наш метод. Если это, конечно, не какая-нибудь pure-java реализация SSL.

Автор: MjavTheGray 23.11.2012, 19:49
И вот прошли годы и годы с последнего поста в эту тему... Кто-то живой их тех, кто ещё остался здесь?...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)