On Jul 12, 2005, at 1:14 AM, Kresten Krab Thorup wrote:

Here are some notes on SSL configuration from IIOP/CSIv2 point of view. This is not API, just what a such API need to do. The Trifork ORB (note: Trifork is with just one capital letter) includes some code to do this, but it would make sense to integrate this into ActiveIO to make it more widely applicable.

For SSL we need a more elaborate configuration scheme. These requirements are driven directly off the J2EE CSIv2 interop specifications. In essence, we need to be able to specify these things on a per-bean level; which is probably best to do by a level of indirection, by having "named server socket configuration"s that can be referenced symbolically from the container-specific deployment descriptors.

We do something sort of like this (tss-link) in openejb today, although there are architectural problems with the current implementation.

For an SSL ServerSocket we need

    protocols=(SSL),(TLS)
    ciphers=<ALGORITHM,...>
    hashes=<ALGORITHM,...>
    keyexchanges=<ALGORITHM,...>
    requireTrustClient=REQUIRE|SUPPORT|NONE
    requireTrustServer=REQUIRE|SUPPORT|NONE

For both cipers, hashes and keyexchangees, the list can include the NULL algorithm.

These properties are used to select which cipher suites should be enabled for a given socket (the idea is to simply subset the "available cipher suites" on the active SSL provider). Cipher suites are named like this:

    (TLS|SSL)_<KEYEXCHANGE>_WITH_<CIPHER>_<HASH>

If there is a key exchange mechanism (other than anonymous Diffie-Hellman "DH_anon"), then the SSL context also needs access to a key store with a key corresponding to the key exchange mechanism, and also a trust store used to validate the other parties. These two are represented by

    javax.net.ssl.X509TrustManager
    javax.net.ssl.X509KeyManager

Both of these essentially represent a "keystore that has been opened (password unlocked)" as well as some policies for trust and key validation. It would make sense to simply expose instances of these as GBeans directly in the geronimo infrastructure, and then name these objects so they can be referenced from the SSL configuration.

The require-trust parameters determines if client/server side trust is required or just supported. In the former case, client hand-shake should be completed successfully before the socket is passed back. If either of these is REQUIRE then only cipher suites with a non-null key exchange mechanism can be allowed.

For client sockets, things are slightly more complicated because we need to support that the user is authenticated with an X509 certificate. In this case, the credentials of the user (which would typically be sitting inside the current Subject) needs to be passed along to the socket creation so that the SSL logic can create an X509KeyManager that can service this information to the server if he needs it to establish the clients credentials.


Is this correct? Or one possibility we should support? My understanding is that normally in csiv2 the ssl layer client authentication authenticates the client system itself, whereas the user's identity is transferred in an SAS identity token. If the client system is a standalone client rather than a server, the client system identity would presumably be the same as the user identity. Have I missed something?

thanks
david jencks




Kresten Krab Thorup
[EMAIL PROTECTED]

"We do not inherit the Earth from our parents, we borrow it from our children." Saint Exupery


Reply via email to