-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Ruchith Fernando wrote:
> Hi Nate,
>
> Hmmm... I'm not sure why its not in the code base
> I guess we can include this change since if someone wants to override
> the encrypting cert for the response message, it can be done
> dynamically at the service OR it can be done at the server-config.wsdd
Yeah, that sounds good.
>
> One more thing about the proposed fix:
> I think its BEST to set the WSHandlerConstants.ENCRYPTION_USER to the
> alias JUST BEFORE the WSDoAllReceiver - verifyTrust(...) method
> returns true, i.e. after verifying that the cert is a trusted cert.
>
That makes sense too. I'd be happy with that.
Nate
> .....
>
> if (certs != null && certs.length > 0 && cert.equals(certs[0])) {
> if (doDebug) {
> log.debug("Direct trust for certificate with " +
> subjectString);
> }
>
> reqData.msgContext.setProperty(WSHandlerConstants.ENCRYPTION_USER,alias);
> return true;
> }
> .....
>
> Best regards,
> Ruchith
>
> On 6/2/05, Nathaniel A. Johnson <[EMAIL PROTECTED]> wrote:
>
> Hi Ruchith,
>
> That's a much better solution than mine because that looks to be the
> real alias, not the dn property from the cert. That's exactly what I
> wanted. I rebuilt the wss4j.jar and it works great.
>
> Any idea why this isn't done in the codebase in the first place? It
> would be nice if it were so I don't have to remember to rebuild the
> library when new versions come out.
>
> Thanks for the help!
> Nate
>
>
> Ruchith Fernando wrote:
>
>>Hi Nate,
>
>>I used a different method to do the same where I changed the -
>>private boolean verifyTrust(X509Certificate cert, RequestData reqData)
>>throws AxisFault
>>method in the WSDoAllReceiver
>
>>I added the following line right after it retrieves the alias from the
>>request data (right after line 526):
>
>>reqData.msgContext.setProperty(WSHandlerConstants.ENCRYPTION_USER,alias);
>
>>Is this the way that u were looking for... This way I didn't have to
>>do anything at the service :-)
>
>>Best regards,
>>Ruchith
>
>>On 6/2/05, Nathaniel A. Johnson <[EMAIL PROTECTED]> wrote:
>
>>Hi All,
>
>>Hopefully this will be my last question for a while :) I really do
>>appreciate all of the speedy help being provided on this list.
>
>>I got the encryptionUser to work programatically by setting the property
>>in the message context to the principal CN, but I'd like to get people's
>>thoughts on my method. The code below is called in the constructor of
>>the service. The assumption is that the client alias will be the same
>>as the CN. I don't like that assumption, but I have control over how
>>our clients generate their keys, so I can enforce this. I'd much rather
>>be able to get right at the alias, but havent figured this out yet... if
>>anyone knows of a way, I'd be happy to know.
>
>
>>MessageContext msgContext = MessageContext.getCurrentContext();
>>Message reqMsg = msgContext.getRequestMessage();
>
>>String encryptedUser = null;
>>Vector results =
>> (Vector) msgContext.getProperty(WSHandlerConstants.RECV_RESULTS);
>
>>for (int i = 0; i < results.size(); i++) {
>> WSHandlerResult hResult = (WSHandlerResult) results.get(i);
>> String actor = hResult.getActor();
>> Vector hResults = hResult.getResults();
>> for (int j = 0; j < hResults.size(); j++) {
>> WSSecurityEngineResult eResult =
>> (WSSecurityEngineResult) hResults.get(j);
>> if (eResult.getAction() != WSConstants.ENCR) {
>> encryptedUser = eResult.getPrincipal().getName();
>> }
>> }
>>}
>
>>if (encryptedUser != null) {
>> if (encryptedUser.startsWith("CN=")) {
>> encryptedUser = encryptedUser.substring(3);
>> }
>> System.out.println("setting encryptedUser to ==>" +
>> encryptedUser + "<==");
>> msgContext.setProperty(WSHandlerConstants.ENCRYPTION_USER,
>> encryptedUser);
>>}
>
>>Thanks!
>>Nate
>
>
>>Nathaniel A. Johnson wrote:
>
>
>>>Hi Ruchith,
>
>>>So you are saying I should not need an encryptionUser property in the
>>>server.wsdd file? That would be great.
>
>>>Everything you say does make sense... and I do have trusted certs in the
>>>server keystore for all clients that will be talking to the service, so
>>>that part is taken care of.
>
>>>The problem right now is that the server is encrypting the response back
>>>to the client with the server's public key instead of the client's
>>>public key when I do not have the encryptedUser in the responseFlow of
>>>the server.wsdd (which I do not want because I dont know the clien :) I
>>>can see the clients public key in the constants like you mentioned below
>>>too, but the server just doesnt seem to want to use it.
>
>>>Am I missing something else? Any thoughts?
>
>>>Nate
>
>
>>>Ruchith Fernando wrote:
>
>
>>>>>Hi Nate,
>>>>>
>>>>>The client's public key is stored in the message context (in the
>>>>>receiver results - WSHandlerConstants.RECV_RESULTS - and retrieved
>>>>>later to encrypt the out going message (by the WSDoAllSender).
>>>>>
>>>>>WSDoAllSender - private void handleSpecialUser(RequestData reqData)
>>>>>
>>>>>Therefore if the client sending the incoming message uses a trusted
>>>>>cert then the out going message will be encrypted with that cert.
>>>>>
>>>>>But there's Trust verification part that happens at the service (by
>>>>>the WSDoAllReceiver -
>>>>>verifyTrust(X509Certificate cert, RequestData reqData) throws AxisFault
>>>>>
>>>>>This requires the client cert to be in the keystore of the service. I
>>>>>guess you can change this ONLY IF you want to trust all the requests
>>>>>AND if you don't have each client's cert with you.
>>>>>
>>>>>Best regards,
>>>>>Ruchith
>>>>>
>>>>>On 6/2/05, Nathaniel A. Johnson <[EMAIL PROTECTED]> wrote:
>>>>>
>>>>>Hello again Werner,
>>>>>
>>>>>So I fixed my encryption problem. I totally read the documentation
>>>>>wrong. I just needed to supply the encryptionUser in the wsdd, which
>>>>>makes perfect sense in hindsight :) Thanks for getting me thinking :)
>>>>>
>>>>>New Related Problem:
>>>>>
>>>>>This works great for request flows from the client to the web service
>>>>>since there is only one service the client is talking to (multiple
>>>>>clients talk to this service) and the client can just insert the service
>>>>>as the encryptionUser. And it works for responses from the service to
>>>>>the client when I hardcode the client as the encryptionUser in the
>>>>>server.wsdd like follows:
>>>>>
>>>>><responseFlow>
>>>>><handler type="java:org.apache.ws.axis.security.WSDoAllSender" >
>>>>> <parameter name="user" value="groupsserver"/>
>>>>> <parameter name="passwordCallbackClass"
>>>>> value="edu.iu.uis.osg.security.PWCallback"/>
>>>>> <parameter name="encryptionUser" value="xxappclient"/>
>>>>> <parameter name="action" value="Signature Encrypt"/>
>>>>> <parameter name="signaturePropFile"
>>>>> value="server-crypto.properties" />
>>>>> <parameter name="signatureKeyIdentifier" value="DirectReference" />
>>>>> <parameter name="encryptionKeyIdentifier"
>>>>> value="X509KeyIdentifier" />
>>>>></handler>
>>>>></responseFlow>
>>>>>
>>>>>But there are many clients, so is there some way for my server to
>>>>>determine who is calling it and encrypt the response back to it with the
>>>>>correct public key?
>>>>>
>>>>>Thanks yet again!
>>>>>Nate
>>>>>
>>>>>
>>>>>
>>>>>Nathaniel A. Johnson wrote:
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>>Hi Werner,
>>>>>
>>>>>>Your description of signatures and encryption with key pairs makes
>>>>>>perfect sense. It did get me thinking of something I figured was just
>>>>>>happening behind the scenes somewhere, which is that the client "just
>>>>>>knew" to use the server's public key to do the encrypting. Is there
>>>>>>some config setting, property file or what not, that should be set so
>>>>>>that the client know's to use the server's public key to encrypt with?
>>>>>>In the client.wsdd there are signaturePropFile and possibly
>>>>>>encryptionPropFile and decryptionPropFile properties, but those files
>>>>>>all have passwords in them, so I can't allow the client to see the
>>>>>>server files, right?
>>>>>
>>>>>>I must just be missing where I tell the client what to use for
>>>>>>encryption... any help would be great!
>>>>>
>>>>>>Thanks!
>>>>>>Nate
>>>>>
>>>>>>PS: Signatures are working great for me, both in the request and
>>>>>>response flows of the service, so I at least have half of it working :)
>>>>>
>>>>>
>>>>>>Dittmann Werner wrote:
>>>>>
>>>>>
>>>>>>>>Nate,
>>>>>>>>
>>>>>>>>both the Client and the Server use the Merlin calls to access
>>>>>>>>the keystore and to deal with certificates.
>>>>>>>>
>>>>>>>>If you do Signature the the client needs _its_ private
>>>>>>>>key to sign, the server needs the client's public key
>>>>>>>>to verify.
>>>>>>>>
>>>>>>>>If you encrypt then the client uses the _server's
>>>>>>>>public_ key to encrypt the symmetric session key, the
>>>>>>>>server uses _its_ private key to decrypt the session
>>>>>>>>key. Thus, the case you are describing is probably
>>>>>>>>a problem in the deployment - if you use Encryption
>>>>>>>>the you must use the server's certificate to do so
>>>>>>>>(the certificate contains the public key). To me it
>>>>>>>>seems that you specified the client's certificate to do
>>>>>>>>encryption.
>>>>>>>>
>>>>>>>>Regards,
>>>>>>>>Werner
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>>-----Urspr�ngliche Nachricht-----
>>>>>>>>>Von: Nathaniel A. Johnson [mailto:[EMAIL PROTECTED]
>>>>>>>>>Gesendet: Mittwoch, 1. Juni 2005 16:54
>>>>>>>>>An: [email protected]
>>>>>>>>>Betreff: encryption not asking for the right private key
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>hi all,
>>>>>>>>>
>>>>>>>>>i just posted this over on the axis list, but realized its probably
>>>>>>>>>better suited for the wss4j dev list... sorry for the cross post for
>>>>>>>>>those of you that are on both lists...
>>>>>>>>>
>>>>>>>>>i have been stepping through the axis and wss4j code and am at a loss.
>>>>>>>>>here is the code it is getting to (inside Merlin.java):
>>>>>>>>>
>>>>>>>>>public PrivateKey getPrivateKey(String alias, String password)
>>>>>>>>>throws Exception {
>>>>>>>>>if (alias == null) {
>>>>>>>>>throw new Exception("alias is null");
>>>>>>>>>}
>>>>>>>>>boolean b = keystore.isKeyEntry(alias);
>>>>>>>>>if (!b) {
>>>>>>>>>log.error("Cannot find key for alias: " + alias);
>>>>>>>>>throw new Exception("Cannot find key for alias: " + alias);
>>>>>>>>>}
>>>>>>>>>Key keyTmp = keystore.getKey(alias, password.toCharArray());
>>>>>>>>>if (!(keyTmp instanceof PrivateKey)) {
>>>>>>>>>throw new Exception("Key is not a private key, alias: " + alias);
>>>>>>>>>}
>>>>>>>>>return (PrivateKey) keyTmp;
>>>>>>>>>}
>>>>>>>>>
>>>>>>>>>this is when the client calls to the service. the client is
>>>>>>>>>sending an
>>>>>>>>>encrypted/signed message. what's happening is the server
>>>>>>>>>(web service)
>>>>>>>>>is trying to get the private key for the client. that just
>>>>>>>>>doesnt make
>>>>>>>>>sense. the server will not have a keyEntry (private key) for the
>>>>>>>>>client, just public keys.
>>>>>>>>>
>>>>>>>>>does anyone have any idea where i might be going wrong? i have been
>>>>>>>>>looking at this problem for over a week now, so maybe i am
>>>>>>>>>just missing
>>>>>>>>>something? i feel like i am going crazy.
>>>>>>>>>
>>>>>>>>>thanks
>>>>>>>>>nate
>>>>>
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (MingW32)
iD8DBQFCnzUFgj8ksIjnb2wRArW6AJ0YVbPcyD002Nu7cFfVxfMXNTsxeQCgoC38
/HyrtPgqQnPDs9vTAoHlUFA=
=BBQ3
-----END PGP SIGNATURE-----