Xpoint
   [напомнить пароль]

Вопрос про установление соединения в SSL

Метки: [без меток]
2006-09-08 16:50:40 [обр] Dryss[досье]

Всех приветствую!

Никак не могу установить соединение с сервером по SSL, при чем админ сервера говорит, что соединение есть, но я не представляю ему сертификатов, поэтому Forbidden...

Вот мой фрагмент keyStore
Keystore type: jks
Keystore provider: SUN

Your keystore contains 3 entries

pub, 08.09.2006, trustedCertEntry,
Certificate fingerprint (MD5): E6:5D:BD:D2:22:84:3D:64:F4:B1:86:CD:FE:D1:66:20
mykey, 08.09.2006, trustedCertEntry,
Certificate fingerprint (MD5): 5F:D7:59:FA:D3:0D:72:A5:6A:B1:0E:C5:D5:04:67:23
rap, 08.09.2006, keyEntry,
Certificate fingerprint (MD5): 23:FC:63:44:E7:DA:5D:28:75:00:EE:35:94:69:AF:94

А вот собственно и сам код, пощщу весь метод...

private void openhttps()
    {
        try {
            
KeyStore kS = KeyStore.getInstance( KeyStore.getDefaultType() );
            FileInputStream fIS = new FileInputStream( ".keystore" ); // Тут усе ок, проверял
            keyStore.load(fIS, "secret".toCharArray());
            
KeyManagerFactory kMF = KeyManagerFactory.getInstance("SunX509");
            keyManagerFactory.init(kS, "secret".toCharArray());
            KeyManager[] kMs = kMF.getKeyManagers();
                        
TrustManagerFactory tMF = TrustManagerFactory.getInstance("SunX509");
            trustManagerFactory.init(kS);
            TrustManager[] tM = tMF.getTrustManagers();
                        
SecureRandom sR = SecureRandom.getInstance("SHA1PRNG", "SUN");

            SSLContext sslContext = SSLContext.getInstance("SSLv3");
            sslContext.init(kMs, tM, sR);
            
javax.net.ssl.SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            SSLSocket sslClientSocket = (SSLSocket) sslSocketFactory.createSocket("hostaddress", 443 );
            sslClientSocket.startHandshake();
            
// Для проверки получаю локальные сертификаты, возвращает null !!!
            java.security.cert.Certificate[] clientCerts = sslClientSocket.getSession().getLocalCertificates();
            // Для проверки получаю peer сертификаты, возвращает 2 штуки !!!
            java.security.cert.Certificate[] serverCerts = sslClientSocket.getSession().getPeerCertificates();
            
BufferedReader br = new BufferedReader( new InputStreamReader(sslClientSocket.getInputStream()));
            BufferedWriter wr = new BufferedWriter( new OutputStreamWriter(sslClientSocket.getOutputStream()));
            
wr.write( "GET something HTTP/1.1\n" );
            wr.write( "Host: hostname\n" );
            wr.write( "Connection: close\n\n" );
            
wr.flush();
            
while( true ) {
                String s = br.readLine();
                if( s.length() == 0 )
                    break;
                TPCon( s );
            }
            br.close();
            wr.close();
        } catch (KeyManagementException ex) {
            ex.printStackTrace();
        } catch (UnrecoverableKeyException ex) {
            ex.printStackTrace();
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        } catch (NoSuchProviderException ex) {
            ex.printStackTrace();
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (KeyStoreException ex) {
            ex.printStackTrace();
        } catch (CertificateException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

Вот такой вот код...

Возвращает Forbidden

P.S. С сертификатами должно быть все ок.
Я сделал private через keytool -genkey -keyalg RSA.
Потом keytool -selfcert...
Потом keytool -certreq... Выслал, подтвердили и прислали в обратку подписанный.
Я его встатвил... keytool -import -alias....
Вставил публичный, открытый

И получилось то, что в самом начале письма....

Вопрос - что не так! :-)

спустя 3 дня [обр] Dryss[досье]

Вобщем не выполняется Certificate verify, хотя сервер дает на это запрос...

Я предположил, что при запуске startHandshake() заново создается TrustManager и он подгружает сертификаты, которые находятся в TrustStore по умолчанию, а именно cacerts... Попробую решить трабл путем установки System.setProperty...

спустя 4 часа 18 минут [обр] Dryss[досье]

... Не помогло )))

В дампе дебагера говорится...

...
Cert Authorities:
<EMAILADDRESS=somemail@somehost.ru, CN=Name Surname, OU=Division, O=Firm Ltd, L=Moscow, ST=Moscow, C=RU>

  • ServerHelloDone
  • Certificate chain

*

  • ClientKeyExchange, RSA PreMasterSecret, TLSv1

...

В пустом * как раз должны передаваться сертификаты, но.. увы ((( Ничего не могу сделать! Помогите, кто знает!?

Powered by POEM™ Engine Copyright © 2002-2005