c# - 如何从 ssl 证书和签名属性调用 Soap web 服务

标签 c# web-services ssl dns wsdl

我必须从本地 WSDL 调用 Web 服务。

所以我用 Visual Studio 创建了一个新项目,然后导入了 WSDL。

现在,要调用此 Web 服务,我必须通过 SSL 证书连接它。之后我必须签署一些属性。

所以我已经下载了 ssl 证书,并且我有文件“keystore_healthnetbr.pfx”来签署属性。

这是 wsdl:

    <?xml version="1.0" encoding="UTF-8"?>

<!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is Metro/2.1 (branches/2.1-6728; 2011-02-03T14:14:58+0000) JAXWS-RI/2.2.3 JAXWS/2.2. -->

<!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is Metro/2.1 (branches/2.1-6728; 2011-02-03T14:14:58+0000) JAXWS-RI/2.2.3 JAXWS/2.2. -->

-<definitions name="PianoAssistenzialeResidenzialeService" targetNamespace="http://www.nsisr.puglia.it/Schemas/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.nsisr.puglia.it/Schemas/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">


-<wsp1_2:Policy wsu:Id="NsisrPortBindingPolicy" xmlns:sunwsp="http://java.sun.com/xml/ns/wsit/policy" xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy" xmlns:ssp="http://schemas.sun.com/2006/03/wss/server" xmlns:wsapw3c="http://www.w3.org/2006/05/addressing/wsdl">


-<sp:AsymmetricBinding>


-<wsp1_2:Policy>


-<sp:AlgorithmSuite>


-<wsp1_2:Policy>

<sp:Basic128/>

</wsp1_2:Policy>

</sp:AlgorithmSuite>

<sp:IncludeTimestamp/>


-<sp:InitiatorToken>


-<wsp1_2:Policy>


-<sp:X509Token sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">


-<wsp1_2:Policy>

<sp:WssX509V3Token10/>

</wsp1_2:Policy>

</sp:X509Token>

</wsp1_2:Policy>

</sp:InitiatorToken>


-<sp:Layout>


-<wsp1_2:Policy>

<sp:Lax/>

</wsp1_2:Policy>

</sp:Layout>


-<sp:RecipientToken>


-<wsp1_2:Policy>


-<sp:X509Token sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/Never">


-<wsp1_2:Policy>

<sp:WssX509V3Token10/>

</wsp1_2:Policy>

</sp:X509Token>

</wsp1_2:Policy>

</sp:RecipientToken>

</wsp1_2:Policy>

</sp:AsymmetricBinding>


-<sp:SignedParts>

<sp:Body/>

<sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing"/>

<sp:Header Name="attributiAutorizzativi" Namespace="http://www.nsisr.puglia.it/Schemas/"/>

<sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing"/>

<sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing"/>

<sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing"/>

<sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing"/>

</sp:SignedParts>


-<sp:Wss10>


-<wsp1_2:Policy>

<sp:MustSupportRefIssuerSerial/>

<sp:MustSupportRefKeyIdentifier/>

</wsp1_2:Policy>

</sp:Wss10>

<wsapw3c:UsingAddressing/>

</wsp1_2:Policy>


-<types>


-<xsd:schema>

<xsd:import schemaLocation="PianoAssistenzialeResidenzialeService.xsd" namespace="http://www.nsisr.puglia.it/Schemas/"/>

</xsd:schema>

</types>


-<message name="getPianoAssistenziale">

<part name="parameters" element="tns:getPianoAssistenziale"/>

<part name="attributiAutorizzativi" element="tns:attributiAutorizzativi"/>

</message>


-<message name="getPianoAssistenzialeResponse">

<part name="result" element="tns:getPianoAssistenzialeResponse"/>

</message>


-<message name="setRichiestaProroga">

<part name="parameters" element="tns:setRichiestaProroga"/>

<part name="attributiAutorizzativi" element="tns:attributiAutorizzativi"/>

</message>


-<message name="setRichiestaProrogaResponse">

<part name="result" element="tns:setRichiestaProrogaResponse"/>

</message>


-<message name="getPianoAssistenzialeDomiciliare">

<part name="parameters" element="tns:getPianoAssistenzialeDomiciliare"/>

<part name="attributiAutorizzativi" element="tns:attributiAutorizzativi"/>

</message>


-<message name="getPianoAssistenzialeDomiciliareResponse">

<part name="result" element="tns:getPianoAssistenzialeDomiciliareResponse"/>

</message>


-<message name="getElencoPAI">

<part name="parameters" element="tns:getElencoPAI"/>

<part name="attributiAutorizzativi" element="tns:attributiAutorizzativi"/>

</message>


-<message name="getElencoPAIResponse">

<part name="result" element="tns:getElencoPAIResponse"/>

