【问题标题】:Rejecting all client certificates in IIS拒绝 IIS 中的所有客户端证书
【发布时间】:2021-09-04 17:30:59
【问题描述】:

就像this person 一样,我一直在为浏览器缓存 SSL 会话而苦苦挣扎。简而言之,如果选择了客户端证书,则无法以编程方式清除状态,除非在 IE 中使用document.execCommand("ClearAuthenticationCache")

the answers 之一提到向“同一主机名上的 URL 请求客户端证书但拒绝所有证书”将强制浏览器清除 SSL 会话。如何在 IIS 中设置这样的端点?因为我认为我需要的不仅仅是一个返回 http 状态 403 或类似的简单端点。

【问题讨论】:

  • “因为我认为我需要的不仅仅是一个返回 http 状态 403 或类似的简单端点。” - 不,只需将<location> 添加到您的web.config,并设置硬编码的错误响应规则。根本不需要任何应用程序代码。另一种选择是在 <urlRewrite> 元素中定义规则。
  • @Dai 我尝试向在同一域上返回 403 的端点发出请求,但它似乎没有清除任何证书,这有点道理。正如 cmets 中所讨论的,我认为需要做的事情远不止这些。我只是不知道如何为此配置 IIS
  • HTTP 403 不会使客户端身份验证状态无效,我认为您需要 HTTP 401。

标签: ssl iis


【解决方案1】:

SSL 协商发生在端点请求发送之前,因此无法基于端点“拒绝证书”(您也许可以强制重新协商,但我不确定 IIS 是否支持)。

但您也许可以设置相同的主机名和不同的端口,并在那里禁用客户端证书。由于主机名匹配(相同......),我希望浏览器尝试它们并失败。

【讨论】:

    【解决方案2】:

    简答:delete sslcert [ipport=]IP Address:portref

    如果您希望在代码中编写/自动化它,您可以在 C# 中通过以下两个步骤进行操作,您需要调整代码以满足您的需求


    1。获取您的证书

    using (var store = new X509Store(StoreName.My, StoreLocation.LocalMachine))
    {
         store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
    
         // Get /Display a list of all the certificates
         foreach (var x in store.Certificates)
         {
             // *** TODO
    
             // add it to a drop down
             // SomeDropDownListControl_IISCert.Items.Add(new SomeDropDownListControl_IISCert(x.FriendlyName, x.SerialNumber));
    
             //or delete it, see Below
            
         }
    }
    

    2。构建命令并传递证书并使用 Shell 命令将其删除

        StringBuilder str = new StringBuilder();
        ProcessStartInfo psi = new ProcessStartInfo() {CreateNoWindow = true, UseShellExecute = false, RedirectStandardOutput = true};
        psi.FileName = "netsh";
    
        psi.Arguments = $"http show sslcert ipport=0.0.0.0:{port}";
        Process procShow = Process.Start(psi);
        while (procShow != null && !procShow.StandardOutput.EndOfStream)
        {
            str.Append(procShow.StandardOutput.ReadLine());
        }
        Log.Warn(str.ToString);
    
        // delete IPV4.
        psi.Arguments = $"http delete sslcert ipport=0.0.0.0:{port}";
        Process procDel = Process.Start(psi);
        //exitCode = procDel.ExitCode;
    

    【讨论】:

      猜你喜欢
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 2020-09-22
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多