简答
我需要的安全类型是:传输安全模式
证书 clientCredentialType,使用 wsHttpBinding。第一个问题,
我猜对了吗?
是的。假设您不使用 WCF 流功能,消息安全性也可以工作,但通过传输安全性,您可以受益于硬件加速。
如何设置证书?
请看下面的详细答案。
我从服务器给客户端什么,它去哪里了?
如果我有几个客户(一个网络农场),我是否必须有一个不同的
他们所有人的客户端证书,或者他们可以共享我的服务器的一个证书
接受吗?
您需要 3 个证书:
- 客户端证书(所有客户端都相同)。
- 服务器证书。
- 证书颁发机构 (CA) 证书,客户端和服务器证书由该证书颁发机构
已发布。
客户需要:
- 安装在个人证书存储中的客户端证书。
- 安装在受信任的根证书颁发机构存储中的 CA 证书。
我从客户端给服务器什么,它去了哪里?
服务器需要:
- 安装在个人证书存储中的服务器证书。
- 安装在受信任的根证书颁发机构存储中的 CA 证书。
- 安装在 Trusted People 存储中的客户端证书。
详细解答
在这种情况下(网络场和自托管网络服务之间的通信),您同时拥有客户端和服务器计算机。不需要第三方颁发的证书(您相信自己,对吗?)。这意味着您可以安全地使用自制证书。
这是一个快速指南,希望能帮助您(或其他人)实现这一目标。如果您已经拥有问题所建议的证书,请随时跳过步骤 I。此外,您可能已经购买了第三方颁发的证书,在这种情况下,根证书颁发机构(VeriSign、Microsoft 等)证书可能已经安装在您的客户端和服务器计算机。
我。创建证书
正如msdn article 中所述,使用makecert 生成3 个证书:
- 根证书颁发机构证书,我们称之为
MyRootCA,及其吊销列表。
- 服务器 SSL 证书。该名称必须是您的 Web 场客户端将用于调用 Web 服务的域名。例如,如果您的客户使用以下网址:
https://mywebserver.myprivatedomain.com/service1.svc,那么您的证书 CN(通用名称)将为 mywebserver.myprivatedomain.com。
- 客户端 X.509 证书,我们称之为
MyAmazonClient。
这是实现这 3 个步骤的简单批处理:
REM 1: MyRootCA
makecert -n "CN=MyRootCA" -r -sv "MyRootCA.pvk" "MyRootCA.cer"
makecert -crl -n "CN=MyRootCA" -r -sv "MyRootCA.pvk" "MyRootCA.crl"
REM 2: mywebserver.myprivatedomain.com
makecert -sk "mywebserver.myprivatedomain.com" -iv "MyRootCA.pvk" -n "CN=mywebserver.myprivatedomain.com" -ic "MyRootCA.cer" -sr LocalMachine -ss My -sky exchange -pe
REM 3: MyAmazonClient
makecert -sk "MyAmazonClient" -iv "MyRootCA.pvk" -n "CN=MyAmazonClient" -ic "MyRootCA.cer" -sr LocalMachine -ss My -sky signature -pe
此批次将在当前文件夹中创建 3 个文件:
-
MyRootCA.cer:包含根 CA 证书的公钥。
-
MyRootCA.crl:包含证书吊销列表。
-
MyRootCA.pvk:包含根 CA 证书的私钥。
另外 2 个证书(客户端和服务器)安装在本地计算机证书存储中。
使用Certificates MMC Snap-in,将它们导出为 .pfx 文件:
- 找到 LocalMachine > 我的 > 证书。
- 右键单击 MyAmazonClient > 所有任务 > 导出。
- 右键单击 mywebserver.myprivatedomain.com > 所有任务 > 导出。
二。安装服务器证书
在您的服务器机器(公开网络服务的机器)上,复制以下文件:
- MyRootCA.cer
- MyRootCA.crl
- MyAmazonClient.pfx
- mywebserver.myprivatedomain.com.pfx
使用服务器计算机上的证书 MMC 管理单元,将证书安装在以下位置:
-
MyRootCA.cer 和 MyRootCA.crl 到
Local Computer > Trusted Root Certification Authorities > Certificates
-
MyAmazonClient.pfx 转入
Local Computer > Trusted People > Certificates
-
mywebserver.myprivatedomain.com.pfx 转入
Local Computer > Personal > Certificates
授予您的 IIS AppPool 访问 mywebserver.myprivatedomain.com 证书的私钥的权限。在 MMC 证书管理单元中,右键单击 mywebserver.myprivatedomain.com > 所有任务 > 管理私钥...然后添加运行 AppPool 的身份。请注意,在使用 ApplicationPoolIdentity 时(默认情况下),身份名称为 IIS AppPool\YourAppPoolNameHere。
三。配置 IIS 以支持 SSL
使用 IIS 管理器,找到您的网站并使用您的 mywebserver.myprivatedomain.com 证书添加 https 绑定。见Step 4: Configure Your Temporary Service Certificate in IIS to Support SSL。
四。配置服务(web.config)
<system.serviceModel>
<protocolMapping>
<add scheme="https" binding="wsHttpBinding" />
</protocolMapping>
<bindings>
<wsHttpBinding>
<!-- configure wsHttp binding with Transport security mode and clientCredentialType as Certificate -->
<binding>
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
V.安装客户端证书
在每台客户端计算机(网络场)上,复制以下文件:
- MyRootCA.cer
- MyRootCA.crl
- MyAmazonClient.pfx
使用客户端计算机上的证书 MMC 管理单元,将证书安装在以下位置:
-
MyRootCA.cer 和 MyRootCA.crl 进入
Local Computer > Trusted Root Certification Authorities > Certificates
-
MyAmazonClient.pfx 转入
Local Computer > Personal > Certificates
授予您的 IIS AppPool 访问 MyAmazonClient 证书的私钥的权限(与 II 的步骤相同)。
VI.配置客户端 (web.config)
<system.serviceModel>
<client>
<!-- this endpoint has an https: address -->
<endpoint address="https://mywebserver.myprivatedomain.com/service1.svc"
behaviorConfiguration="endpointCredentialBehavior"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
contract="MyWebApp.IServiceContract"/>
</client>
<behaviors>
<endpointBehaviors>
<behavior name="endpointCredentialBehavior">
<clientCredentials>
<clientCertificate findValue="MyAmazonClient"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectName" />
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<!-- configure wsHttpbinding with Transport security mode
and clientCredentialType as Certificate -->
<binding name="Binding1">
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
就是这样。