2011-06-16 56 views
1

我正嘗試創建具有消息安全性的Web服務。WCF在IIS上失敗。系統找不到指定的文件

這裏是一個配置:

<system.serviceModel> 
    <services> 
     <service name="WCFMessage.Service1" behaviorConfiguration="behaviour1"> 
     <endpoint address="" contract="WCFMessage.IService1" binding="wsHttpBinding" bindingConfiguration="binding1" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="behaviour1"> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceCredentials> 
      <serviceCertificate findValue="MyCert" 
           x509FindType="FindBySubjectName" 
           storeLocation="LocalMachine" 
           storeName="My"/> 
      </serviceCredentials> 
     </behavior> 
     </serviceBehaviors> 

    </behaviors> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="binding1"> 
      <security mode="Message"> 
      <message clientCredentialType="None" negotiateServiceCredential="false"/> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    </system.serviceModel> 

它運作良好,在本地主機上,但在IIS上,它給了我一個錯誤:

The system cannot find the file specified.

堆棧跟蹤:

It is likely that certificate 'CN=MyCert' may not have a private key that is capable of key exchange or the process may not have access rights for the private key.

我試過this方法,但仍然出現錯誤。

任何幫助表示讚賞。

回答

1

我在過去幾天有類似的情況。我找到了一個可以接受的解決方法,所以我會和你分享。問題出在IIS應用程序池用戶帳戶無法訪問服務證書私鑰文件 - 或者沒有在它期望的私有密鑰中!

注:我將假定你有自己的證書頒發機構的運行。

要解決此問題,請按照下列步驟操作:

  1. 創建您要使用的IIS應用程序池一個新的用戶帳戶。
  2. 您可以創建一個新的應用程序池以與此用戶標識一起使用,或將此新用戶標識分配給DefaultAppPool或您的服務使用的任何應用程序池(在IIS管理器中執行此操作)。
  3. 然後打開IE,導航到http://yourserver/certsrv來請求新的服務器認證證書。請求中使用相同的CN(「MyCert」)。
  4. 打開證書頒發機構發出請求的證書。
  5. 再次轉到http://yourserver/certsrv,單擊「查看掛起證書請求的狀態」,然後安裝證書。
  6. 現在你需要做出改變你的「serviceCertificate的」 web.config部分,在某種程度上,它看起來像這樣:

    <serviceCredentials> 
        <serviceCertificate findValue="MyCert" 
             x509FindType="FindBySubjectName" 
             storeLocation="CurrentUser" 
             storeName="My"/> 
        </serviceCredentials> 
    
  7. 保存,重建服務並對其進行測試,它應該工作精細。

(它會更容易,如果這可以使用MMC導出/導入證書功能來實現,但由於某種原因其行爲並不像我們希望它是)

+0

感謝。我找到了解決方案,問題和你的一樣。 – 2012-01-21 12:59:59

相關問題