2012-07-14 11 views
11

Problem:Certyfikaty X.509 na WCF?

Opracowuję ten program na jednym komputerze.

Usługa działa poprawnie w serwerze rozwoju, ale gdy próbuję hosta usługi IIS daje mi błąd, że:

nie można znaleźć certyfikatu X.509, stosując następujące kryteria wyszukiwania: StoreName ' Moje ', StoreLocation' CurrentUser ', FindType' FindBySubjectName ', FindValue' WCFServer '.

Czy jest tak czy inaczej mogę rozwiązać ten problem? Próbuję ten kod z

http://www.codeproject.com/KB/WCF/9StepsWCF.aspx

tworzenia certyfikat

makecert.exe -sr CurrentUser -ss My -a sha1 -n CN=WCfServer -sky exchange -pe 
makecert.exe -sr CurrentUser -ss My -a sha1 -n CN=WcfClient -sky exchange -pe 

Certyfikat jest obecny w osobistym i zaufanym osobom w folderze MMC

Serwis posiada jedną funkcję, która przyjmuje i numer zwraca ciąg i działa dobrze

To jest moja usługa web.config:

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="wsHttpEndpointBinding"> 
      <security> 
      <message clientCredentialType="Certificate" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <services> 
     <service name="WCFServiceCertificate.Service1" behaviorConfiguration="WCFServiceCertificate.Service1Behavior"> 
     <!-- Service Endpoints --> 
     <endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsHttpEndpointBinding" contract="WCFServiceCertificate.IService1"> 
      <!-- 
       Upon deployment, the following identity element should be removed or replaced to reflect the 
       identity under which the deployed service runs. If removed, WCF will infer an appropriate identity 
       automatically. 
      --> 
      <!--<identity> 
      <dns value="localhost"/> 
      </identity>--> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="WCFServiceCertificate.Service1Behavior"> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!-- 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> 
       <authentication certificateValidationMode="PeerTrust"/> 
      </clientCertificate> 
      <serviceCertificate findValue="WcfServer" 
           storeLocation="CurrentUser" 
           storeName="My" 
           x509FindType="FindBySubjectName" /> 
      </serviceCredentials> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

To jest mój klient Config

<system.serviceModel> 
       <bindings> 
    <wsHttpBinding> 
    <binding name="WSHttpBinding_IService1" closeTimeout="00:01:00" 
    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
    maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" 
    textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> 
    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
     maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
    <reliableSession ordered="true" inactivityTimeout="00:10:00" 
     enabled="false" /> 
    <security mode="Message"> 
     <transport clientCredentialType="Windows" proxyCredentialType="None" 
     realm="" /> 
     <message clientCredentialType="Certificate" negotiateServiceCredential="true" 
     algorithmSuite="Default" establishSecurityContext="true" /> 
    </security> 
    </binding> 
    </wsHttpBinding> 
    </bindings> 
       <client> 
    <endpoint address="http://localhost:1387/Service1.svc" behaviorConfiguration="CustomBehavior" 
    binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService1" 
    contract="ServiceReference1.IService1" name="WSHttpBinding_IService1"> 
    <identity> 
    <certificate encodedValue="AwAAAAEAAAAUAAAA9YoGKvsMLFkeO1WjaCLReQuz1ysgAAAAAQAAALUBAAAwggGxMIIBX6ADAgECAhDDvb3bnmzhsERpNTWEBYQXMAkGBSsOAwIdBQAwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3kwHhcNMTEwMzA0MDcwNzU3WhcNMzkxMjMxMjM1OTU5WjAUMRIwEAYDVQQDEwlXY2ZTZXJ2ZXIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM9e4DwCDYJ4l6myt1QadHzXoqCH2wa1aUjiab1aK/7d/1LZ00KfPJw8kKB358serjEi9SMg0UeyGtl0+byJ8PqShfv4MUTHZcPaWy99vHaYHwH7T9hVwY5RANBWyFy6nf1rXDh/cB2qm0Q/xN5xElOtheFqUoL8Ua6fcP33BAWPAgMBAAGjSzBJMEcGA1UdAQRAMD6AEBLkCS0GHR1PAI1hIdwWZGOhGDAWMRQwEgYDVQQDEwtSb290IEFnZW5jeYIQBjdsAKoAZIoRz7jUqlw19DAJBgUrDgMCHQUAA0EAKlaHJQNdC9VgPuHlVuniQJd+fHoVOU62nl374iXYdQus5KDgKz9RHWAtjhpToBB4sOXOnwTkJfcyJWBf6J14Mw==" /> 
    </identity> 
    </endpoint> 
    </client> 
       <behaviors> 
         <endpointBehaviors> 
           <behavior name="CustomBehavior"> 
             <clientCredentials> 
               <clientCertificate findValue="WcfClient" 
           x509FindType="FindBySubjectName" 
           storeLocation="CurrentUser" 
           storeName="My"/> 
               <serviceCertificate> 
                 <authentication certificateValidationMode="PeerTrust"/> 
               </serviceCertificate> 
             </clientCredentials> 
           </behavior> 
         </endpointBehaviors> 
       </behaviors> 
     </system.serviceModel> 

