Avatar
mc
Člen
Avatar
mc:

Zdravím, chtěl bych se zeptat jestli tu někdo nepracuje v Javě s webovýma službama. Mám vygenerovány třídy pomocí WSDL a snažím se přistupovat k dané službě. Ta je dostupná přes HTTPS takže musím dodat certifikát a v tom je problém. Vůbec nemám tušení jak na to. Najde se někdo kdo by mi pomohl? Díky

 
Odpovědět 10.9.2013 10:48
Avatar
Silvinios
Redaktor
Avatar
Silvinios:

Jaký framework pro webové služby používáš?

 
Nahoru Odpovědět 10.9.2013 21:07
Avatar
mc
Člen
Avatar
Odpovídá na Silvinios
mc:

Vytvářím klienta pro přístup ke službě. Popravdě nemám moc tušení jak to udělat. Můžeš mi prosím nastínit nějaké řešení. Moméntálně jsem zkusil vygenerovat pomocí wsimport třídy pro přístup k službám a přidal ty certifikáty do cacerts. Ale program mi padá s javax.net.ssl­.SSLHandshake­Exception :/

 
Nahoru Odpovědět 10.9.2013 21:44
Avatar
Silvinios
Redaktor
Avatar
Silvinios:

How to dynamically select a certificate alias when invoking web services
http://alesaudate.wordpress.com/…eb-services/

 
Nahoru Odpovědět 10.9.2013 22:28
Avatar
mc
Člen
Avatar
Odpovídá na Silvinios
mc:

Díky moc pročtu si to :) Snad mě to nakopne správným směrem.

 
Nahoru Odpovědět 11.9.2013 7:10
Avatar
mc
Člen
Avatar
mc:

Nemůžeš mi prosím Tě nějak popsat jak postupovat zhruba postupovat. Možná v tom hledám nějaký složitosti ale nemůžu s tím pohnout.
Mám vytvořenej klasickej JavaProject, v něm mám přidanej balíček tříd vygenerovanej wsimport-em z WSDL pak tam mám jinej balíček ve kterém je třída obsahující main. V tom volám službu. Certifikáty mám vloženy do keystoru a truststore. Zkoušel jsem je nastavit v programu takhle

System.setProperty("javax.net.ssl.keyStore", "<cesta>");
                System.setProperty("javax.net.ssl.keyStorePassword", "password");
                System.setProperty("javax.net.ssl.trustStore", "<cesta>");
                System.setProperty("javax.net.ssl.keyStoreType", "JKS");

Když to spustím tak to dopadne takhle: http://pastebin.com/g2sDTy9S

 
Nahoru Odpovědět 11.9.2013 7:53
Avatar
goddard
Člen
Avatar
Odpovídá na mc
goddard:

Mas ten stejny certifikat u klienta i na serveru?

 
Nahoru Odpovědět 11.9.2013 9:10
Avatar
mc
Člen
Avatar
mc:

Já využívám komerční server jedné instituce. Certifikát byl přiložen k "dokumentaci" která je dost nedostatečná.

 
Nahoru Odpovědět 11.9.2013 9:24
Avatar
goddard
Člen
Avatar
goddard:

Kdyz se pripojis k tomu serveru, treba skrz prohlizec tak te by se ti ten certifikat mel stahnout. Tak ho pak muzes porovnat s tim v dokumentaci kde muze byt klidne i zastaralej a muze byt potreba ho obnovit.

 
Nahoru Odpovědět 11.9.2013 9:51
Avatar
mc
Člen
Avatar
mc:

Když jsem zkusil nahrát do IE ten poskytovaný certifikát tak ho ta služba přijala. Pravděpodobně bude chyba někde v získávání certifikátu z keystore..:/ Už jsem z toho celej jalovej. Poslední 2 dny nad tím sedím a nemůžu přijít na to kde přesně je problém.

Editováno 11.9.2013 20:10
 
Nahoru Odpovědět 11.9.2013 20:09
Avatar
Silvinios
Redaktor
Avatar
Odpovídá na mc
Silvinios:

Myslím, že chyba nesouvisí s JAX-WS ale SSL/TLS obecně.

Vyžaduje server autentizaci klienta?
Pokud ne, stačí do trust store přidat certifikáty vydavatelů certifikátu serveru (certificate chain).

Další možností je implementovat vlastní trust manager (viz příklad):

package demo;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class HTTPSDemo {

    public static void main(String[] args) throws Exception {
        String url = "https://www.seznam.cz/";

        TrustManager[] trustAllCerts = new TrustManager[] { new DummyTrustManager() };
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());

        InputStream in = new URL(url).openStream();
        while (in.read() != -1) {
        }
        in.close();
    }

    /**
     * Accepts all certificates. Stores server certificates to files. For demo
     * purposes only!
     */
    private static class DummyTrustManager implements X509TrustManager {

        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }

        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            System.out.println("Server certificate chain:");
            for (int i = 0; i < chain.length; i++) {
                X509Certificate certificate = chain[i];
                System.out.println(i + ": " + certificate.getSubjectX500Principal().getName());
                try {
                    FileOutputStream out = new FileOutputStream("cert" + i + ".cer");
                    out.write(certificate.getEncoded());
                    out.close();
                } catch (IOException e) {
                    throw new CertificateException("Could not save certificate", e);
                }
            }
        }

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }

    }

}
 
Nahoru Odpovědět 11.9.2013 20:13
Avatar
mc
Člen
Avatar
mc:

Děkuji za odpověď nakonec se ukázalo že chyba byla v tom že mi chyběl certifikát ověřující autenticitu serveru v keystore.

 
Nahoru Odpovědět 16.9.2013 14:37
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.