forum.bitel.ru
http://forum.bitel.ru/

Https соединение с сертификатами
http://forum.bitel.ru/viewtopic.php?f=19&t=7867
Страница 1 из 1

Автор:  Akhmat [ 21 мар 2013, 22:28 ]
Заголовок сообщения:  Https соединение с сертификатами

как на джаве установить хттпс соединение и сертификаты прикрепить? Не хватает теоретических знаний тут, т.к. гугла ответов тонну перепробовал, не устанавливается. то сертификаты не находит валидные, то еще что.

на пхп, перле и т.д. все работает без проблем.

Код:
$ch = curl_init('https://someserv.com/page');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSLKEY,  'key.key');
curl_setopt($ch, CURLOPT_SSLCERT, 'cert.crt');
//curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'password');
$data = curl_exec($ch);
print curl_error($ch) ;
curl_close($ch);

работает норм. хочу тоже самое на джава.

что нарыл в инете
Код:
public class JavaHttpsExample
{
  public static void main(String[] args)
  throws Exception
  {
    String httpsURL = "'https://someserv.com/page'";
//   System.setProperty("javax.net.ssl.trustStore","server.jks");
    URL myurl = new URL(httpsURL);
    HttpsURLConnection con = (HttpsURLConnection)myurl.openConnection();
   SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
   con.setSSLSocketFactory(sslsocketfactory);   
//   con.setSSLSocketFactory(getSSLContext(new File("digbank.p12"), "d1gkfldit").getSocketFactory());
    InputStream ins = con.getInputStream();
    InputStreamReader isr = new InputStreamReader(ins);
    BufferedReader in = new BufferedReader(isr);

    String inputLine;

    while ((inputLine = in.readLine()) != null)
    {
      System.out.println(inputLine);
    }

    in.close();
  }

   public static SSLContext getSSLContext(File jksFile, String jksPwd) throws Exception {

      // Constructing KeyStore from file with password
      KeyStore trustStore = KeyStore.getInstance("pkcs12");
      FileInputStream in = new FileInputStream(jksFile);
      trustStore.load(in, jksPwd.toCharArray());
      in.close();

      // Initializing the keystore
      KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
      kmf.init(trustStore, jksPwd.toCharArray());

      // Initializing the trustore
      TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
      tmf.init(trustStore);

      // Here comes the context
      SSLContext sslContext = SSLContext.getInstance("SSL");
      sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

      return sslContext;
   }
}


и снаружи передаю в параметрах эти кейстор, трастстор, и изнутри программы. все равно ошибки.
запускаю с параметрами
Код:
java -Djavax.net.ssl.keyStoreType=pkcs12 -Djavax.net.ssl.trustStoreType=jks -Djavax.net.ssl.keyStore=digbank.p12 -Djavax.net.ssl.trustStore=digb.jks -Djavax.net.debug=ssl -Djavax.net.ssl.keyStorePassword=d1gkfldit -Djavax.net.ssl.trustStorePassword=123456 JavaHttpsExample

разные варианты пробую, в основном ошибка
Код:
Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
        at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
        at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
        at JavaHttpsExample.main(JavaHttpsExample.java:24)
Caused by: sun.security.validator.ValidatorException: No trusted certificate found
        at sun.security.validator.SimpleValidator.buildTrustedChain(Unknown Source)
        at sun.security.validator.SimpleValidator.engineValidate(Unknown Source)
        at sun.security.validator.Validator.validate(Unknown Source)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(Unknown Source)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
        ... 13 more

Автор:  Akhmat [ 21 мар 2013, 22:31 ]
Заголовок сообщения:  Re: Https соединение с сертификатами

Или поделитесь рабочим кодом на джава, чтобы хттпс соединение устанавливалось с сертификатом.

Автор:  skn [ 22 мар 2013, 00:02 ]
Заголовок сообщения:  Re: Https соединение с сертификатами

утилитой jcontrol из /jdk/bin закладка security, кнопка Certificates
импортнуть нужный сертификат в доверенные
утилиту надо запускать под тем пользователем под которым будет потом запускться java приложение

Автор:  snark [ 22 мар 2013, 04:46 ]
Заголовок сообщения:  Re: Https соединение с сертификатами

skn писал(а):
закладка security, кнопка Certificates

Походу речь идет о динкоде на сервере без закладок, кнопок и прочих GUI.

Автор:  Akhmat [ 22 мар 2013, 15:33 ]
Заголовок сообщения:  Re: Https соединение с сертификатами

Добавил сертификат туда. он самоподписанный.
ошибка
Код:
java -Djavax.net.debug=ssl JavaHttpsExample >out
Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.securit
y.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
        at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
        at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
        at JavaHttpsExample.main(JavaHttpsExample.java:24)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unab
le to find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
        at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
        at sun.security.validator.Validator.validate(Unknown Source)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(Unknown Source)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
        ... 13 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
        at java.security.cert.CertPathBuilder.build(Unknown Source)
        ... 19 more

Вот дебаг ссл
Код:
...


Не понимаю как дебагить. в чем проблема, в сертификате или в джаве.

Автор:  skn [ 22 мар 2013, 21:07 ]
Заголовок сообщения:  Re: Https соединение с сертификатами

вот кусок кода, может на что то наведет...

Код:
         TrustManager manager = (new X509TrustManager()
         {
            public void checkClientTrusted(X509Certificate[] arg0, String arg1)
                  throws CertificateException
            {

            }

            public void checkServerTrusted(X509Certificate[] arg0, String arg1)
                  throws CertificateException
            {

            }

            public X509Certificate[] getAcceptedIssuers()
            {
               return null;
            }
         });

         SSLContext context = SSLContext.getInstance( "SSL" );

         KeyStore ks = KeyStore.getInstance( ksType );
         ks.load( new BufferedInputStream( new FileInputStream( ksFile ) ), ksPass.toCharArray() );

         KeyManagerFactory kmf = KeyManagerFactory.getInstance( "SunX509", "SunJSSE" );
         kmf.init( ks, keyPass.toCharArray() );

         TrustManagerFactory tmf = TrustManagerFactory.getInstance( "SunX509", "SunJSSE" );
         tmf.init( ks );

         context.init( kmf.getKeyManagers(), new TrustManager[]
         { manager }, null );

         SSLSocketFactory factory = (SSLSocketFactory)context.getSocketFactory();

         URL ur = new URL( url );

         HttpsURLConnection con = (HttpsURLConnection)ur.openConnection();

Автор:  Akhmat [ 25 мар 2013, 15:05 ]
Заголовок сообщения:  Re: Https соединение с сертификатами

охохо, заработало!!! я не верю. ты спас мне жизнь

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/