Я все еще работаю над некоторыми проблемами, пытаясь решить эту проблему, но я хотел уточнить некоторые детали подхода, на котором я остановился. Первое, что я понял, это то, что мне пришлось перейти с JAXWS-RI 2.1 на Metro 2.0. Ранее мы использовали JAXWSRI-2.1 в этом проекте, но нам никогда не приходилось сталкиваться с какой-либо WS-Security. Во всяком случае, я понял, что мне нужно обновиться, поэтому я сделал это, чтобы воспользоваться Metro 2.0 и банками WSIT, которые были включены в него. Затем я все еще смущался о том, как делать с созданием заголовков WS-Security, которые мне нужны, без наличия информации WS-Policy из WSDL-файла службы. Я попытался установить CallbackHandlerFeature с помощью API, предложенных LES2, но это не создавало заголовки для меня. Итак, я разместил вопрос на борту Metro/JAXB в java.net здесь:
http://forums.java.net/jive/message.jspa?messageID=392451#392451
В ответах на это, один отвечающему предложил использовать NetBeans написать фиктивную веб-службы и настроить параметры безопасности что я, хотя сервис .NET использовал. Как только я это сделал, NetBeans сгенерировал раздел WS-Policy в файле wsit-.xml, который я мог бы использовать. Я подключил этот раздел WS-Policy к моей локальной копии WSDL-сервиса .NET-сервиса, а также использовал его для создания файла wsit-client.xml, который я ввел в каталог WEB-INF/classes.
Как только я это сделал, Metro/WSIT начали добавлять заголовки WS-Security для запроса. Затем я столкнулся с некоторыми проблемами, потому что Metro использовал другую версию WS-Addressing, чем требовалось службе .NET (они используют функцию MemberSubmissionAddressing). Итак, я закончил настройки мои настройки WS-политики для использования
<wsap:UsingAddressing xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" />
Теперь я в точке, где я получил мой запрос SOAP выглядит как это:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:exc14n="http://www.w3.org/2001/10/xml-exc-c14n#" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<S:Header>
<To xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing" wsu:Id="_5003">https://10.49.38.78/2009/12/CaseDetailsService.asmx</To>
<Action xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing" wsu:Id="_5004">http://schemas.xmlsoap.org/ws/2005/02/trust/RST/SCT</Action>
<ReplyTo xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing" wsu:Id="_5002">
<Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</Address>
</ReplyTo>
<MessageID xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing" wsu:Id="_5005">uuid:89a0dfdf-014c-4be7-a677-ab1b4d30cdb5</MessageID>
<wsse:Security S:mustUnderstand="1">
<wsu:Timestamp xmlns:ns10="http://www.w3.org/2003/05/soap-envelope"
xmlns:ns11="http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512" xmlns:ns12="http://schemas.xmlsoap.org/ws/2006/02/addressingidentity" wsu:Id="_3">
<wsu:Created>2010-03-22T19:48:04Z</wsu:Created>
<wsu:Expires>2010-03-22T19:53:04Z</wsu:Expires>
</wsu:Timestamp>
<wsse:BinarySecurityToken xmlns:ns10="http://www.w3.org/2003/05/soap-envelope"
xmlns:ns11="http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512"
xmlns:ns12="http://schemas.xmlsoap.org/ws/2006/02/addressingidentity"
wsu:Id="uuid_e861f15d-dd66-4b05-b101-c9fed7feda38"
EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3">DATA_HERE
</wsse:BinarySecurityToken>
<xenc:EncryptedKey xmlns:ns10="http://www.w3.org/2003/05/soap-envelope" xmlns:ns11="http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512" xmlns:ns12="http://schemas.xmlsoap.org/ws/2006/02/addressingidentity" Id="_5007">
<xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"/>
<ds:KeyInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="KeyInfoType">
<wsse:SecurityTokenReference>
<ds:X509Data>
<ds:X509IssuerSerial>
<ds:X509IssuerName>CN=server</ds:X509IssuerName>
<ds:X509SerialNumber>-24583240032357195994117623470001087391</ds:X509SerialNumber>
</ds:X509IssuerSerial>
</ds:X509Data>
</wsse:SecurityTokenReference>
</ds:KeyInfo>
<xenc:CipherData>
<xenc:CipherValue></xenc:CipherValue>
</xenc:CipherData>
<xenc:ReferenceList>
<xenc:DataReference URI="#_5008"/>
</xenc:ReferenceList>
</xenc:EncryptedKey>
<ds:Signature xmlns:ns10="http://www.w3.org/2003/05/soap-envelope"
xmlns:ns11="http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512" xmlns:ns12="http://schemas.xmlsoap.org/ws/2006/02/addressingidentity" Id="_1">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<exc14n:InclusiveNamespaces PrefixList="wsse S"/>
</ds:CanonicalizationMethod>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference URI="#_5002">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<exc14n:InclusiveNamespaces PrefixList="S"/>
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>vtf9n+OcI1nT0exavD4/ZQy6jm8=</ds:DigestValue></ds:Reference>
<ds:Reference URI="#_5003">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"><exc14n:InclusiveNamespaces PrefixList="S"/></ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>
</ds:DigestValue>
</ds:Reference>
<ds:Reference URI="#_5004"><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<exc14n:InclusiveNamespaces PrefixList="S"/>
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue></ds:DigestValue>
</ds:Reference>
<ds:Reference URI="#_5005"><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"><exc14n:InclusiveNamespaces PrefixList="S"/></ds:Transform></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><ds:DigestValue>hn2umVvzokVW6dgXUzXcG00vfq8=</ds:DigestValue>
</ds:Reference><ds:Reference URI="#_5006"><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"><exc14n:InclusiveNamespaces PrefixList="S"/>
</ds:Transform></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>MIH/94A7R2iHn/und3ElJLRTWKY=</ds:DigestValue>
</ds:Reference><ds:Reference URI="#_3"><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<exc14n:InclusiveNamespaces PrefixList="wsu wsse S"/></ds:Transform></ds:Transforms>
<ds:DigestMethodAlgorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><ds:DigestValue>olcbTjCNnXuZ5eVR1glEWRJxQpw=</ds:DigestValue>
</ds:Reference></ds:SignedInfo><ds:SignatureValue>
</ds:SignatureValue><ds:KeyInfo>
<wsse:SecurityTokenReference><wsse:Reference ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" URI="#uuid_e861f15d-dd66-4b05-b101-c9fed7feda38"/>
</wsse:SecurityTokenReference></ds:KeyInfo></ds:Signature>
</wsse:Security>
</S:Header>
И, в то время как что точно не соответствует образцу, предоставленному мне командой .NET, я думаю, что это правильно. Тем не менее, я все еще получаю сообщение об ошибке при вызове службы .NET. Это сообщение об ошибке, возвращается в SoapFault из них:
System.Web.Services.Protocols.SoapHeaderException: Сервер недоступен, пожалуйста, попробуйте позже --- > System.ApplicationException: WSE841: ошибка обработки исходящего ответ на неисправность. --- > System.Web.Services.Protocols.SoapHeaderException: Microsoft.Web.Services3.Security.SecurityFault: токен безопасности не может быть аутентифицирован или авторизирован --- > System.Security.SecurityException: WSE3003: Цепочка доверия сертификата может не проверяется. Проверьте, правильно ли установлен сертификат в хранилище сертификатов доверенных лиц. Или, возможно, вы захотите установить в разделе конфигурации allowTestRoot значение true, если это тестовый сертификат.
Итак, я в настоящее время работаю с ними, чтобы выяснить, почему цепочка доверия сертификата не может быть проверена. Я не понимаю, является ли эта конкретная проблема на моем конце или на их. Мы ценим любые предложения!
Я попытался использовать эти подходы и в конечном итоге взял немного от них. Примеры EC2 были полезны, потому что они научили меня о CallbackHandlerFeatures & JAXWS. В результате я использовал код из примера EC2, чтобы написать собственный CertStoreCallBackImpl, который реализует CallbackHandler и знает, как загрузить закрытый ключ и сертификат. Однако просто добавить, что в качестве функции при получении самой службы недостаточно для создания заголовков WS-Security, которые мне нужны. Я обновил свое оригинальное сообщение с более подробной информацией о том, где я сейчас работаю. – elduff
У меня была аналогичная проблема, связанная с веб-сервисами restaurant.com, они работают под .net, и мне нужно метро, чтобы выполнять аутентификацию через SSL. Есть несколько проблем, но вы можете обратиться к этому: вам нужно импортировать сертификат внешнего сервера, вы не сможете разместить его в системном хранилище, поэтому вы создадите локальный файл с сертификатами, которые НЕ будут использоваться метро, если вы не сообщите об этом: System.setProperty ("javax.net.ssl.trustStore", "your_file"); - вам также нужно проверить порядок загрузки библиотек. –