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:
- 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
- Ajouté accès en lecture à IIS_IUSRS C: \ ProgramData \ Microsoft \ Crypto \ RSA
- 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]
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
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