我正在尝试使用邮件安全性创建Web服务。
这是一个配置:
<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>
它在localhost上运行良好,但在IIS上,它给了我一个错误:
系统无法找到该文件 指定。
堆栈追踪:
很可能是证书 'CN = MyCert'可能没有私钥 能够进行密钥交换的 进程可能没有访问权限 私钥。
我尝试了this方法,但仍然出现错误。
感谢任何帮助。
答案 0 :(得分:1)
过去几天我一直有类似的情况。我找到了一个可以接受的解决方法,所以我会与你分享。问题是在IIS应用程序池用户帐户中无法访问服务证书私钥文件 - 或者没有私钥在其期望的位置!
注意:我将假设您正在运行自己的证书颁发机构。
要解决此问题,请按以下步骤操作:
现在您需要对“serviceCertificate”web.config部分进行更改,其方式如下所示:
<serviceCredentials>
<serviceCertificate findValue="MyCert"
x509FindType="FindBySubjectName"
storeLocation="CurrentUser"
storeName="My"/>
</serviceCredentials>
保存,重建服务并对其进行测试,它应该可以正常工作。
(如果可以使用MMC导出/导入证书功能实现这一点会更容易,但由于某种原因,其行为并不像我们预期的那样)