i po prostu wywołanie usługi po stronie klienta przy użyciu tego

Service1Client obj = new Service1Client(); 
      Response.Write(obj.GetData(12)); 

Teraz kiedy biegnę wszystko działa bez problemu.

Ponieważ usługi można uruchamiać na serwerze programistycznym.

Ale gdy próbuję hosta usługi IIS to wyskakuje mi błąd że

nie można znaleźć certyfikatu X.509, stosując następujące kryteria wyszukiwania: StoreName „my”, „” StoreLocation CurrentUser, FindType "FindBySubjectName", FindValue "WCFServer".

Czy jest tak czy inaczej mogę rozwiązać ten problem?

Odpowiedz

13

Jako wspomniana nazwa, Cassini będzie działać jako bieżący użytkownik, ale usługi IIS będą działać jako IUSR.Importowanie certyfikatu z kluczem prywatnym, w LocalMachine \ osobistej (LocalMachine \ MY) i zmienić config usług z tego:

 <serviceCertificate findValue="WcfServer" 
          storeLocation="CurrentUser" 
          storeName="My" 
          x509FindType="FindBySubjectName" /> 

do tego:

 <serviceCertificate findValue="WcfServer" 
          storeLocation="LocalMachine" 
          storeName="My" 
          x509FindType="FindBySubjectName" /> 
0

Oczywiście nie znaleziono certyfikatu w skonfigurowanej lokalizacji. Upewnij się, jakiego użytkownika używasz do uruchomienia usługi. Być może usługa działa na lokalnym koncie systemowym lub koncie usług lokalnych lub użytkownika IIS i zainstalowałeś certyfikat jako inny użytkownik? w programie MMC dodaj snapin, aby zobaczyć certyfikaty w koncie usługi lub innym koncie, którego używasz dla usługi (nie bieżący użytkownik).

+0

dzięki swojej sugeruje. użyłem na serwerze, ale klient dostał błąd usługi: –

+0

Certyfikat klienta nie został dostarczony. Określ certyfikat klienta w ClientCredentials. –

1

Zainstaluj certyfikat w "My" dla sklepu komputerowego, aby był dostępny dla wszystkich użytkowników. Masz go zainstalowanego w "My" dla bieżącego użytkownika. Serwer programistyczny działa jako bieżący użytkownik, dlatego właśnie działa.

1

Będziesz może trzeba skonfigurować wartość dns, co oznacza nazwa certyfikatu, w kliencie> endopoint> identyfikujący (tak jak jest to opisane w poniższym kodzie)

<client> 
     <endpoint address="http://localhost/FrontPMWebServiceSetup111/FpmService.svc" 
      binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService" 
      contract="FPMServiceReference.IService" name="WSHttpBinding_IService"> 
      <identity> 
      <dns value="WCfServer" /> 
      </identity> 
     </endpoint> 
     </client> 
Powiązane problemy