2012-07-30 3 views
3

Я разработал службу WCF, использующую транспортную безопасность с требуемым сертификатом клиента. Он размещен на IIS 7.5 и требует проверки сертификата клиента. Я установил mex endpoint и могу просмотреть wsdl в своем браузере по номеру https://mydomain.com/Folder/Service.svc/mex?wsdl. Использование SoapUI, я могу успешно подключиться, и сервис работает отлично.WCF svcutil с сертификатом клиента

Тем не менее, я хочу настроить тестовый клиент, используя svcutil.exe, потому что это то, что мой клиент будет делать для создания своего клиента. Но, когда я бегу:

SvcUtil https://mydomain.com/Folder/Service.svc/mex?wsdl /svcutilConfig:app.config

Я получаю следующее сообщение об ошибке:

C:\Program Files\Microsoft Visual Studio 9.0\VC>svcutil https://mydomain.com/Folder/Service.svc/mex?wsdl /svcutilConfig:app.config 
Microsoft (R) Service Model Metadata Tool 
[Microsoft (R) Windows (R) Communication Foundation, Version 3.0.4506.2152] 
Copyright (c) Microsoft Corporation. All rights reserved. 

Attempting to download metadata from 'https://mydomain.com/Folder/Service.svc/mex?wsdl' using WS-Metadata Exchange or DISCO. 
Microsoft (R) Service Model Metadata Tool 
[Microsoft (R) Windows (R) Communication Foundation, Version 3.0.4506.2152] 
Copyright (c) Microsoft Corporation. All rights reserved. 

Error: Cannot obtain Metadata from https://mydomain.com/Folder/Service.svc/mex?wsdl 

If this is a Windows (R) Communication Foundation service to which you have access, please check that you have enabled metadata publishing at the specified address. For help enabling metadata publishing, please refer to the MSDN documentation at http://go.microsoft.com/fwlink/?LinkId=65455. 

WS-Metadata Exchange Error 
URI: https://mydomain.com/Folder/Service.svc/mex?wsdl 

Metadata contains a reference that cannot be resolved: 'https://mydomain.com/Folder/Service.svc/mex?wsdl'. 

The HTTP request was forbidden with client authentication scheme 'Anonymous'. 

The remote server returned an error: (403) Forbidden. 

HTTP GET Error 
URI: https://mydomain.com/Folder/Service.svc/mex?wsdl 

There was an error downloading 'https://mydomain.com/Folder/Service.svc/mex?wsdl'. 

The request failed with HTTP status 403: Forbidden. 

Вот соответствующая конфигурация из моего файла web.config сервера:

<system.serviceModel> 
<bindings> 
    <wsHttpBinding> 
    <binding name="MyServices"> 
     <security mode="Transport"> 
     <transport clientCredentialType="Certificate"/> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 
<services> 
    <service behaviorConfiguration="ServiceBehavior" name="MyService.MyServiceManager"> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="MyServices" 
    name="MyServices" contract="MyService.IMyServiceManager"> 
     <identity> 
     <dns value="mydomain.com" /> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="wsHttpBinding" bindingConfiguration="MyServices" 
     name="mexEndpoint" contract="IMetadataExchange"/> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="ServiceBehavior"> 
     <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
     <serviceMetadata httpsGetEnabled="true" httpsGetUrl="https://mydomain.com:443/Folder/Service.svc/mex"/> 
     <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
     <serviceDebug includeExceptionDetailInFaults="false"/> 
     <serviceCredentials> 
     <clientCertificate> 
      <certificate storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectDistinguishedName" findValue="CN=tempClientcert"/> 
     </clientCertificate> 
     </serviceCredentials> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

Здесь мой клиент /svcutilConfig:app.config файл:

<configuration> 
    <system.serviceModel> 
     <client> 
      <endpoint name="mexEndpoint" address="mex" binding="wsHttpBinding" contract="IMetadataExchange" behaviorConfiguration="MyBehavior" /> 
     </client> 
     <behaviors> 
      <endpointBehaviors> 
       <behavior name="MyBehavior"> 
        <clientCredentials> 
         <clientCertificate storeName="My" storeLocation="LocalMachine" x509FindType="FindBySubjectDistinguishedName" findValue="CN=tempClientcert" /> 
        </clientCredentials> 
       </behavior> 
      </endpointBehaviors> 
     </behaviors> 
    </system.serviceModel> 
</configuration> 

Я не могу понять, почему эта конфигурация не будет работать. Кроме того, все импорт wsdl разрешает правильный URL-адрес FQDN, а анонимная аутентификация включена в IIS.

Любая помощь будет оценена по достоинству. Спасибо за вашу помощь.

ответ

2

Хит тоже. Единственное, о чем я могу думать, это то, что вы ссылаетесь на сертификат, который не может быть найден, svcutil, похоже, просто не работает должным образом в этом случае. Был ли этот сертификат определенно в правильном магазине и имел это выдающееся имя (а не только «регулярное» название темы)?

В любом случае, я решил эту проблему достаточно долго, чтобы я решил написать сообщение в блоге о том, как это сделать, это доступно здесь: http://blogs.msdn.com/b/stephens_scratchpad/archive/2012/12/19/client-certificates-for-https-wcf-services.aspx - надеюсь, что это поможет кому-то!

0

Старый вопрос, но мне нужно было изменить клиентский сертификат после его истечения (после этого он не работает), но после его изменения браузер работал с конечной точкой wsdl, но svcutil не выполнял его, и это было вызвано Windows менеджер учетных данных, в котором вы можете хранить сертификаты по URL-адресам для автоматической загрузки при обращении к URL-адресу.

Я забыл обновить менеджер учетных данных новым сертификатом!

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