2011-08-11 3 views
2

J'ai un service WCF que j'ai besoin d'appeler dans une application Web ASP.NET hébergée sur IIS 7.5. Ce service WCF utilise la sécurité du transport avec des certificats clients. Je reçois un certificat client que j'ai installé en utilisant mmc dans l'emplacement du magasin "Local Computer/Personal". Le .pfx a installé 2 autres certificats (aucune clé privée) qui sont CA pour mon certificat client avec clé privée. J'attribue le certificat à l'exécution, car il se peut que d'autres certificats soient utilisés avec le même service Web à l'avenir.Problème avec les certificats clients WCF dans une application ASP.NET hébergée sur IIS 7.5

wcfClient.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySerialNumber, "XXXXXXXXXXXXXXXXXXXXXX"); 
// debugging shows that client certificate was found 
var result = wcfClient.CallMyMethod(); 

Pour mon application Web en cours d'exécution sous ApplicationPoolIdentity appeler le webservice lancers francs MessageSecurityException avec un WebException intérieur (403 Forbidden) comme si je ne porte pas de certificat client du tout. En fait, ne pas définir un certificat valide passera par une exception InvalidOperationException si la configuration l'exige. Si je cours sous un compte d'administrateur, alors aucune exception n'est levée. Je dois pouvoir appeler le webservice sous ApplicationPoolIdentity.

Edit: Je pense que la chaîne de certificats est peut-être la question ici ...

Ce que j'ai essayé jusqu'à présent:

  1. Dans MMC: MonCertificat -> Toutes les tâches -> Gérer les clés privées. .. J'ai donné la permission pour la gestion des clés privées à IIS_IUSRS
  2. Ajouté accès en lecture à IIS_IUSRS C: \ ProgramData \ Microsoft \ Crypto \ RSA
  3. Je l'ai utilisé System.Net le suivi et je l'ai comparé les journaux pour ApplicationPoolIdentity et mon compte administrateur. Tout le même aspect jusqu'à un certain point au-dessous, après « Nous avons des certificats fournis par l'utilisateur. Le serveur a spécifié 24 émetteur (s). Vous cherchez des certificats correspondant à l'un des émetteurs. » ligne

ApplicationPoolIdentity log:

System.Net Information: 0 : [5436] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=CredentialsNeeded). 
System.Net Information: 0 : [5436] SecureChannel#20350898 - We have user-provided certificates. The server has specified 24 issuer(s). Looking for certificates that match any of the issuers. 
System.Net Information: 0 : [5436] SecureChannel#20350898 - Left with 0 client certificates to choose from. 
System.Net Information: 0 : [5436] Using the cached credential handle. 
System.Net Information: 0 : [5436] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = fc5d070:1ffd1d0, targetName = ws.allianztiriac.ro, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation) 
System.Net Information: 0 : [5436] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=349, returned code=ContinueNeeded). 
System.Net Information: 0 : [5436] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = fc5d070:1ffd1d0, targetName = ws.allianztiriac.ro, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation) 
System.Net Information: 0 : [5436] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=ContinueNeeded). 
System.Net Information: 0 : [5436] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = fc5d070:1ffd1d0, targetName = ws.allianztiriac.ro, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation) 
System.Net Information: 0 : [5436] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=OK). 
System.Net Information: 0 : [5436] Remote certificate: [bla bla remote certificate] 
System.Net Information: 0 : [5436] SecureChannel#20350898 - Remote certificate was verified as valid by the user. 

journal de compte Admin:

System.Net Information: 0 : [5952] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=CredentialsNeeded). 
System.Net Information: 0 : [5952] SecureChannel#60080036 - We have user-provided certificates. The server has specified 24 issuer(s). Looking for certificates that match any of the issuers. 
System.Net Information: 0 : [5952] SecureChannel#60080036 - Selected certificate: [Bla bla bla client cert info] 
System.Net Information: 0 : [5952] SecureChannel#60080036 - Left with 1 client certificates to choose from. 
System.Net Information: 0 : [5952] SecureChannel#60080036 - Trying to find a matching certificate in the certificate store. 
System.Net Information: 0 : [5952] SecureChannel#60080036 - Locating the private key for the certificate: [Bla bla bla client cert info] 
System.Net Information: 0 : [5952] SecureChannel#60080036 - Certificate is of type X509Certificate2 and contains the private key. 
System.Net Information: 0 : [5952] AcquireCredentialsHandle(package = Microsoft Unified Security Protocol Provider, intent = Outbound, scc  = System.Net.SecureCredential) 
System.Net Information: 0 : [5952] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4e5bb48:1fff710, targetName = ws.allianztiriac.ro, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation) 
System.Net Information: 0 : [5952] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=5718, returned code=ContinueNeeded). 
System.Net Information: 0 : [5952] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4e5bb48:1fff710, targetName = ws.allianztiriac.ro, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation) 
System.Net Information: 0 : [5952] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=ContinueNeeded). 
System.Net Information: 0 : [5952] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4e5bb48:1fff710, targetName = ws.allianztiriac.ro, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation) 
System.Net Information: 0 : [5952] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=OK). 
System.Net Information: 0 : [5952] Remote certificate: [bla bla bla remote certificate] 
+0

Avez-vous essayé les étapes décrites ici [link] (http://serverfault.com/questions/131046/how-to-grant-iis-7-5-access-to-a-certificate-in-certificate- le magasin)? – Hans

+0

J'ai donné l'autorisation en utilisant mmc, IIS a un contrôle total sur les clés privées de cert. Le certificat n'est pas envoyé. J'ai un service Web différent qui utilise des certificats de client et aucun problème avec celui fonctionnant sur ApplicationPoolIdentity. – Vasea

Répondre

0

Nous avons eu le même problème ici. Il a été résolu en s'assurant que les certificats de la chaîne étaient placés dans les emplacements appropriés. À l'aide d'un compte administratif, lors de l'installation du certificat dans le dossier Personnel du magasin Local Machine, il a placé les certificats intermédiaires dans le même dossier. En les déplaçant dans le dossier Intermediate Certification Authorities, vous avez fourni l'accès ApplicationPoolIdentity à la chaîne complète.

0

Comme une idée - pourquoi ne pas simplement spécifier dans la configuration de votre application web les certificats d'envoyer plus? Si les exigences du certificat changent, ajoutez simplement le fichier web.config de votre application Web. Voyez comment le client est configuré ici par exemple: http://www.codeproject.com/KB/WCF/Senthil.aspx

<identity><certificate encodedValue="AwAAAAEAAAAUAAAAOTDk6LO4LsMQaY+65EgACb==" /></identity> 
+0

J'ai de nombreux certificats clients pour le même service web qui sera sélectionné lors de l'exécution en fonction de la session/de l'utilisateur en cours.Il n'y a pas non plus de problème pour accéder à la clé privée - j'ai essayé de lire X509Store, en les ouvrant directement à partir d'un fichier PKCS - tout fonctionne. Mais avec AppPoolIdentity, le serveur distant renvoie 403 Interdit comme si je n'envoyais pas de certificat du tout. Le traçage system.net montre qu'il a quelque chose à voir avec les chaînes de certificats, du moins je le crois. – Vasea

Questions connexes