Проблема с клиентскими сертификатами WCF в приложении ASP.NET, размещенном на IIS 7.5 - PullRequest
2 голосов
/ 11 августа 2011

У меня есть служба WCF, которую мне нужно вызвать в веб-приложении ASP.NET, размещенном на IIS 7.5. Эта служба WCF использует безопасность транспорта с сертификатами клиента. Мне предоставляется сертификат клиента, который я установил с помощью mmc в папке «Local Computer / Personal». .Pfx установил 2 других сертификата (без закрытого ключа), которые являются CA для моего сертификата клиента с закрытым ключом. Я назначаю сертификат во время выполнения, поскольку в будущем у меня могут быть другие сертификаты, которые будут использоваться с той же веб-службой.

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

Для моего веб-приложения, работающего под ApplicationPoolIdentity, при вызове веб-службы выдается исключение MessageSecurityException с внутренним WebException (403 Forbidden), как если бы я вообще не передавал сертификат клиента. Фактически не установка действительного сертификата будет происходить через InvalidOperationException, если конфигурация требует этого. Если я запускаю под учетной записью администратора, то исключение не выдается. Мне нужно иметь возможность вызывать веб-сервис в ApplicationPoolIdentity.

Редактировать: Я думаю, что здесь может быть проблема с цепочкой сертификатов ...

Что я пробовал до сих пор:

  1. В MMC: MyCertificate -> All Tasks -> Manage Private Keys ... Я дал разрешение на управление закрытыми ключами для IIS_IUSRS
  2. Добавлен доступ для чтения к IIS_IUSRS для C: \ ProgramData \ Microsoft \ Crypto \ RSA
  3. Я использовал трассировку System.Net и сравнил журналы ApplicationPoolIdentity и мою учетную запись администратора. Все выглядит одинаково до определенного момента ниже, после " У нас есть предоставленные пользователем сертификаты. Сервер указал 24 эмитента (ов). Ищем сертификаты, которые соответствуют любому из эмитентов. " строка

Журнал ApplicationPoolIdentity:

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.

Журнал учетной записи администратора:

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]

Ответы [ 2 ]

0 голосов
/ 15 июня 2012

У нас была такая же проблема здесь. Это было решено путем размещения сертификатов в цепочке в соответствующих местах. Используя учетную запись администратора, при установке сертификата в личную папку хранилища локального компьютера он помещал промежуточные сертификаты в ту же папку. Перемещение их в папку «Промежуточные центры сертификации» предоставило ApplicationPoolIdentity доступ ко всей цепочке.

0 голосов
/ 28 августа 2011

Как идея - почему бы просто не указать в конфигурации вашего веб-приложения сертификаты для отправки? Если требования к сертификатам изменились, просто добавьте в web.config своего веб-приложения. Посмотрите, как клиент настроен здесь, например: http://www.codeproject.com/KB/WCF/Senthil.aspx

<identity><certificate encodedValue="AwAAAAEAAAAUAAAAOTDk6LO4LsMQaY+65EgACb==" /></identity>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...