使用带ClientCredentials的WCF通信时遇到安全配置问题
看起来你在配置带安全认证的WCF服务时碰到了麻烦,我来帮你梳理下可能的问题点和解决思路~
首先,先确认下你提到的几个步骤有没有遗漏细节:
证书相关检查:
你生成的自签名证书已经导入到本地计算机的「受信任的根证书颁发机构」里了对吧?要注意是本地计算机账户下的根证书库,不是当前用户的,不然服务端可能无法信任这个证书。另外,证书的「使用者名称」或者「DNS名称」要和服务端的主机名匹配,不然客户端连接时会报名称不匹配的错误。netsh命令的正确性:
你执行的netsh http add sslcert ipport=0.0.0.0:MYPORT certhash=THUMBPRINTOFCERTIFICATE appid={APPGUID}命令,要确保:THUMBPRINTOFCERTIFICATE是证书的十六进制指纹,注意不要有空格;APPGUID是你服务程序的GUID,这个可以随便生成一个,但要保证和配置里的一致;- 执行命令的时候要用管理员权限的命令提示符,不然会报错权限不足。
NetTcpBinding的安全配置:
你提到用了NetTcpBinding,但没说具体的安全设置,这很关键哦。默认的NetTcpBinding是带安全的,你需要明确配置安全模式和客户端凭证类型,比如:NetTcpBinding binding = new NetTcpBinding(); // 设置安全模式为Transport,适配SSL证书加密场景 binding.Security.Mode = SecurityMode.Transport; // 根据需求设置客户端凭证类型,这里以证书为例 binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;另外,服务端的ServiceHost需要指定使用的证书,确保SSL加密能正常生效:
shRet = new ServiceHost(typeof(YourServiceImpl)); // 通过证书指纹绑定服务端证书 shRet.Credentials.ServiceCertificate.SetCertificate( StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByThumbprint, "THUMBPRINTOFCERTIFICATE" );证书私钥权限问题:
运行WCF服务的账户需要有读取证书私钥的权限。你可以打开证书管理器,找到你的证书,右键「所有任务」→「管理私钥」,把服务运行账户添加进去,授予「读取」权限,不然服务启动时会因为无法访问私钥报错。客户端侧配置匹配:
客户端那边也要导入同一个自签名证书到「受信任的根证书颁发机构」,并且配置对应的客户端凭证,比如:YourServiceClient client = new YourServiceClient(binding, new EndpointAddress("net.tcp://your-server-ip:MYPORT/YourService")); // 如果客户端需要用证书认证,就配置客户端证书 client.ClientCredentials.ClientCertificate.SetCertificate( StoreLocation.CurrentUser, StoreName.My, X509FindType.FindByThumbprint, "CLIENT-CERT-THUMBPRINT" );
如果还是有问题,建议把具体的错误信息贴出来,这样能更精准地定位问题~
备注:内容来源于stack exchange,提问作者M.Pievani

