2011-01-22 2 views
3

Я хотел бы использовать веб-сервис CXF от клиента .net C#. В настоящее время мы работаем с запросами java-to-java, и мы защищаем конверты SOAP через ws-security (библиотека WSS4J)..net Совместимость WCF - CXF/WSS4j

Мой вопрос: как я могу реализовать WS-клиент C#, который создает те же SOAP-запросы, что и следующий код Java на стороне клиента?

//doc is the original SOAP envelope to process with WSS4J 
WSSecHeader secHeader = new WSSecHeader(); 
secHeader.insertSecurityHeader(doc); 

//add username token with password digest 
WSSecUsernameToken usrNameTok = new WSSecUsernameToken(); 
usrNameTok.setPasswordType(WSConstants.PASSWORD_DIGEST); 
usrNameTok.setUserInfo("guest",psw_guest); 
usrNameTok.prepare(doc); 
usrNameTok.appendToHeader(secHeader); 

//sign the envelope body with client key 
WSSecSignature sign = new WSSecSignature(); 
sign.setUserInfo("clientx509v1", psw_clientx509v1); 
sign.setKeyIdentifierType(WSConstants.BST_DIRECT_REFERENCE); 

Document signedDoc = null;  
sign.prepare(doc, sigCrypto, secHeader); 
signedDoc = sign.build(doc, sigCrypto, secHeader); 

//encrypt envelope body with server public key 
WSSecEncrypt encrypt = new WSSecEncrypt(); 
encrypt.setUserInfo("serverx509v1"); 

// build the encrypted SOAP part 
String out = null; 
Document encryptedDoc = encrypt.build(signedDoc, encCrypto, secHeader); 
return encryptedDoc; 

Кто-нибудь знает, где я могу найти практическое руководство для Microsoft или рабочий пример .net?

========================= РЕДАКТИРОВАНИЕ ============= =======================

Спасибо, Ладислав! Я применил свои предложения, и я придумал что-то вроде:

X509Certificate2 client_pk, server_cert; 
client_pk = new X509Certificate2(@"C:\x509\clientKey.pem", "blablabla"); 
server_cert = new X509Certificate2(@"C:\x509\server-cert.pfx", "blablabla"); 

// Create the binding. 
System.ServiceModel.WSHttpBinding myBinding = new WSHttpBinding();  
myBinding.TextEncoding = ASCIIEncoding.UTF8; 
myBinding.MessageEncoding = WSMessageEncoding.Text;    
myBinding.Security.Mode = SecurityMode.Message; 
myBinding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate; 
myBinding.Security.Message.AlgorithmSuite =           
      System.ServiceModel.Security.SecurityAlgorithmSuite.Basic128; 

// Disable credential negotiation and the establishment of 
// a security context. 
myBinding.Security.Message.NegotiateServiceCredential = false; 
myBinding.Security.Message.EstablishSecurityContext = false;     

// Create the endpoint address. 
EndpointAddress ea = 
    new EndpointAddress(new Uri("http://bla.bla.bla"), 
      EndpointIdentity.CreateDnsIdentity("issuer")); 

// configure the username credentials on the channel factory 
UsernameClientCredentials credentials = new UsernameClientCredentials(new 
            UsernameInfo("superadmin", "secret")); 

// Create the client. 
PersistenceClient client = new PersistenceClient(myBinding, ea); 

client.Endpoint.Contract.ProtectionLevel = 
      System.Net.Security.ProtectionLevel.EncryptAndSign; 

// replace ClientCredentials with UsernameClientCredentials 
client.Endpoint.Behaviors.Remove(typeof(ClientCredentials)); 
client.Endpoint.Behaviors.Add(credentials); 

// Specify a certificate to use for authenticating the client. 
client.ClientCredentials.ClientCertificate.Certificate = client_pk; 

// Specify a default certificate for the service. 
client.ClientCredentials.ServiceCertificate.DefaultCertificate = server_cert; 

// Begin using the client. 
client.Open(); 
clientProxyNetwork[] response = client.GetAllNetwork(); 

В результате я получаю (на стороне сервера) следующее исключение CXF:

java.security.SignatureException: Signature does not match. 
at sun.security.x509.X509CertImpl.verify(X509CertImpl.java:421) 
at sun.security.provider.certpath.BasicChecker.verifySignature(BasicChecker.java:133) 
at sun.security.provider.certpath.BasicChecker.check(BasicChecker.java:112) 
at sun.security.provider.certpath.PKIXMasterCertPathValidator.validate (PKIXMasterCertPathValidator.java:117) 

Поэтому представляется ключевым jks-> PEM проблема преобразования ... Или я что-то упустил в клиентском коде выше?

+0

Я знаю, что это очень старый вопрос, но сейчас я пытаюсь сделать подобное, но, к сожалению, я не могу. Я пробовал свой код, но я не могу ссылаться на 'UsernameClientCredentials', это ваш собственный класс? В принципе, я должен создать заголовок безопасности с помощью UsernameToken, BinarySecurityToken и Signature – Misiu

ответ

1

Ну, в конце концов, решение состоит в том, чтобы зашифровать и подписать весь токен имени пользователя. Что касается функциональной совместимости, адресация ws должна быть активирована в cxf, и требуется специальная привязка в C#. Обычай связывания, который сделал трюк в основном

AsymmetricSecurityBindingElement abe = 
    (AsymmetricSecurityBindingElement)SecurityBindingElement. 
CreateMutualCertificateBindingElement(MessageSecurityVersion. 
WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10); 
                

ФОС подписывает каждый элемент WS адресации, поэтому то же самое должно быть сделано на стороне сервера.

0

Это, как правило, довольно большая проблема, потому что WCF does not support UserNameToken Profile with Digested password. I needed it несколько месяцев назад, и нам пришлось реализовать собственную собственную привязку, но этот код не готов к публикации. Fortunatelly this blog article описывает другую реализацию и содержит пример кода с новым классом UserNameClientCredentials, поддерживающим переваренный пароль.

КПП. такая же конфигурация безопасности должна быть возможна со старым API под названием WSE 3.0. Он был заменен WCF, но все же некоторая конфигурация WS- * stack намного проще с этим API и старыми службами ASMX.

Смежные вопросы