2013-10-01 5 views
2

Таким образом, я полностью потерял сертификаты. Я искал по всему Интернету решения и учебные пособия для этого и не нашел ничего, что действительно могло бы мне помочь. То, что я пытаюсь сделать, - это проверить как сервер, так и клиентский сертификат для моего клиент-серверного приложения WCF. Приложение размещено в IIS. Я хочу, чтобы это было на моем компьютере-разработчике (сервер - localhost) и в тесте (где im клиент и сервер - сервер Windows).Аутентификация сертификата клиента WCF

конфигурация у меня сейчас:

Клиент:

<behaviors> 
    <endpointBehaviors> 
    <behavior name="myBehaviorConfig"> 
     <clientCredentials> 
     <clientCertificate findValue="CN=MyTestClientCertificate" 
          storeLocation="LocalMachine" 
          x509FindType="FindBySubjectDistinguishedName"/> 
     </clientCredentials> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

<bindings> 
    <wsHttpBinding> 
    <binding name="MyBindingConfig"> 
     <security mode="TransportWithMessageCredential"> 
     <transport realm=""/> 
     <message clientCredentialType="Certificate"/> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 

<client> 
    <endpoint address="https://localhost/Service.Calculator.svc" 
      binding="wsHttpBinding" 
      bindingConfiguration="MyBindingConfig" 
      behaviorConfiguration="MyBehaviorConfig" 
      contract="Service.ICalculator" 
      name="ICalculatorServiceEndpoint"> 
    <identity> 
     <servicePrincipalName value="host"/> 
    </identity> 
    </endpoint>  
</client> 

Сервер:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="myBehavior"> 
     <serviceCredentials> 
     <serviceCertificate findValue="CN=MyTestRootCA" 
          storeLocation="LocalMachine" 
          x509FindType="FindBySubjectDistinguishedName"/> 
     <userNameAuthentication userNamePasswordValidationMode="Windows"/> 
     <clientCertificate> 
      <authentication certificateValidationMode="PeerOrChainTrust"/> 
     </clientCertificate> 
     </serviceCredentials> 
     <serviceMetadata httpsGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
     <unity operationContextEnabled="true" 
      instanceContextEnabled="true" 
      contextChannelEnabled="true" 
      serviceHostBaseEnabled="true"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

<bindings> 
    <wsHttpBinding> 
    <binding name="MyBinding"> 
     <security mode="TransportWithMessageCredential"> 
     <transport realm=""/> 
     <message clientCredentialType="Certificate"/> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 

<services> 
    <service name="Service.Calculator" 
      behaviorConfiguration="myBehavior"> 
    <endpoint address="" 
       binding="wsHttpBinding" 
       bindingConfiguration="MyBinding" 
       contract="Service.ICalculator" /> 
    <endpoint address="mex" 
       binding="mexHttpsBinding" 
       contract="IMetadataExchange" 
       name="CalculatorServiceMex" /> 
    </service> 
</services> 

"CN = MyTestRootCA" является "орган" "Создание" сертификата и я поместите его в доверенные корневые сертификаты на локальном компьютере, а также в личную директорию на локальном компьютере. И он является эмитентом клиентского сертификата «CN = MyTestClientCertificate».

Немногие вещи ..

Я знаю, что сертификат клиента должен находиться в директории CurretUser в «MMC», но когда его там у меня есть исключение, что приложение не может найти сертификат. Я попытался найти его с помощью «FindBySubjectDistinguishedName» и с «FindByThumbprint», и время было тем же самым исключением «Cant find certificate с данными критериями ...», поэтому я поместил его в LocalMachine и его штраф. У кого-нибудь есть идея, почему это не сработало?

У меня было много проблем и исключений с этим = \ токами один: «Секретный ключ не представлен в сертификате X.509» , кто знаком с этим исключением и знает, как это исправить?

Большое спасибо за ваши ответы, я сижу на этом в течение нескольких дней, теперь

ответ

1

Ваш файл конфигурации не определяет значение ClientCertificate StoreLocation, поэтому сертификат клиента должен быть в LocalMachine магазине, который Значение по умолчанию Значение для storeLocation.

Рассмотрим следующий пример из msdn, который устанавливает сертификат клиента магазина местоположение:

<clientCertificate> 
    <certificate 
     findValue="www.cohowinery.com" 
     storeLocation="CurrentUser" 
     storeName="TrustedPeople" 
     x509FindType="FindByIssuerName" /> 
    <authentication … 

Примечание: другая ошибка, «Секретный ключ не представлен в сертификате X.509», в основном, вероятно, выброшен потому что у вашего сертификата нет связанного закрытого ключа или пользовательский контекст вашего процесса не имеет разрешения на доступ к закрытому ключу.

+0

Я указал местоположение хранилища сертификата клиента в конфигурации клиента. Код, который вы предлагали, должен быть в конфигурации сервера? и если да, то какой сертификат я должен указать, сертификат клиента находится на компьютере клиента. и относительно второй ошибки, у меня фактически есть закрытый ключ, и я использовал его для создания сертификата клиента, но не более того. Нужно ли мне что-то делать с этим? например, разместить его в определенном месте или добавить его в конфигурацию? – user2834816

Смежные вопросы