[ https://issues.apache.org/jira/browse/QPID-4636?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13602477#comment-13602477 ]
Robbie Gemmell commented on QPID-4636: -------------------------------------- Hi Michal, Thanks for the update. We applied the new patches and ran the tests, which all passed except a couple of the Broker REST tests. I fixed those up and have now committed the patches to trunk: http://svn.apache.org/viewvc?view=revision&revision=1456554 http://svn.apache.org/viewvc?view=revision&revision=1456555 http://svn.apache.org/viewvc?view=revision&revision=1456556 I think adding the untrusted cert in its own store (e.g java_untrusted_cert_store.jks) in order to do the unit test is the way to go. We should really have more tests in future requiring such a cert, so adding it seems a better idea than trying to generate one each time within the test. I'm not sure why you were seeing issues running ExternalAuthenticationTest, we tried it on a couple of machines with your new patches and had no issue. If you can, try again with the updated trunk and a clean build ('ant clean' in the java directory wipes out the entire existing build) and see if you are still having an issue, then attach the test output (java/build/results/systests/*ExternalAuthenticationTest* ) if you are and we will take a closer look. Thanks, Robbie > SSL Client Authentication in Java broker > ---------------------------------------- > > Key: QPID-4636 > URL: https://issues.apache.org/jira/browse/QPID-4636 > Project: Qpid > Issue Type: New Feature > Components: Java Broker, Java Common > Affects Versions: 0.21 > Reporter: Michal Zerola > Assignee: Robbie Gemmell > Priority: Minor > Attachments: java_broker_peerstore.jks, ssl_new_trustmanager.patch, > ssl_new_trustmanager_test.patch > > > *Motivation:* > The C++ broker implementation is based on the NSS library from Mozilla. The > user creates a certificate database and configures the broker to load the > database at start-up. The NSS certificate database can store the private > keys used by the broker as well as the public keys related to the connecting > clients. The public keys can be divided into several groups - the keys of > trusted CAs and the keys of trusted peers. The difference between the trusted > CA and trusted peer is that the trusted CA allows logging in even to clients > who have a certificate signed by the CA, while the peers allow logging in > only to clients who have the certificate exactly matching the certificate > loaded in the certificate database. > The SSL Client Authentication in the Java broker is based on the Java JSSE > implementation. The certificates are stored in the JKS format. The JKS format > doesn't distinguish between trusted peers and trusted CA. Therefore all > public keys behave as trusted CAs. As a result, the current implementation > cannot be used together with self signed certificates. As we found out, there > seems to be no support for the trusted peers in the JKS truststores. > *Proposed solution:* > The current configuration for the SSL Client Authentication supports only one > truststore . We can add a second configuration entry which would allow to > specify "peerstore" . When creating the SSL context, the existing truststore > would be handled as it is handled today. If the "peerstore" is specified, the > new TrustManager will be added to the SSL context. The custom TrustManager > will use the peerstore to verify the peers only as peers. The client will > pass the authentication if it is authenticated either with the original > Trustmanager against the keystore or by the custom trust manager against the > peer store. > *Configuration and patch explanation:* > The current configuration model for the broker (trunk) is based on JSON. We > have added two optional attributes (peerStorePath, peerStorePassword): > {quote} > … > "keyStorePath": "...", > "keyStorePassword": "123456", > "trustStorePath": "...", > "trustStorePassword": "123456", > {color:red} > "peerStorePath": "...", > "peerStorePassword": "123456", > {color} > … > {quote} > Internally, the broker is prepared to handle multiple truststores, since it > can store them in the collection. If the above new attributes were specified, > the additional truststore is added into the collection (BrokerAdapter.java). > A new truststore will have optional flag TrustStore.PEERS_ONLY set to True. > The SSLContextFactory was extended for collection configuration. The Broker > creates the SSLContext using the collection of truststores (either only > single truststore or with a new peerstore). The SSLFactory parses the > collection and depending on the TrustStore.PEERS_ONLY flag creates either > regular JSSE trustmanager or uses a newly introduced one > QpidPeersOnlyTrustManager. > The new QpidPeersOnlyTrustManager works as a wrapper around standard JSSE > trustmanager. When client connects, the check is delegated to the underlying > JSSE verification and if it succeeds, the additional check is done, whether > the peer’s certificate (in the chain index 0) is present in the keystore > file. Only then the client is authenticated, otherwise the > CertificateException is thrown. > Since SSLContext.init method from the array of trustmanagers uses only the > first one which is an instance of the X509TrustManager class, we have created > also the extension. Otherwise, it would not be possible to use simultaneously > trustmanager (JSSE implementation) and peermanager (our new implementation) > because both implements X509TrustManager and only the first from the array > would be considered. Therefore, we have introduced the > QpidMultipleTrustManager which is doing nothing else but delegating the check > to its underlying X509TrustManagers and only if all fails, the check itself > fails. If some underlying manager succeeds, the check itself succeeds as > well. This QpidMultipleTrustManager is loaded with truststore and peerstore > manager and added into the array which is further passed to the > SSLContext.init method. > The implementation attached in the patch seems to be working fine and adds > the above requirements for peers only truststore. It is also backwards > compatible- anyone without interest for peerstores will not see any change. -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@qpid.apache.org For additional commands, e-mail: dev-h...@qpid.apache.org