WCF传输安全SSL问题

时间:2014-08-21 01:01:57

标签: wcf security iis ssl https

我在一台服务器上有一组WCF服务,该服务器是从我的网站在另一台服务器上调用的。没有任何安全性,只有basicHttpBinding,这很好用。现在,我希望使用带有自签名证书的SSL Transport完全保护相同的设置。

首先,我尝试在服务服务器上使用IIS来创建自签名证书,但问题是它始终以大小写混合的形式创建主题但是url是小写的。不确定这是否会导致问题,但我没有成功。

所以我使用makecert来(1)创建一个根证书,然后我将客户端服务器和服务服务器上的* .cer文件安装到根CA存储中,然后(2)创建另一个证书,使用root作为CA,将用于签名。我复制了这个* .pfx并再次安装到LocalComputer的个人存储中用于两个服务器。

所以,现在在我的服务服务器上,我进入IIS并使用客户端证书设置443的绑定。然后,我选择了我的虚拟目录并设置了需要SSL的SSL,然后选择了“必需的”#39;用于客户证书。

现在,如果我只是尝试在IE中启动虚拟目录,使用https和证书中显示的全名,我得到403.7。我似乎无法通过此错误。

如果我尝试从网站服务器点击这个虚拟目录,我会得到一个简单的403。

如果我将我的IIS设置更改为“接受”'客户端证书而不是“要求”,我可以在两个方框上浏览我的服务。

缺少某些东西......但似乎无法找到它。

更新 好吧,所以我创建了一个单页的网站并锁定了它需要相同的证书,并能够在客户端的IE中安装该证书并访问网站。最后,在将证书安装到IT之后,它允许我浏览我的服务虚拟目录,甚至在我的一个服务上打开页面。

问题1:安装服务器证书时,我将Server和Client计算机上的私钥版本安装到LocalMachine中 - >个人位置。这是正确的还是我应该将公钥安装到客户端?它似乎正在发挥作用。

仍有问题 - 现在进行WCF通话时,我得到以下内容:

SecurityNegotiationException:无法为具有权限的SSL / TLS建立安全通道' myserver.mydomain.com'。

这是我的服务器配置:

<system.serviceModel>
    <protocolMapping>
        <add scheme="https" binding="basicHttpBinding"/>
    </protocolMapping>
    <bindings>
        <basicHttpBinding>
            <binding name="SecureCertBinding">
                <security mode="Transport">
                    <transport clientCredentialType="Certificate"></transport>
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <services>
        <service name="MyName.MyService" behaviorConfiguration="SecureBehavior">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="SecureCertBinding" name="SecureAlertService" contract="MyName.IMyService"></endpoint>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="SecureBehavior">
                <serviceMetadata httpsGetEnabled="true" />
                <serviceCredentials>
                    <serviceCertificate findValue="myserver.mydomain.com" storeName="My" storeLocation="LocalMachine" x509FindType="FindBySubjectName"/>
                </serviceCredentials>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

这是我的客户配置:

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
          <binding name="BasicHttpBinding_SmallData" maxReceivedMessageSize="5000000">
              <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="524288" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
              <security mode="Transport">
                  <transport clientCredentialType="Certificate"></transport>
              </security>
          </binding>
      </basicHttpBinding>
    </bindings>
    <behaviors>
        <endpointBehaviors>
            <behavior name="SecureEndpoint">
                <clientCredentials>
                    <clientCertificate findValue="myserver.mydomain.com" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>
                </clientCredentials>
            </behavior>
        </endpointBehaviors>
    </behaviors>
    <client>
        <endpoint address="https://myserver.mydomain.com/Services/MyService.svc" binding="basicHttpBinding" behaviorConfiguration="SecureEndpoint"
    bindingConfiguration="BasicHttpBinding_SmallData" contract="MyName.IMyService" name="BasicHttpBinding_IMyService"/>
    </client>
</system.serviceModel>

如何判断客户端是否正在发送带有请求的证书?

1 个答案:

答案 0 :(得分:0)

得到了!!最后。 我重新启动了整个过程,包括创建新的证书和所有证书。一旦我通过了IE甚至无法导航到服务虚拟目录的部分,我从那时就知道我主要是反对WCF。

我在服务服务器上使用服务帐户来获取对数据库具有适当权限的应用程序池。这样我的连接字符串就是Windows Auth。

确保此服务帐户具有证书​​的完全权限(管理单元...管理私钥)。

执行此操作后,我仍然收到错误但是我在系统事件日志中发现了一个条目,指出在尝试从证书中检索私钥时发生错误。这最终有所帮助。

我的网站(又名...服务客户端)仍在使用ApplicationPoolIdentity运行应用程序池。如果是这种情况:

请确保将“IIS_Usrs”群组的完全权限授予证书。

Bingo ......从这一点开始,一切都有效......完全安全。