Hi Colm,
This is what worked in the end for me, I’m now trying to work out how to get
back to SOAP from the server response, i.e. I’m writing decodeSOAP.
private SOAPMessage encodeSOAP(SOAPMessage soapMessage) throws Exception {
SOAPPart soapPart = soapMessage.getSOAPPart();
SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
//Might be a workaround to the fact the WSDL has ws.live.ie and we are
using ws.test.ie etc
soapEnvelope.addNamespaceDeclaration( "dl","http://ws.live.ie/v1/DL-WS/");
WSSecEncrypt builder = new WSSecEncrypt();
WSSecTimestamp builderTS = new WSSecTimestamp();
WSSecSignature builderSig = new WSSecSignature();
java.security.cert.X509Certificate recipientCert = (X509Certificate)
keysRSA.getks().getCertificate("wsstestservice");
java.security.cert.X509Certificate ourCert = (X509Certificate)
keysRSA.getks().getCertificate("wsstest");
builder.setUseThisCert(recipientCert);
builder.setKeyIdentifierType(WSConstants.BST_DIRECT_REFERENCE);
builder.setSymmetricEncAlgorithm(WSConstants.TRIPLE_DES);
builderTS.setTimeToLive(5000);
Document doc = soapEnvelope.getOwnerDocument();
org.apache.wss4j.dom.message.WSSecHeader secHeader = new WSSecHeader();
secHeader.insertSecurityHeader(doc);
{//Sign the Timestamp and the body this block replaces
builderSig.build(doc, crypto, secHeader)
builderSig.setX509Certificate(ourCert);
builderSig.setUserInfo("wsstest", "password1");
builderSig.setKeyIdentifierType(WSConstants.BST_DIRECT_REFERENCE);
SOAPConstants soapConstants =
org.apache.wss4j.dom.util.WSSecurityUtil.getSOAPConstants(doc.getDocumentElement());
List<WSEncryptionPart> wsEncryptionParts = new
ArrayList<WSEncryptionPart>();
WSEncryptionPart wsEncryptionPart = new WSEncryptionPart(
soapConstants.getBodyQName().getLocalPart(),
soapConstants.getEnvelopeURI(), "Content");
wsEncryptionParts.add(wsEncryptionPart);
builderTS.build(doc, secHeader);
wsEncryptionParts.add(new WSEncryptionPart(builderTS.getId()));
builderSig.setParts(wsEncryptionParts);
builderSig.setUseSingleCertificate(true);
builderSig.prepare(doc, this.crypto, secHeader);
builderSig.appendBSTElementToHeader(secHeader);
List<javax.xml.crypto.dsig.Reference> referenceList =
builderSig.addReferencesToSign(wsEncryptionParts, secHeader);
builderSig.computeSignature(referenceList);
}
try
{
builder.build(doc, this.crypto, secHeader);
}
catch (WSSecurityException e)
{
System.err.println("Failed in builder block: " + e.getMessage());
e.printStackTrace();
System.exit(1);
}
return soapMessage;
}
From: Colm O hEigeartaigh [mailto:[email protected]]
Sent: 08 August 2014 10:56
To: Adrian Williamson
Cc: [email protected]
Subject: Re: Does anyone have an example of using WSSecEncrypt.setUseThisCert()
> builder.setKeyEnc(WSConstants.TRIPLE_DES);
> builder.setEncryptSymmKey(false);
This is not valid. Triple Des is a symmetric encryption algorithm, and not a
key transport algorithm. Also, you want to encrypt the symmetric key here
(using the X.509 Certificate). So just comment out the
"setEncryptSymmKey(false)" call + change "setKeyEnc" to
"setSymmetricEncAlgorithm" and it should work.
> Should the WSSecSignature.setX509Certificate method take care of that?
No, because you need to specify a username + password as well to access the
private key required to sign the request.
Colm.
On Wed, Aug 6, 2014 at 4:57 PM, Adrian Williamson <[email protected]>
wrote:
Hi,
I believe that I am using WSS4J 2.0.2, if you have a specific process for
understanding the version please don’t be shy – I’ll use it then we both know
that I will have given the correct info.
By core do you mean the JDK? If so then :
java version "1.7.0_55"
Java(TM) SE Runtime Environment (build 1.7.0_55-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed mode)
That error in particular I have avoided by using BST_DIRECT_REFERENCE, I’m
afraid I was doing that two-year-old learning technique of pressing all the
buttons at once, so I might have been the cause of the error – not knowing my
apples from pears:
//This gives Error when calling DDOperation: An invalid security token was
provided (Bad ValueType
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3")
java.security.cert.X509Certificate recipientCert = (X509Certificate)
keysRSA.getks().getCertificate("wsstestservice");
Document doc = soapEnvelope.getOwnerDocument();
org.apache.wss4j.dom.message.WSSecHeader secHeader = new WSSecHeader();
builder.setKeyIdentifierType(WSConstants.X509_KEY_IDENTIFIER);
builder.setKeyEnc(WSConstants.TRIPLE_DES);
builder.setEncryptSymmKey(false);
builder.setUseThisCert(recipientCert);
try
{
secHeader.insertSecurityHeader(doc);
builder.build(doc, crypto, secHeader);
}
catch (WSSecurityException e)
So I am not too worried about that as I have moved on.
I did find another issue with the WSSecSignature, when using the
WSSecSignature.setX509Certificate and then calling WSSecSignature.build it
throw a null identifier (merlin.java:744) for the GetPrivateKey() as the
calling context WSecSigniture.java:530 had this.user set to null, I worked out
that if I used WSSecSignature.setUserInfo and passed in the alias and the JKS
password then it stopped moaning and got on with it.
Should the WSSecSignature.setX509Certificate method take care of that?
My work in progress/prototype is below, I’m trying to mimic the SOAPUI WSS
specification:
I’ll go and look at those examples.
Cheers,
Adrian
PS Bonus points for identifying Cargo Cult sections….
private SOAPMessage encriptBody(SOAPMessage soapMessage) throws Exception {
SOAPPart soapPart = soapMessage.getSOAPPart();
SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
WSSecEncrypt builder = new WSSecEncrypt();
WSSecTimestamp builderTS = new WSSecTimestamp();
WSSecSignature builderSig = new WSSecSignature();
Crypto crypto = null;
//Class constructor candidates
try {
//Where will I put the properties file?
crypto = CryptoFactory.getInstance("Ball.properties");
}
catch (WSSecurityException e)
{
System.err.println("Crypto crypto =
CryptoFactory.getInstance(\"Ball.properties\"): " + e.getMessage());
}
java.security.cert.X509Certificate recipientCert = (X509Certificate)
keysRSA.getks().getCertificate("wsstestservice");
java.security.cert.X509Certificate ourCert = (X509Certificate)
keysRSA.getks().getCertificate("wsclientcert");
builder.setUseThisCert(recipientCert);
builderSig.setX509Certificate(ourCert);
builder.setKeyIdentifierType(WSConstants.BST_DIRECT_REFERENCE);
builderTS.setTimeToLive(5000);
builderSig.setKeyIdentifierType(WSConstants.BST_DIRECT_REFERENCE);
builderSig.setUserInfo("wsclientcert", "password1");
//End Class constructor candidates
Document doc = soapEnvelope.getOwnerDocument();
org.apache.wss4j.dom.message.WSSecHeader secHeader = new WSSecHeader();
try
{
secHeader.insertSecurityHeader(doc);
builderTS.build(doc, secHeader);
builderSig.build(doc, crypto, secHeader);
builder.build(doc, crypto, secHeader);
}
catch (WSSecurityException e)
{
System.err.println("Failed in builder block: " + e.getMessage());
e.printStackTrace();
System.exit(1);
}
return soapMessage;
}
From: Colm O hEigeartaigh [mailto:[email protected]]
Sent: 06 August 2014 15:48
To: [email protected]
Subject: Re: Does anyone have an example of using WSSecEncrypt.setUseThisCert()
Here are some:
http://svn.apache.org/viewvc/webservices/wss4j/trunk/ws-security-dom/src/test/java/org/apache/wss4j/dom/components/crypto/CryptoProviderTest.java?revision=1503186
<http://svn.apache.org/viewvc/webservices/wss4j/trunk/ws-security-dom/src/test/java/org/apache/wss4j/dom/components/crypto/CryptoProviderTest.java?revision=1503186&view=co>
&view=co
What version of WSS4J? What does the request look like that is generating that
error + what core are you using to generate it?
Colm.
On Wed, Aug 6, 2014 at 9:35 AM, Adrian Williamson <[email protected]>
wrote:
Hi,
Has anyone got an example of how this method can be used?
I've trying different values for the WSSecEncrypt.setKeyIdentifierType() but
I keep getting application specific error messages back from the private
service I'm calling.
One of the error messages made me stop and ponder the extent of my
ignorance;
WSConstants.X509_KEY_IDENTIFIER it returned:
An invalid security token was provided (Bad ValueType
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-
<http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-%0d%0a1.0#X509v3>
1.0#X509v3")
So I thought if someone had a nice little test case that used an X509
certificate to encrypt it might help me along.
So I can see how it is supposed to be done.
Thanks
Adrian
--
Colm O hEigeartaigh
Talend Community Coder
http://coders.talend.com
--
Colm O hEigeartaigh
Talend Community Coder
http://coders.talend.com