2017-02-24 52 views
0

我有一个非常“简单”的问题。我有一个WCF服务器应该只接受TLS 1.2连接。但每次我通过Firefox或任何浏览器连接到它时,它都使用TLS 1.0。WCF服务器接受TLS 1.0连接

.NET Framework-Version是4.6.1,所以它应该支持TLS 1.2。 这里是我的app.config:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    </configSections> 
    <connectionStrings> 
    <add name="WCFServer.Properties.Settings.ConnectionString" connectionString="SomeConnectionString" /> 
    </connectionStrings> 
    <system.serviceModel> 
    <bindings>   
    <netTcpBinding> 
    <binding name="TestNetTcpBinding"> 
     <reliableSession enabled="true" /> 
     <security> 
     <message clientCredentialType="Windows" algorithmSuite="Basic256Sha256Rsa15" /> 
     </security> 
    </binding> 
    </netTcpBinding> 
</bindings> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="MyCustomAttributeBehavior"> 
     <Validator /> 
    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
    <behavior name="DefaultBehavior"> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <serviceMetadata httpsGetEnabled="true" httpsGetUrl="mex" policyVersion="Default" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<extensions> 
    <behaviorExtensions> 
    <add name="Validator" type="WCFServer.RightAttribute.MyBehaviorSection, WCFServer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </behaviorExtensions> 
</extensions> 
<services> 
    <service behaviorConfiguration="DefaultBehavior" name="WCFServer.Services.Implementations.BusinessService"> 
    <endpoint address="ProductService" behaviorConfiguration="MyCustomAttributeBehavior" 
     binding="netTcpBinding" bindingConfiguration="TestNetTcpBinding" 
     contract="WCFServer.Services.Interfaces.IProductService" /> 
    <endpoint address="UserService" behaviorConfiguration="MyCustomAttributeBehavior" 
     binding="netTcpBinding" bindingConfiguration="TestNetTcpBinding" 
     contract="WCFServer.Services.Interfaces.IUserService" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="net.tcp://SomeHost/WCFService/Service" /> 
     <add baseAddress="https://SomeHost/WCFService/Service" /> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 
    </system.serviceModel> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
    <assemblyIdentity name="NHibernate" publicKeyToken="aa95f207798dfdb4" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-4.1.0.4000" newVersion="4.1.0.4000" /> 
    </dependentAssembly> 
</assemblyBinding> 
    </runtime> 
</configuration> 

我希望我没有****了XML太差的格式。对不起。 我把它放在控制台应用程序中来测试。 这是我的主要方法(在​​这里我尝试将SecurityProtocol设置为只TLS 1.2)

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 
var host = new ServiceHost(typeof(BusinessService)); 
host.Open();  
Console.WriteLine("Services Ready"); 
Console.WriteLine("Press any button to close services."); 
Console.Read(); 
host.Close(); 
Environment.Exit(0); 

BusinessService类实现既IUserServiceIProductService。您可以忽略MyCustomAttributeBehavior。只是一些“拦截器”的东西,这应该不重要。

编辑:证书是确定的。另外firefox说。 证书是否必须符合特殊要求?我不这么认为,但我不确定。

我已经尝试在host.Open()之前和之后设置SecurityProtocol。两者都没有工作。

任何帮助表示感谢。

谢谢!

回答

1

ServicePointManager.SecurityProtocol仅用于打开连接,不用于接收连接。如果您使用的是基于HTTP的绑定(例如BasicHttpsBinding),那么所使用的SSL/TLS版本将取决于HTTP.SYS配置(自托管或IIS),这依赖于全局SCHANNEL设置机器。

在这种情况下,您正在使用NetTcp,最后我记得根本没有使用SSL/TLS。