我的方案:我在Amazon EC2服务器上托管了面向公众的Web应用程序。我在防火墙后面有一个自托管的数据库服务器。我有自托管的Web服务服务器,带有用于数据访问的Web服务。我想只允许我批准的应用程序(我自己生活在云端)访问服务,我不希望任何数据以明文形式传递。
从我可以告诉我阅读所有脱节和疯狂混淆的MSDN文章,Stackoverflow线程,代码项目文章和其他博客。我需要的安全类型是: 使用 wsHttpBinding ,使用证书 clientCredentialType 传输安全模式。第一个问题,我是否正确地假设?这会给我足够的安全吗?这不是B2B或类似的东西。但是,它是跨域的,我只想确保我可以信任调用者。我的服务在特定用户拥有的AppPool中运行,因此我可以访问具有集成安全性的数据库。我需要确保只有我认可的服务的来电者才能进入。我不需要加密消息,而不是SSL我已经不相信了。
所有可能的场景都让人很难知道这是否是我想要的。但假设这是下一个问题,我该如何设置Certs?我目前在服务器上有一个证书,我只能使用Https访问。 (安全模式=“传输”,clientCredentialType =“无”)。但是对于我的生活,我无法弄清楚我需要做些什么来将clientCredentialType更改为Certificate并使其工作。
我读过的所有开发文章都说Cert安装程序是一个管理工具,超出了本文的范围。好吧,WCF的东西很简单,它正是我需要帮助的friggin证书,而且还没有我发现的有用文章。那些接近的人展示了如何用makecert.exe做到这一点,并说在生产中会有所不同,但后来却没有说如何在生产中这样做。
我确信我的挫折程度正在显示,抱歉。但是对于如何在WCF中做一个非常常见的安全场景没有明确的描述真的没有意义。
任何和所有帮助表示赞赏, 肯
答案 0 :(得分:2)
我需要的安全类型是:传输安全模式 使用wsHttpBinding证书clientCredentialType。第一个问题, 我是否正确地假设?
是。假设您不使用WCF流功能,消息安全性也会起作用,但是通过传输安全性,您可以从硬件加速中受益。
如何设置Certs?
请参阅下面的详细答案。
我从服务器向客户提供什么?它在哪里? 如果我有几个客户(一个网络农场),我必须有一个不同的 所有这些客户端证书,或者他们可以共享我的服务器的一个证书 接受?
您需要3张证书:
客户需要:
我从客户端向服务器提供什么以及它在哪里?
服务器需要:
在此方案(Web场和自托管Web服务之间的通信)中,您拥有客户端和服务器计算机。不需要第三方颁发的证书(您相信自己,对吧?)。这意味着您可以安全地使用自制证书。
这是一个快速指南,我希望能帮助你(或其他人)实现这一目标。如果您已根据问题建议拥有证书,请随意跳过步骤I.此外,您可能已经购买了第三方颁发的证书,在这种情况下,可能已经安装了根证书颁发机构(VeriSign,Microsoft等)证书您的客户端和服务器机器。
如此msdn article中所述,使用makecert
生成3个证书:
MyRootCA
及其撤销列表。https://mywebserver.myprivatedomain.com/service1.svc
,则您的证书CN(公用名)将为 mywebserver.myprivatedomain.com
。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个文件:
其他2个证书(客户端和服务器)安装在本地计算机证书存储区中。
使用Certificates MMC Snap-in,将它们导出为.pfx文件:
在服务器计算机(公开Web服务的计算机)上,复制以下文件:
使用服务器计算机上的证书MMC管理单元,在以下位置安装证书:
Local Computer > Trusted Root Certification Authorities > Certificates
Local Computer > Trusted People > Certificates
Local Computer > Personal > Certificates
授予您的IIS AppPool访问mywebserver.myprivatedomain.com证书的私钥的权限。在MMC Certificates Snap-in中,右键单击mywebserver.myprivatedomain.com>所有任务>管理私钥...然后添加运行AppPool的身份。请注意,与使用ApplicationPoolIdentity(默认情况下)时相比,身份名称为IIS AppPool\YourAppPoolNameHere
。
使用IIS管理器,找到您的网站并使用mywebserver.myprivatedomain.com
证书添加https绑定。请参阅Step 4: Configure Your Temporary Service Certificate in IIS to Support SSL。
<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>
在每台客户端计算机(Web场)上,复制以下文件:
在客户端计算机上使用证书MMC管理单元,将证书安装在以下位置:
Local Computer > Trusted Root Certification Authorities > Certificates
Local Computer > Personal > Certificates
授予您的IIS AppPool访问MyAmazonClient证书的私钥(与 II 相同的步骤)。
<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>
就是这样。