</message>


-<message name="setOspitalitaRSA">

<part name="parameters" element="tns:setOspitalitaRSA"/>

<part name="attributiAutorizzativi" element="tns:attributiAutorizzativi"/>

</message>


-<message name="setOspitalitaRSAResponse">

<part name="result" element="tns:setOspitalitaRSAResponse"/>

</message>


-<message name="getElencoPAIDomiciliare">

<part name="parameters" element="tns:getElencoPAIDomiciliare"/>

<part name="attributiAutorizzativi" element="tns:attributiAutorizzativi"/>

</message>


-<message name="getElencoPAIDomiciliareResponse">

<part name="result" element="tns:getElencoPAIDomiciliareResponse"/>

</message>


-<portType name="PianoAssistenzialeResidenziale">


-<operation name="getPianoAssistenziale" parameterOrder="parameters attributiAutorizzativi">

<input message="tns:getPianoAssistenziale" wsam:Action="http://www.nsisr.puglia.it/Schemas/PianoAssistenzialeResidenziale/getPianoAssistenzialeRequest"/>

<output message="tns:getPianoAssistenzialeResponse" wsam:Action="http://www.nsisr.puglia.it/Schemas/PianoAssistenzialeResidenziale/getPianoAssistenzialeResponse"/>

</operation>


-<operation name="setRichiestaProroga" parameterOrder="parameters attributiAutorizzativi">

<input message="tns:setRichiestaProroga" wsam:Action="http://www.nsisr.puglia.it/Schemas/PianoAssistenzialeResidenziale/setRichiestaProrogaRequest"/>

<output message="tns:setRichiestaProrogaResponse" wsam:Action="http://www.nsisr.puglia.it/Schemas/PianoAssistenzialeResidenziale/setRichiestaProrogaResponse"/>

</operation>


-<operation name="getPianoAssistenzialeDomiciliare" parameterOrder="parameters attributiAutorizzativi">

<input message="tns:getPianoAssistenzialeDomiciliare" wsam:Action="http://www.nsisr.puglia.it/Schemas/PianoAssistenzialeResidenziale/getPianoAssistenzialeDomiciliareRequest"/>

<output message="tns:getPianoAssistenzialeDomiciliareResponse" wsam:Action="http://www.nsisr.puglia.it/Schemas/PianoAssistenzialeResidenziale/getPianoAssistenzialeDomiciliareResponse"/>

</operation>


-<operation name="getElencoPAI" parameterOrder="parameters attributiAutorizzativi">

<input message="tns:getElencoPAI" wsam:Action="http://www.nsisr.puglia.it/Schemas/PianoAssistenzialeResidenziale/getElencoPAIRequest"/>

<output message="tns:getElencoPAIResponse" wsam:Action="http://www.nsisr.puglia.it/Schemas/PianoAssistenzialeResidenziale/getElencoPAIResponse"/>

</operation>


-<operation name="setOspitalitaRSA" parameterOrder="parameters attributiAutorizzativi">

<input message="tns:setOspitalitaRSA" wsam:Action="http://www.nsisr.puglia.it/Schemas/PianoAssistenzialeResidenziale/setOspitalitaRSARequest"/>

<output message="tns:setOspitalitaRSAResponse" wsam:Action="http://www.nsisr.puglia.it/Schemas/PianoAssistenzialeResidenziale/setOspitalitaRSAResponse"/>

</operation>


-<operation name="getElencoPAIDomiciliare" parameterOrder="parameters attributiAutorizzativi">

<input message="tns:getElencoPAIDomiciliare" wsam:Action="http://www.nsisr.puglia.it/Schemas/PianoAssistenzialeResidenziale/getElencoPAIDomiciliareRequest"/>

<output message="tns:getElencoPAIDomiciliareResponse" wsam:Action="http://www.nsisr.puglia.it/Schemas/PianoAssistenzialeResidenziale/getElencoPAIDomiciliareResponse"/>

</operation>

</portType>


-<binding name="PianoAssistenzialeResidenzialePortBinding" type="tns:PianoAssistenzialeResidenziale">

<wsp1_2:PolicyReference URI="#NsisrPortBindingPolicy"/>

<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>


-<operation name="getPianoAssistenziale">

<soap:operation soapAction=""/>


-<input>

<soap:body parts="parameters" use="literal"/>

<soap:header message="tns:getPianoAssistenziale" use="literal" part="attributiAutorizzativi"/>

</input>


-<output>

<soap:body use="literal"/>

</output>

</operation>


-<operation name="setRichiestaProroga">

<soap:operation soapAction=""/>


-<input>

<soap:body parts="parameters" use="literal"/>

<soap:header message="tns:setRichiestaProroga" use="literal" part="attributiAutorizzativi"/>

</input>


-<output>

<soap:body use="literal"/>

</output>

</operation>


-<operation name="getPianoAssistenzialeDomiciliare">

<soap:operation soapAction=""/>


-<input>

<soap:body parts="parameters" use="literal"/>

<soap:header message="tns:getPianoAssistenzialeDomiciliare" use="literal" part="attributiAutorizzativi"/>

</input>


-<output>

<soap:body use="literal"/>

</output>

</operation>


-<operation name="getElencoPAI">

<soap:operation soapAction=""/>


-<input>

<soap:body parts="parameters" use="literal"/>

<soap:header message="tns:getElencoPAI" use="literal" part="attributiAutorizzativi"/>

</input>


-<output>

<soap:body use="literal"/>

</output>

</operation>


-<operation name="setOspitalitaRSA">

<soap:operation soapAction=""/>


-<input>

<soap:body parts="parameters" use="literal"/>

<soap:header message="tns:setOspitalitaRSA" use="literal" part="attributiAutorizzativi"/>

</input>


-<output>

<soap:body use="literal"/>

</output>

</operation>


-<operation name="getElencoPAIDomiciliare">

<soap:operation soapAction=""/>


-<input>

<soap:body parts="parameters" use="literal"/>

<soap:header message="tns:getElencoPAIDomiciliare" use="literal" part="attributiAutorizzativi"/>

</input>


-<output>

<soap:body use="literal"/>

</output>

</operation>

</binding>


-<service name="PianoAssistenzialeResidenzialeService">


-<port name="PianoAssistenzialeResidenzialePort" binding="tns:PianoAssistenzialeResidenzialePortBinding">

<soap:address location="https://edottotest.sanita.regione.rsr.rupar.puglia.it/nsisr/PianoAssistenzialeResidenzialeService"/>

</port>

</service>

</definitions>

所以我构建了这段代码:

string pathCertificato = @"C:\Users\michele.castriotta\Desktop\Certificati\keystore_healthnetbr.pfx";
X509Certificate2 certificatoLocale = new X509Certificate2(File.ReadAllBytes(pathCertificato), "changeit");

PianoAssistenzialeResidenzialeClient ws_Client = new PianoAssistenzialeResidenzialeClient();
ws_Client.ClientCredentials.ClientCertificate.Certificate=certificatoLocale;
ws_Client.ClientCredentials.ServiceCertificate.DefaultCertificate = certificatoLocale;

EndpointAddress addressClient = ws_Client.Endpoint.Address;
ws_Client.Endpoint.IsSystemEndpoint = true;

ws_Client.ClientCredentials.UserName.UserName = "HN";
ws_Client.ClientCredentials.UserName.Password = "changeit";

PianoAssistenzialeResidenzialeService.attributiAutorizzativi attributi = new PianoAssistenzialeResidenzialeService.attributiAutorizzativi();
attributi.identificativoServizio="getElencoPAIDomiciliare";
attributi.identificativoUtente="HN";
attributi.ruoloIstituzionale="RIS02";

ws_Client.getElencoPAIDomiciliare(attributi, new PianoAssistenzialeResidenzialeService.getElencoPAIDomiciliare());

如果我尝试运行它,我会遇到这个错误:

Unable to complete the Identity Control for MESSAGE in output . The identity of the remote DNS Expected was ' edottotest.sanita.regione.rsr.rupar.puglia.it ' But the ' remote endpoint has a certificate Supplied DNS ' HEALTHNETBR ' . If it Comes to a remote endpoint legitimate , You can solve the problem by explicitly specifying the ' identity DNS ' HEALTHNETBR ' came properties identity EndpointAddress During the Creation of the delegation of the channel

最佳答案

我已经用这段代码修正了我的错误:

EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity("HEALTHNETBR");
EndpointAddress address = new EndpointAddress(new Uri("https://edottotest.sanita.regione.rsr.rupar.puglia.it/nsisr/PianoAssistenzialeResidenzialeService"), identity);
ws_Client.Endpoint.Address = address;

关于c# - 如何从 ssl 证书和签名属性调用 Soap web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31179311/

相关文章:

c# - 地址不工作

c# - 自定义 UIRefreshControl 动画

c# - 使用Prism 4的完整示例应用程序

java - 如果我仅使用 Web 服务,如何实现 SPARQL 端点公共(public)

windows - 尝试在 Windows 上的 Kafka 中实现 SSL/TLS 时出现 java.lang.OutOfMemory 错误

c# - 调试时显示奇怪的对象成员

java - 调用 url 并使用 HttpGet 发送 JSONObject

python - 将复杂数据类型与 python SUDS 客户端一起使用

c++ - 简单 QSsl 客户端/服务器 : cannot start handshake on non-plain connection

ssl - Datalab 连接问题 || SSL 握手错误