WCF Secrity基本概念
语法:
<Bindings>
<basicHttpBinding>
<security mode=”None” />
</basicHttpBinding>
</Bindings>
Transfer security 主要包括三个方面:
- 消息完整性(Message Integrity)
消息完整性必须确保消息在传输过程中没有被篡改,接收的消息是完整且正确的。
- 消息机密性(Message confidentiality)
消息机密性必须确保消息不会被任何第三方查阅,消息内容不会泄露给任何非相关人员。
- 交互验证(Mutual Authentication)
通常的做法是对消息进行数字签名来确保消息完整性,使用非对称加密算法来组织消息内容外泄,而用户名/密码 、X.509数字证书等方式则可以用来验证对方身份.
Security Mode
WCF提供了5种不同的安全方式来实现上述目标
l None: 不采用任何安全措施,仅使用在内部安全环境使用
l Transport:在传输协议级别上对通道的所有通讯进行加密,可使用的通讯协议包括HTTPS 、TCP、 IPC和MSMQ。优点是应用广发,多平台支持,实施方便简单,效率极高,适合高吞吐量的服务使用。缺点是只能实现点对点(point-to-point)的消息安全,在使用中介连接(Proxy)时可能会泄漏消息内容,比较适用于Intranet或直接连接的环境。
l Message:通过相关标准(如:WS-Security)直接对消息进行加密来达到安全目的。有点事能实现端到端(end-to-end)的安全传输,不存在中介安全隐患,切扩展性较好。因采用工业安全标准,所以整合能力强,适用于Internet服务。缺点是比transport效率要低一些.
l Mixed(TransportWithMessageCredential):混合了上面两种方式。使用Transport方式完成消息完整性、消息机密性以及服务器认证,而使用Message方式完成客户端认证。
l Both:使用Transport和Message共同完成所有安全过程,比较恐怖,性能低下,只有NetMsmqBinding支持这一安全方式。
Bindings and transfer security modes |
|||||
Name |
None |
Transport |
Message |
Mixed |
Both |
basicHttpBinding |
Yes(Default) |
Yes |
Yes |
Yes |
No |
netTcpBinding |
Yes |
Yes(Default) |
Yes |
Yes |
No |
netPeerTcpBinding |
Yes |
Yes(Default) |
Yes |
Yes |
No |
netNamedPipeBinding |
Yes |
Yes(Default) |
No |
No |
No |
wsHttpBinding |
Yes |
Yes |
Yes(Default) |
Yes |
No |
wsFrderationHttpBinding |
Yes |
No |
Yes(Default) |
Yes |
No |
wsDualHttpBinding |
Yes |
No |
Yes(Default) |
No |
No |
netMsmqBinding |
Yes |
Yes(Default) |
Yes |
No |
Yes |
总结:带有net 的默认都是Transport,只有basicHttp默认是None,为了兼容asmx,而以 ws开头的默认都是Message
Credentials
Security Mode解决了消息完整性和机密性,那么生下来的就是”Authentication”了,WCF支持多种认证方式,允许我们从多个客户端认证类型(Client Credentials Types)中选择适合我们需求的方案,比如经典的“用户名 /密码”或者Windows集成身份认证(NTLM或Kerberos)、X.509数字证书等。
Transport Security and Credentials |
||||
Name |
None |
Windows |
Username |
Certificate |
basicHttpBinding |
Yes(Default) |
Yes |
Yes |
Yes |
netTcpBinding |
Yes |
Yes(Default) |
No |
Yes |
netPeerTcpBinding |
No |
No |
Yes(Default) |
Yes |
netNamedpipeBinding |
No |
Yes(Default) |
No |
No |
wsHttpBinding |
Yes |
Yes(Default) |
Yes |
Yes |
wsFederationHttpBinding |
N/A |
N/A |
N/A |
N/A |
wsDualHttpBinding |
N/A |
N/A |
N/A |
N/A |
netMsmqBinding |
Yes |
Yes(Default) |
No |
Yes |
Message Security and Credentials |
||||
Name |
None |
Windows |
Username |
Certificate |
basicHttpBinding |
Yes(Default) |
Yes |
Yes |
Yes |
netTcpBinding |
Yes |
Yes(Default) |
Yes |
Yes |
netPeerTcpBinding |
No |
No |
N/A |
Yes |
netNamedpipeBinding |
No |
Yes(Default) |
N/A |
No |
wsHttpBinding |
Yes |
Yes(Default) |
Yes |
Yes |
wsFederationHttpBinding |
N/A |
N/A |
N/A |
N/A |
wsDualHttpBinding |
N/A |
N/A |
N/A |
N/A |
netMsmqBinding |
Yes |
Yes(Default) |
No |
Yes |
Access Control
Access control 又被称之为 Authorization 和Authentication 验证客户端身份的目的不同,它被用来控制用户(组)的代码访问授权。
Auditing
Auditing的作用是将WCF安全相关时间记录到Windows系统日志中。
A.创建证书:https://www.cnblogs.com/jfzhu/p/4067873.html
(1)将创建证书工具makecert.exe放到任意地方。可以把该文档中的makecert.exe工具复制粘贴到任意目录。
(2)doc命令去到makecert.exe的路径,然后输入命令makecert -sr localmachine -ss My -n CN=DeferredTopupServer -sky exchange -pe -r。其中localmachine表示证书放的位置是本地计算机,My表示证书放在个人证书中,DeferredTopupServer这个是证书的名字根据实际需要改动。
3)成功后,可以在控制台本地计算机个人证书中看到新创建的名为DeferredTopupServer的证书。步骤:
在运行中输入“mmc”-->在控制台窗口中单击“文件”菜单下的“添加删除管理单元”-->在添加/管理单元窗口的独立页,单击“添加”-->在添加独立管理单元窗口,选择“证书”,单击“添加”-->在证书管理单元窗口,选择“计算机账户”,“下一步”-->选择“本地计算机”,单击“完成”。
展开本地计算机中个人证书,可以查询DeferredTopupServer证书。
(4)在localmachine的My下创建好两个不同名字的证书(一个是用在web service config中,一个是用在IIS上https binding中)后,复制my中新建的两个证书到“本地计算机”下“受信任的根证书颁发机构”中。
(5)因为是创建的带私钥的证书,所以要将这两个证书对应的私钥文件权限设置为everyone,简单起见就是将MachineKeys文件夹的权限设置为everyone,目录为...CryptoRSAMachineKeys
B 导入证书 (当有.pfx的证书文件时,不需要创建证书,只需要导入或安装到控制台证书的相应位置即可,此处只介绍导入方式)
(1)打开控制台的本地计算机证书,步骤类似创建证书中的步骤(3),将该文档中的.pfx文件复制粘贴到任意的目录下。
(2)右击“个人”-->“所有任务”-->“导入”-->“下一步”-->单击“浏览...”,“下一步”-->输入密码,一定要勾选“标志此秘钥为可导出的。这将允许您在稍后备份或传输秘钥”,“下一步”-->“下一步”“完成”
(3)同样的步骤导入其他证书,使“本地计算机”的“个人”和“受信任的根证书颁发机构”都有两个证书。
(4)将MachineKeys文件夹的权限设置为everyone,目录为...CryptoRSAMachineKeys
C.导出证书:
1 导出.pfx文件:
在控制台中找到想要导出的证书-->右键“证书名字”,“所有任务”,“导出”-->“下一步”-->勾选“是,导出私钥”,“下一步”-->只选择“私人信息交换”,“下一步”-->自己给定一个密码,输入“密码”,“确认密码”,“下一步”-->点击“浏览”指定存放.pfx文件的位置和文件名,“下一步”-->“完成”
2 导出.pem文件:(只要导出web service config中的证书)
(1)在控制台中找到想要导出的证书-->右键“证书名字”,“所有任务”,“导出”-->“下一步”-->勾选“不,不要导出私钥”,“下一步”-->勾选“Base64 编码 x509”,“下一步”-->点击“浏览”指定存放文件的位置和文件名,“下一步”-->“完成”。此时导出的文件是扩展名为.cer的文件
(2)将导出的.cer文件,重命名为.pem的文件即可。
常见问题
1:异常详细信息: System.Security.Cryptography.CryptographicException: 密钥集不存在。
ArgumentException: 证书“CN=MyServerCert”必须具有能够进行密钥交换的私钥。该进程必须具有访问私钥的权限。
该问题可能存在两个情况:
A:帐户没有权限访问证书的私钥文件。解决方案就是找到证书的私钥文件找到,(位置类似Windows xp存放在:C:Documents and SettingsAll UsersApplication DataMicrosoftCryptoRSAMachineKeys
Windows vista存放在:C:ProgramDataMicrosoftCryptoRSAMachineKeys )将权限设置最大
B:根本没有没有该证书的私钥文件, 地址同A.这种情况一般产生是由于Makecert没有在本机上做,证书是从另外的机器导入进来的. 导入的时候由于服务器的原因不能导入私钥到这个服务器上. 解决方案就是在这服务器上直接用makecert产生证书.
查找证书私钥:
FindPrivateKey My LocalMachine -n "CN=www.ecepdi.com" 或
FindPrivateKey My LocalMachine -t "指纹密钥"
WinHttpCertCfg.exe -g -c LOCAL_MACHINEMY -s "证书名" -a Network Service
设置完成后,IIS宿主不是马上就可以访问密钥,所以不要急,可以iisreset命令重启IIS