簡體   English   中英

如何使用帶有客戶端證書的HTTPS傳輸來簽署帶有證書的WCF消息

[英]How To Sign WCF Message With Certificate Using HTTPS Transport with Client Certificate

編輯:

我終於確定IClientMessageInspector似乎沒有反映消息簽名,因此當我在我的請求中實際獲得簽名時我不知道它。 所以現在我的新問題真正存在......

如何配置WCF客戶端以呈現SSL客戶端證書並簽署SOAP頭?

var myBinding = new BasicHttpBinding();
myBinding.Security.Mode = BasicHttpSecurityMode.TransportWithMessageCredential;
myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
myBinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;

這將導致標題具有已簽名的時間戳。 但是,客戶端證書不再顯示,我沒有通過SSL。 如果我將第二行更改為:

myBinding.Security.Mode = BasicHttpSecurityMode.Transport;

然后我通過SSL但我的SOAP標頭不再有簽名塊。

有什么方法可以讓我得到HttpWebRequest,這樣我就可以手動附加SSL客戶端證書了嗎?

webRequest.ClientCertificates.Add(certLoader.Load(@"c:\somecert.pfx"));

原始問題

我正在開發一個WCF客戶端,它需要與使用Forum Sentry網絡設備來保護訪問權限的第三方提供的服務互操作。 它們需要SSL與傳輸級別的客戶端證書以及帶有簽名的o:Security元素,並使用標頭中的證書。 我能夠通過標准綁定實現其中一個或另一個,但我似乎無法同時發生這兩種情況。 理想情況下,他們希望使用與SSL客戶端證書不同的證書簽名的消息,但他們說我們可以使用相同的證書進行SSL客戶端身份驗證並簽署消息。

此時我願意做任何事情以使其工作,包括在必要時使用CustomBinding。

我可以使用以下方法使SSL部分工作:

var myBinding = new BasicHttpBinding();
myBinding.Security.Mode = BasicHttpSecurityMode.Transport;
myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
var url = "https://blah.com/services/somservice";
EndpointAddress ea = new EndpointAddress(url);
var client = new SoapClient(myBinding, ea);
var certLoader = new CertificateLoader("password");
client.ClientCredentials.ClientCertificate.Certificate = certLoader.Load(@"c:\somecert.pfx");
var resp = client.somemethod(ref profile, new RequestType { version = RequestTypeVersion.Item100 });

請發布樣本工作肥皂(例如供應商提供的肥皂)。 順便說一句,有比使用自定義綁定更激烈的動作:)

編輯:要使用傳輸和郵件安全性,您需要自定義綁定。 谷歌為“wcf綁定轉換器”自動執行此操作。 在自定義綁定而不是http元素中將其更改為https並使用屬性requirevlientcertificate。 對不起拼寫我在手機上

編輯:

var c = new CustomBinding();            
MessageSecurityVersion version = MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10;
var sec = SecurityBindingElement.CreateCertificateOverTransportBindingElement(version);
c.Elements.Add(sec);
c.Element.Add(new TextMessageEncodingBindingElement() { MessageVersion = MessageVersion.Soap11 };)
c.Elements.Add(new HttpsTransportBindingElement() { RequireClientCertificate = true });

這很丑陋,但完成了工作。 如果你在調試器中查看每個自定義綁定的元素,你會看到即使它們的堆棧底部都有一個HttpsTransportBindingElement,TransportWithMessageCredential實例也會將RequireClientCertificate設置為false以及其他幾個私有成員。與證書設置為false有關。 Transport實例將這些成員設置為true。 這顯然是WCF,IMO的錯誤。

下面的代碼從customTransportSecurityBinding獲取“good”HttpsTransportBindingElement,並替換customMessageCredentialBinding中的“bad”。 然后,將修改后的customMessageCredentialBinding傳遞給客戶端構造函數。

    var transportSecurityBinding = new BasicHttpBinding();
    transportSecurityBinding.Security.Mode = BasicHttpSecurityMode.Transport;
    transportSecurityBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
    transportSecurityBinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;
    var customTransportSecurityBinding = new CustomBinding(transportSecurityBinding);

    var messageCredentialBinding = new BasicHttpBinding();
    messageCredentialBinding.Security.Mode = BasicHttpSecurityMode.TransportWithMessageCredential;
    messageCredentialBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
    messageCredentialBinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;
    var customMessageCredentialBinding = new CustomBinding(messageCredentialBinding);

    // replace transport binding element from message credential binding with the transportSecurityBinding transport binding
    // which will include the cert for SSL mutual auth.
    customTransportSecurityBinding.Elements[customTransportSecurityBinding.Elements.Count - 1] = customMessageCredentialBinding.Elements[customMessageCredentialBinding.Elements.Count - 1];

var client = new SomeSoapClient(customTransportSecurityBinding, ea);

如果有人為上述答案尋找app.config版本的自定義綁定:

<bindings>
      <customBinding>
        <binding name="SignedMessageBinding">
          <security messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10" /> 
          <textMessageEncoding messageVersion="Soap11" />
          <httpsTransport requireClientCertificate="true"  />
        </binding>
      </customBinding>
</bindings>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM