503错误消耗第三部分Soap webservice使用TLS 1.2和客户端证书身份验证与WCF

时间:2017-10-04 07:39:12

标签: vb.net web-services wcf soap tls1.2

我在使用Soap Web Service(w / att。)和需要客户端证书身份验证的MTOM时遇到了问题(相互?)。

在写下我已经尝试的内容之前,我会告诉你我为了获得客户证书而做了什么:

  1. 我使用openssl command openssl genrssa -out mykey.key 2048
  2. 生成了 RSA密钥
  3. 使用此密钥,我生成了 CSR openssl req -new -key mykey.key -out mycsr.csr
  4. 我已将此CSR发送给网络服务所有者,以便获得客户端证书,他们给了我一张签名证书:certificate.cer
  5. 现在我已获得客户端证书,我已将其添加到受信任的根证书颁发机构下的证书存储区中。

    现在代码:

    首先,我在Visual Studio中创建了一个测试项目,并使用服务的WSDL添加了一个服务引用。

    然后我写了几行代码:

    ' Setting TLS 1.2 protocol '
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
    ServicePointManager.ServerCertificateValidationCallback = Function(sender1, certificate, chain, sslPolicyErrors)
                                                                  Return True
                                                              End Function
    
    'Creating endpoint and binding'
    Dim endpoint As EndpointAddress = New EndpointAddress("https://myWebService.it/service-page")
    Dim sslBinding As BasicHttpBinding = New BasicHttpBinding(BasicHttpSecurityMode.Transport)
    
    'Setting CredentialType = Certificate'
    sslBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate
    
    'Getting the client certificate from the store'
    Dim coll = New X509Store(StoreName.My, StoreLocation.CurrentUser)
    coll.Open(OpenFlags.ReadOnly)
    Dim cert = coll.Certificates.Find(X509FindType.FindByThumbprint, "76DB1454D4B25ACEAF2BAE465C310E3119278792", True)
    
    'Creating the service'
    Dim svc As SdITrasmissioneFileClient = New SdITrasmissioneFileClient(sslBinding, endpoint)
    
    'Setting the certificate inside client credentials'
    svc.ClientCredentials.ClientCertificate.Certificate = cert(0)
    
    svc.Open()
    
    'Calling the service'
    Dim resp As RispostaEsito_Type = svc.Esito(New Esito_Type() With {.IDFile = "4454555"})
    
    svc.Close()
    

    对我来说看起来很简单,但是当我执行我的代码时,我得到了一个

      

    System.ServiceModel.Security.MessageSecurityException :'HTTP   请求被禁止使用客户端身份验证方案'Anonymous'。'

         

    内部异常:WebException:远程服务器错误:(403)禁止

    接下来,我使用Fiddler和Wireshark分析了流量,我发现在客户端和服务器之间的TLS握手期间,客户端不会将证书发送到服务器。

    enter image description here

    现在我不明白为什么,即使我将证书添加到客户端凭据,它也不会发送到目的地

1 个答案:

答案 0 :(得分:0)

经过大量阅读后,我发现了我所缺少的东西:

  • 客户端证书.cer不包含私钥!

我做了什么:

  1. 我使用以下命令转换了PEM格式的.cer文件:

    openssl x509 -inform der -in ClientCert.cer -out ClientCert.pem

  2. 我使用私钥创建了.pfx证书:

    openssl pkcs12 -export -in ClientCert.pem -inkey mykey.key -out ClientCert.pfx

  3. 然后安装.pfx证书就像魅力一样。

    我希望有人觉得它很有用。