> On Tuesday, January 29, 2013 10:12 PM danap wrote:
>> Hari Babu wrote:
>>> On Monday, January 28, 2013 10:20 PM, Dave Cramer wrote:
>>>
>>>   >>On Mon, Jan 28, 2013 at 9:03 AM, Hari Babu<haribabu.ko...@huawei.com
>>> <mailto:haribabu.ko...@huawei.com>>  wrote:
>>>
>>>   >>While testing PostgreSQL JDBC java client to connect to the PG 9.2.1
>>>   >>database server using SSL.
>>>   >>we got the following behavior.
>>>   >>
>>>   >>The test steps as below:
>>>   >>
>>>   >>url = "jdbc:postgresql://" + "10.145.98.227" + ':'
>>>   >>  + "8707" + '/'
>>>   >>  + "POSTGRES";
>>>   >>  Properties props = new Properties();
>>>   >>  props.setProperty("user", "CLIENT");
>>>   >>  props.setProperty("password", "1234@QWER");
>>>   >>  props.setProperty("ssl", "true");
>>>   >>
>>>   >>  System.setProperty("javax.net.ssl.trustStore", "193store");
>>>   >>  System.setProperty("javax.net.ssl.keyStore", "193client.jks");
>>>   >>  System.setProperty("javax.net.ssl.trustStorePassword", "qwerty");
>>>   >>  System.setProperty("javax.net.ssl.keyStorePassword", "qwerty");
>>>   >>
>>>   >>  /*Begin the first ssl connection*/
>>>   >>  conn1 = DriverManager.getConnection(url, props);
>>>   >>  System.out.println("Connection1 successful!");
>>>   >>
>>>   >>
>>>   >>  System.setProperty("javax.net.ssl.trustStore", "193store");
>>>   >>  System.setProperty("javax.net.ssl.keyStore", "193client.jks");
>>>   >>  System.setProperty("javax.net.ssl.trustStorePassword", "qwerty");
>>>   >>  System.setProperty("javax.net.ssl.keyStorePassword", "wrongpassword");
>>>   >>
>>>   >>  /*Begin the second ssl connection*/
>>>   >>  conn2 = DriverManager.getConnection(url, props);
>>>   >>  System.out.println("Connection2 successful!");
>>>   >>
>>>   >>Before first connection we set
>>>   >>"System.setProperty("javax.net.ssl.keyStorePassword", "qwerty");"
>>> qwerty is
>>>   >>the right password
>>>   >>and before second SSL connection we set
>>>   >>"System.setProperty("javax.net.ssl.keyStorePassword", "wrongpassword");"
>>>   >>wrongpassword is the wrong password.
>>>   >>
>>>   >>we expect the first SSL connection will be successful and second failed
>>>   >>because of wrong password, but actually we get two successful SSL
>>>   >>connections.
>>>   >>We found that if the first SSL connections password set right, all the
>>>   >>following SSL connections are fine ,even set wrong keystroke password.
>>>   >>
>>>   >>1. Is this a defect about JDBC?
>>>   >>2. Is it SSL behavior to authenticate only once?
>>>   >>3. Is it system property behavior can be set only once.
>>>   >>4. Is it because of any other problems?
>>>   >>
>>>   >>please give your suggestions?
>>>
>>>   >JDBC uses java's SSL infrastructure, as such I don't think it's a
>>> defect in JDBC. It could be because your truststore>does not require a
>>> password.
>>>
>>> I removed the trustStorePassword setting from the test, still the second
>>> connection is getting success with the wrong
>>>
>>> keyStorePassword.
>
>> Can you please set the property logLevel=1, INFO
>> and then reply back with the output. You may also
>> try logLevel=2, DEBUG for additional information.
>
> How to set logLevel=1 INFO and logLevel =2 DEBUG. Is it is JDBC logging or 
> something else?
>
> We tried to get the SSL specific log by setting the system property for 
> javax.net.debug as
> "ssl" (system.setProperty("javax.net.debug", "ssl"). With this we got 
> connection logs for each of the connection which are attached in the mail.
>
> For the first connection, it is opening the keys file and then does init for 
> keyStore and trustStore. But incase of second connection it just uses the 
> previous cached session and does not open any of the file set in the 
> property. So may be that is the reason even if wrong file or password is 
> given before second connection, connection is successful.
>
>  From the logs we feel that SSL caching may be causing the problem.
> Is there any exposed JSSE interface function to disable SSL session caching?
> If you can derive something from the attached logs, please let us know.
>
> How to set the SSL property "sslfactory" from application with some valid 
> class?
> Our idea is that JDBC convert function execution goes to the else part of
> "if (classname == null)".
>
> The code snippet is attached:
>
>         String classname = info.getProperty("sslfactory");
>        if (classname == null)
>          {
>            //If sslmode is set, use the libp compatible factory
>            if (sslmode!=null)
>            {
>              factory = new LibPQFactory(info);
>            }
>            else
>            {
>              factory = (SSLSocketFactory)SSLSocketFactory.getDefault();
>            }
>          }
>          else
>          {
>              try
>              {
>                  factory = (SSLSocketFactory)instantiate(classname, info, 
> true, info.getProperty("sslfactoryarg"));
>              }
>              catch (Exception e)
>              {
>                  throw new PSQLException(GT.tr("The SSLSocketFactory class 
> provided {0} could not be instantiated.", classname), 
> PSQLState.CONNECTION_FAILURE, e);
>              }
>          }
>
> Regards,
> Hari babu.

>Hello Hari,

>I thought at first setting props.setProperty("loglevel", "1") may derive
>additional information. It will not in this case. I already suspected and
>believe that the System property is not changing, cached as you indicated.

>Please try this first to see if System Properties can be uncached, changed
>between the two connections.

>danap.

>url = "jdbc:postgresql://" + host + "/" + database;
>Properties props = new Properties();
>props.setProperty("user", username);
>props.setProperty("password", password);
>props.setProperty("loglevel", "1");

>Properties systemProperties = System.getProperties();
>systemProperties.setProperty("javax.net.ssl.trustStore", "193store");
>systemProperties.setProperty("javax.net.ssl.keyStore", "193client.jks");
>systemProperties.setProperty("javax.net.ssl.trustStorePassword", "qwerty");
>systemProperties.setProperty("javax.net.ssl.keyStorePassword", "qwerty");

>System.setProperties(systemProperties);
>System.out.println(System.getProperty("javax.net.ssl.keyStorePassword"));

/*Begin the first ssl connection*/
>conn1 = DriverManager.getConnection(url, props);
>System.out.println("Connection1 successful!");

>System.setProperties(null);
>System.out.println(System.getProperty("javax.net.ssl.keyStorePassword"));

>systemProperties.setProperty("javax.net.ssl.keyStorePassword", "wrongqwerty");
>System.setProperties(systemProperties);
>System.out.println(System.getProperty("javax.net.ssl.keyStorePassword"));

>/*Begin the second ssl connection*/
>conn2 = DriverManager.getConnection(url, props);
>System.out.println("Connection2 successful!");

We tried the approach as suggested by you but still it is not working as shown 
in the below log (I had enabled logLevel as 1)
keystore passowrd is qwerty 
19:26:22.666 (1) PostgreSQL 9.2 JDBC4 (build 1002) 
19:26:23.451 (1) Receive Buffer Size is 43808 
19:26:23.452 (1) Send Buffer Size is 25386 
getConnection returning 
driver[className=org.postgresql.Driver,org.postgresql.Driver@3f7fa65e] 
Connection1 successful! Conn1:org.postgresql.jdbc4.Jdbc4Connection@6baa9f99 
null 
wrongqwerty 
DriverManager.getConnection("jdbc:postgresql://127.0.0.1:15432/postgres") 
    trying 
driver[className=sun.jdbc.odbc.JdbcOdbcDriver,sun.jdbc.odbc.JdbcOdbcDriver@3597a37c]
 
*Driver.connect (jdbc:postgresql://127.0.0.1:15432/postgres) 
    trying 
driver[className=org.postgresql.Driver,org.postgresql.Driver@3f7fa65e] 
19:26:23.835 (2) PostgreSQL 9.2 JDBC4 (build 1002) 
19:26:23.847 (2) Receive Buffer Size is 43808 
19:26:23.848 (2) Send Buffer Size is 25386 
getConnection returning 
driver[className=org.postgresql.Driver,org.postgresql.Driver@3f7fa65e] 
Connection2 successful! Conn2:org.postgresql.jdbc4.Jdbc4Connection@2e958bb8 

Connect OK

There is function as SSL_CTX_SETSESSIONCACHEMODE(ctxt, mode) in C library of 
SSL.
Can you please let us  know if there is some similar function in JSSE also.

Regards,
Hari Babu.








-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

Reply via email to