2017-10-04 3 views
0

J'ai un problème à consommer un service Web de savon (w/att.) Et MTOM qui nécessite l'authentification du certificat client (mutuelle?).503 erreur consommant thirdy part Soap webservice utilisant TLS 1.2 et l'authentification du certificat client avec WCF

Avant d'écrire ce que je l'ai déjà essayé, je vous montre ce que je l'ai fait pour recevoir un certificat client: Avec cette touche

  1. J'ai produit une clé RSA avec openssl command openssl genrssa -out mykey.key 2048
  2. i « ai généré CSR: openssl req -new -key mykey.key -out mycsr.csr
  3. J'ai envoyé ce CSR au propriétaire du service Web afin de recevoir un certificat client , et on m'a donné un certi signé ficat: certificate.cer

Maintenant que je l'ai obtenu mon certificat client je l'ai ajouté dans mon magasin de certificats sous autorité de certification racine de confiance.

Maintenant le code:

d'abord tout ce que je créé un projet de test dans Visual Studio et j'ai ajouté un service de référence en utilisant le WSDL du service.

Puis je l'ai écrit quelques lignes de code:

' 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() 

Il est très simple pour moi, mais quand j'exécute mon code je reçois un

System.ServiceModel.Security.MessageSecurityException: 'The HTTP request was forbidden with client authentication scheme 'Anonymous'.'

Internal Exception: WebException: Remote Server Error: (403) Forbidden

Next i analysé le trafic en utilisant Fiddler et Wireshark et j'ai découvert que, pendant l'établissement de liaison TLS entre le client et le serveur, le client n'envoie pas le certificat au serveur.

enter image description here

Maintenant, je ne comprends pas la raison pour laquelle, même si j'ajouté le certificat d'identification du client, il n'est pas envoyé à la destination.

Répondre

0

Après beaucoup de lectures, je découvre ce que je manque:

  • Le certificat client .cer ne contient pas la clé privée!

ce que je faisais:

  1. I converti .cer fichier au format PEM avec la commande suivante:

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

    -out
  2. J'ai créé un certificat .pfx avec ma clé privée:

    OpenSSL pkcs12 -export -dans ClientCert.p em -inkey mykey.key -out ClientCert.Ensuite, l'installation du certificat .pfx fonctionne comme un charme. pfx

J'espère que quelqu'un le trouvera utile.