C# 自签名证书是否足够安全?

C# 自签名证书是否足够安全?,c#,.net,wcf,digital-certificate,C#,.net,Wcf,Digital Certificate,我有一个WCF服务,需要通过https进行保护。WCF服务服务器站点和使用WCF服务的客户端都是自行开发的 我生成了一个自签名证书,并在以下操作文章的帮助下在我的服务中使用了它: 我的服务的绑定和行为配置如下: <behaviors> <serviceBehaviors> <behavior name="SecureServiceBehavior"> <serviceMetadata httpGetEnabled="true" /

我有一个WCF服务,需要通过https进行保护。WCF服务服务器站点和使用WCF服务的客户端都是自行开发的

我生成了一个自签名证书,并在以下操作文章的帮助下在我的服务中使用了它:

我的服务的绑定和行为配置如下:

<behaviors>
  <serviceBehaviors>
    <behavior name="SecureServiceBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
      <serviceCredentials>
        <serviceCertificate findValue="CN={my server's ip address}" />
        <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"
          membershipProviderName="SqlMembershipProvider" />
      </serviceCredentials>
      <serviceAuthorization principalPermissionMode="UseAspNetRoles"
        roleProviderName="SqlRoleProvider" />
        <serviceThrottling maxConcurrentCalls="128"
                           maxConcurrentSessions="128"
                           maxConcurrentInstances="128" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<bindings>
  <wsHttpBinding>
    <binding name="MyBinding">
       <security mode="TransportWithMessageCredential">
          <message clientCredentialType="UserName"/>
       </security>
    </binding>
  </wsHttpBinding>
</bindings>

所有WCF客户都是我们公司的员工,他们将通过IP地址通过互联网访问系统。我将把服务器的证书添加到每台客户端计算机的受信任证书颁发机构

这样的配置足够安全吗?

我要问的问题是“什么足够安全?”。自签名证书所做的只是提供一个身份验证级别,即发送通信的人拥有该证书


如果您相信签名是正确的签名,那么它就足够安全了。如果您希望确保您和您的订阅者正在与您通信,而不是有人在冒充您,那么您应该获得CA签名的证书。

它具有相同的安全级别,但主要区别在于信任。在你的情况下,我会买一张便宜的证书

我不确定您是否理解证书安全的含义。 问题是,你可能会说所有现代证书都是平等创建的。现代散列和加密算法是免费提供的,它们几乎都是牢不可破的。区分安全证书和不安全证书的是信任问题

创建证书是为了识别潜在恶意网络中的受信任服务器。你可以把它们比作警察徽章或身份证,不过我想还有更多。因此,有关证书有效性的主要问题是:

  • 我认得这个证书吗?(我能识别身份证的类型吗?)
  • 证书是否与使用它的服务器匹配?(照片是否与持票人相似?)
  • 证书可能被泄露了吗?(身份证可能被偷了吗?)
  • 根CA可能已经被破坏了吗?(有人能伪造身份证吗?)
创建安全证书的问题类似于有关其有效性的问题:

  • 在所有要识别服务器的客户端上安装证书
  • 确保服务器与证书匹配
  • 保护证书和根CA的安全
当所有客户机和服务器都彼此非常了解时(例如在同一家公司;您的案例),就可以使用自签名证书并手动将其安装到所有客户机上,以便他们能够识别它。由于服务器不向外部请求(来自任何人)开放,因此安全性也不是问题。因此,简而言之,只要您遵守标准安全指南,就您而言,自签名证书就可以了。


当您必须向外部访问者标识服务器时,就会出现问题。例如,如果我想使用您的web服务,我的计算机对您正在使用的证书没有任何概念(因为需要知道的每台计算机上都必须显式安装自签名证书),因此https功能将毫无用处。在这种情况下,您必须从广泛认可的CA处获得证书(这可能需要花钱)。这不会比自签名证书本质上更安全,但它会更可靠。

事实上不是。没有CA存在严重问题;例如,不可能轻松地撤销证书。Noone说要使用商业CA,但自签名是有限的。如果你控制客户端,CA签名证书没有任何优势。是的,当你想给客户端信心时,这就是问题所在。我不确定我是否完全信任CA模型。特别是在diginotar丑闻之后,我只是简单地将证书硬编码到客户端应用程序中。有没有教程说明如何在客户端硬编码证书?我不知道WCF,但是
SslStream
类有一个用于证书验证的回调。我实际上安装了自己的CA,并使用它为我的服务器和客户端生成证书