-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
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)
iD8DBQFCnyyqgj8ksIjnb2wRAh5kAJ4hMwZ+hbq0pczr4x080gT//10N9gCeOdRa
Mrl3fPQr0YxCO/ipm/bSJ5g=
=Qz3K
-----END PGP SIGNATURE-----