客户端证书 - 我应该使用自签名还是 CA 颁发的证书?

Client certificate - shall I use self-signed or CA issued?

我们有服务器到服务器的通信,我们打算使用客户端证书。我们应该使用自签名证书还是 CA 颁发的证书?为什么?

在这两种情况下 - 使用自签名和颁发的 CA,我们如何在以下服务器代码中验证客户端证书是否有效?

public class CheckClientCertAttribute : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        var cert = actionContext.Request.GetClientCertificate();

        if (cert == null)
        {
            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
            {
                ReasonPhrase = "Client Certificate not present in the HTTP request."
            };

            return;
        }

        // How do I make sure the client certificate is valid here?

        base.OnAuthorization(actionContext);
    }
}

如果您有能力购买,您应该使用“真实”证书,最好是由您公司自己的中间证书颁发机构颁发的公司证书,该机构又由受信任的根颁发机构签名。

您想这样做的原因是部署。如果您使用通用的、受信任的根权限,则不必在所有服务器上到处安装您自己的根权限。这不仅会给后方带来痛苦,而且还会为黑客创造一个很好的攻击途径,因为该机器上的所有其他软件 运行 也会信任该 root 权限。

至于验证,因为您是在代码中进行的,所以您可以验证任何您想要的东西。如果你想非常严格,你可以验证序列号(虽然这会在你必须更新证书时造成一些维护上的麻烦)。验证它的另一种常见方法是检查主题或通用名称字段。如果你做对了,你可以更新证书而不需要重新配置你的应用程序,因为你正在检查的字段保持不变。