<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:"Lucida Console";
        panose-1:2 11 6 9 4 5 4 2 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal>Hey all, <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I’m trying to use XML::Compile::WSS to create and sign SOAP requests. I’ve spent a lot of time go through the test examples and poking around in the perl debugger to try and get the right values everywhere, but it looks like I’m still doing something wrong and I’m really at a loss for what it could be. <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I’m getting the error (full output following code below):<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:9.0pt;font-family:"Lucida Console"'>error: tag `wsu_Id' not processed at {http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}BinarySecurityToken<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:9.0pt;font-family:"Lucida Console"'><o:p> </o:p></span></p><p class=MsoNormal>I’m able to communicate with the server using SoapUI and have attached it’s output to the email as well as the WSDL. <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Any ideas?<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>#!/usr/bin/perl -w<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>use warnings;<o:p></o:p></p><p class=MsoNormal>use strict;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>use Log::Report mode => 'DEBUG';<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>use XML::Compile::WSDL11;<o:p></o:p></p><p class=MsoNormal>use XML::Compile::SOAP11;<o:p></o:p></p><p class=MsoNormal>use XML::Compile::Transport::SOAPHTTP;<o:p></o:p></p><p class=MsoNormal>use XML::Compile::SOAP::WSS;<o:p></o:p></p><p class=MsoNormal>use XML::Compile::WSS::Util qw/:dsig :utp11 :xtp10 :wsm10/;<o:p></o:p></p><p class=MsoNormal>use XML::Compile::C14N::Util qw/:c14n/;<o:p></o:p></p><p class=MsoNormal>use XML::Compile::WSS::SecToken::X509v3;<o:p></o:p></p><p class=MsoNormal>use XML::Compile::WSS::KeyInfo;<o:p></o:p></p><p class=MsoNormal>use XML::Compile::WSS::SignedInfo;<o:p></o:p></p><p class=MsoNormal>use XML::Compile::WSS::BasicAuth;<o:p></o:p></p><p class=MsoNormal>use Crypt::OpenSSL::X509;<o:p></o:p></p><p class=MsoNormal>use Crypt::OpenSSL::RSA;<o:p></o:p></p><p class=MsoNormal>use File::Slurp qw(read_file);<o:p></o:p></p><p class=MsoNormal>use Data::Dumper;<o:p></o:p></p><p class=MsoNormal>$Data::Dumper::Indent = 1;<o:p></o:p></p><p class=MsoNormal>$Data::Dumper::Quotekeys = 0;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal># Local Public Key<o:p></o:p></p><p class=MsoNormal>my $lcertfn = '/home/talbert/keytool_crt.pem';<o:p></o:p></p><p class=MsoNormal>my $lcert = Crypt::OpenSSL::X509->new_from_file($lcertfn);<o:p></o:p></p><p class=MsoNormal>my $ltoken = XML::Compile::WSS::SecToken::X509v3->new<o:p></o:p></p><p class=MsoNormal> ( id => 'x509cert00',<o:p></o:p></p><p class=MsoNormal> certificate => $lcert<o:p></o:p></p><p class=MsoNormal> );<o:p></o:p></p><p class=MsoNormal># Remote Public Key <o:p></o:p></p><p class=MsoNormal>my $rcertfn = '/home/talbert/servicenow.pem';<o:p></o:p></p><p class=MsoNormal>my $rcert = Crypt::OpenSSL::X509->new_from_file($rcertfn);<o:p></o:p></p><p class=MsoNormal>my $rtoken = XML::Compile::WSS::SecToken::X509v3->new<o:p></o:p></p><p class=MsoNormal> ( id => 'whatever', #do I need this?<o:p></o:p></p><p class=MsoNormal> certificate => $lcert<o:p></o:p></p><p class=MsoNormal> );<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal># Remote Private Key <o:p></o:p></p><p class=MsoNormal>my $pcertfn = '/home/talbert/nocryptout.pem';<o:p></o:p></p><p class=MsoNormal>my $key_text = read_file( $pcertfn );<o:p></o:p></p><p class=MsoNormal>my $rsa_key = Crypt::OpenSSL::RSA->new_private_key($key_text);<o:p></o:p></p><p class=MsoNormal>$rsa_key->use_pkcs1_padding();<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>my $wsdlfn = '/home/talbert/HIPPOIPApp.wsdl';<o:p></o:p></p><p class=MsoNormal>my $user = 'hippo';<o:p></o:p></p><p class=MsoNormal>my $password = 'appnootmies';<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>my %stuff = ( remoteuser => "talbert", <o:p></o:p></p><p class=MsoNormal> hostname => "lukto", <o:p></o:p></p><p class=MsoNormal> resperson => "jo mama",<o:p></o:p></p><p class=MsoNormal> physphone => "303 735 4709"<o:p></o:p></p><p class=MsoNormal> );<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal># strict order of instantiation!<o:p></o:p></p><p class=MsoNormal>my $wss = XML::Compile::SOAP::WSS->new; # hooks WSDL parser<o:p></o:p></p><p class=MsoNormal>my $wsdl = XML::Compile::WSDL11->new($wsdlfn); <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>my $auth = $wss->basicAuth # add Security record<o:p></o:p></p><p class=MsoNormal> ( username => $user<o:p></o:p></p><p class=MsoNormal> , password => $password<o:p></o:p></p><p class=MsoNormal> );<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>my $ki = XML::Compile::WSS::KeyInfo->new<o:p></o:p></p><p class=MsoNormal>(<o:p></o:p></p><p class=MsoNormal> keyinfo => 'KI-1', #does this matter?<o:p></o:p></p><p class=MsoNormal> publish_token => 'INCLUDE_BY_REF',<o:p></o:p></p><p class=MsoNormal> #publish_token => 'SECTOKREF_URI', #is there a difference? <o:p></o:p></p><p class=MsoNormal> sectokref_id => 'STR-2', #does this matter?<o:p></o:p></p><p class=MsoNormal> keyid_value => XTP10_X509v3,<o:p></o:p></p><p class=MsoNormal> keyid_encoding => WSM10_BASE64,<o:p></o:p></p><p class=MsoNormal> keyident_id => 'KIDENT-1', #does this matter?<o:p></o:p></p><p class=MsoNormal> sectokref_uri => '#x509cert00'<o:p></o:p></p><p class=MsoNormal>);<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>my $si = XML::Compile::WSS::SignedInfo->new<o:p></o:p></p><p class=MsoNormal>(<o:p></o:p></p><p class=MsoNormal> #c14n => $c14n, #do I need to create my own c14n object?<o:p></o:p></p><p class=MsoNormal> canon_method => C14N_EXC_NO_COMM, <o:p></o:p></p><p class=MsoNormal> digest_method => DSIG_SHA1,<o:p></o:p></p><p class=MsoNormal> #prefix_list => qw/tns SOAP-ENV',<o:p></o:p></p><p class=MsoNormal> prefix_list => 'tns SOAP-ENV', #is this the right format?<o:p></o:p></p><p class=MsoNormal> wss => $wss <o:p></o:p></p><p class=MsoNormal>);<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>my $sig = $wss->signature<o:p></o:p></p><p class=MsoNormal>(<o:p></o:p></p><p class=MsoNormal> key_info => $ki,<o:p></o:p></p><p class=MsoNormal> prepare => 'WRITER', <o:p></o:p></p><p class=MsoNormal> #remote_token => $rtoken,<o:p></o:p></p><p class=MsoNormal> schema => $wsdl,<o:p></o:p></p><p class=MsoNormal> signed_info => $si,<o:p></o:p></p><p class=MsoNormal> signer => <o:p></o:p></p><p class=MsoNormal> {<o:p></o:p></p><p class=MsoNormal> #put remote_token here?<o:p></o:p></p><p class=MsoNormal> #remote_token => $rtoken,<o:p></o:p></p><p class=MsoNormal> sign_method => DSIG_RSA_SHA1,<o:p></o:p></p><p class=MsoNormal> private_key => $rsa_key<o:p></o:p></p><p class=MsoNormal> },<o:p></o:p></p><p class=MsoNormal> sign_types => 'SOAP-ENV:Body',<o:p></o:p></p><p class=MsoNormal> #signed_type (aka Parts) empty in SoapUI http://www.soapui.org/SOAP-and-WSDL/applying-ws-security.html<o:p></o:p></p><p class=MsoNormal> sign_put => 'wsse:SecurityHeaderType', #what to put here?<o:p></o:p></p><p class=MsoNormal> sign_when => 'SOAP-ENV:Envelope', #what to put here?<o:p></o:p></p><p class=MsoNormal> #BinarySecurityToken<o:p></o:p></p><p class=MsoNormal> token => $ltoken<o:p></o:p></p><p class=MsoNormal>);<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal># Will include all defined security features<o:p></o:p></p><p class=MsoNormal>my $call = $wsdl->compileClient('execute');<o:p></o:p></p><p class=MsoNormal>my ($answer, $trace) = $call->(%stuff);<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>#$wsdl->compileCalls; #is this the correct way to call? <o:p></o:p></p><p class=MsoNormal>#my $answer = $wsdl->call('execute', wsse_Security => $auth, %stuff); #but data here?<o:p></o:p></p><p class=MsoNormal># same, because "all" defined is default, $auth is in 'all'<o:p></o:p></p><p class=MsoNormal># my $answer = $wsdl->call($operation, %stuff);<o:p></o:p></p><p class=MsoNormal># $wsdl->compileCalls;<o:p></o:p></p><p class=MsoNormal># my $answer = $wsdl->call('execute', wsse_Security => $auth, %stuff);<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>print $answer;<o:p></o:p></p><p class=MsoNormal>print Dumper $answer;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>code output<o:p></o:p></p></div></body></html>