2012-07-14 4 views
11

Problème:Certificats X.509 sur WCF?

Je développe ce programme sur une machine.

Le service fonctionne très bien dans le serveur de développement, mais lorsque je tente d'héberger le service dans IIS il me donne une erreur:

Vous ne trouvez pas le certificat X.509 en utilisant les critères de recherche suivants: StoreName ' My ', StoreLocation' CurrentUser ', FindType' FindBySubjectName ', FindValue' WCFServer '.

Alors, est-ce que je peux résoudre ce problème? J'essaie ce code de

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

création de certificat

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 

certificat est présent dans les ressources humaines personnelles et de confiance dossier dans MMC

service a une fonction qui accepte un nombre et renvoie la chaîne et fonctionne bien

Ceci est mon service 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> 

Ceci est mon client 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> 

et simplement appeler le service à la fin de ce client à l'aide

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

Maintenant, quand je lance tout fonctionne très bien sans problème.

Comme vous pouvez le service est en cours d'exécution sur le serveur de développement.

Mais lorsque je tente d'héberger le service dans IIS, il me donne une erreur qui

Vous ne trouvez pas le certificat X.509 en utilisant les critères de recherche suivants: storeName « My », StoreLocation « CurrentUser », FindType 'FindBySubjectName', FindValue 'WCFServer'.

Alors, est-ce que je peux résoudre ce problème?

Répondre

13

En tant que x0n mentionné, Cassini sera exécuté en tant qu'utilisateur actuel, mais IIS fonctionnera en tant qu'USUS.Importer le certificat, avec la clé privée, dans LocalMachine \ Personal (LocalMachine \ My), et changer la configuration de votre service à partir de ceci:

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

à ceci:

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

Évidemment, le certificat n'est pas trouvé dans l'emplacement configuré. Assurez-vous quel utilisateur utilisez-vous pour exécuter le service. Peut-être que le service s'exécute sur le compte système local ou le compte de service local ou l'utilisateur IIS et que vous avez installé le certificat en tant qu'utilisateur différent? Dans MMC, ajoutez un composant logiciel enfichable pour afficher les certificats dans le compte de service ou dans un autre compte que vous utilisez pour le service (pas l'utilisateur actuel).

+0

grâce à votre suggère. J'ai utilisé sur le serveur, mais le client obtient une erreur de service: –

+0

Le certificat client n'est pas fourni. Indiquez un certificat client dans ClientCredentials. –

1

Installez le certificat dans "My" pour le magasin d'informatique afin qu'il soit disponible pour tous les utilisateurs. Vous l'avez installé dans "Mon" pour l'utilisateur actuel. Le serveur de développement s'exécute en tant qu'utilisateur actuel, c'est pourquoi cela fonctionne.

1

Vous aurez peut-être à mettre en place valeur dns, ce qui signifie le nom du certificat, dans le client> endopoint> indentité (comme il est décrit dans le code ci-dessous)

<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> 
Questions connexes