【问题标题】:asp.net, use a server cert to make httpwebrequest C#asp.net,使用服务器证书制作 httpwebrequest C#
【发布时间】:2012-12-01 11:35:40
【问题描述】:

抱歉,这是我的第一篇文章,我会尽量做到描述性强...

我在转换 HTTPWebRequest 以访问需要证书的 HTTPS 网站时遇到问题。在我的本地开发机器上,我可以使用 CAC 读卡器使用我的 CAC 卡中的客户端证书创建对站点的 Web 请求。当我必须将此代码推送到我们的开发/生产服务器以访问此站点时,我的问题就出现了。当我在服务器上时,我无法读取我的 CAC 卡,但我确实有一个可以在 IIS 6.0 上使用的服务器证书。

能否在服务器上获取客户端的CAC卡证书?有店铺可以看吗?或者是否有服务器存储可供查看?

我不知道使用此服务器证书的步骤,我是否必须对此进行编码或使用我的 IIS 服务器管理器来启用它。这是我在本地开发机器上运行的代码。我添加了 ServerCertficateValidationCallback 以在开发服务器上进行测试。

   protected void Page_Load(object sender, EventArgs e)
   { 
        ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(ValidateServerCertificate);

        ServicePointManager.MaxServicePointIdleTime = 300000;

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://url");
        request.Accept = "text/xml, */*";
        request.Method = "GET";
        request.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-us");
        request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; .NET CLR 3.5.30729;)";
        request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
        request.Credentials = CredentialCache.DefaultCredentials;
        request.KeepAlive = false;

        X509Certificate myCert = null;
        X509Store store = new X509Store("My");

        store.Open(OpenFlags.ReadOnly);

        int i = 0;
        foreach (X509Certificate2 m in store.Certificates)
        {
             if (i == 0)
                myCert = m;
             i++;
        }

        if (myCert != null)
        {
             request.ClientCertificates.Add(myCert);
        }

        //take the response and create the xml document to parse
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        StreamReader reader = new StreamReader(response.GetResponseStream());
        string str = reader.ReadToEnd();

        ...
        }

        public static bool ValidateServerCertificate(object sender, X509Certificate certificate,X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            //certificate is in here
            if (sslPolicyErrors == SslPolicyErrors.None)
               return true;

            sslPE = "SSLPolicyErros: " + sslPolicyErrors;

            return false;
        }

是否有人熟悉部署过程以使用该网站信任的服务器证书即时发送请求?我希望从我们的站点(我们的站点需要 CAC 身份验证)访问该站点的所有用户都使用服务器证书。除非有人对使用 CAC 卡中的用户客户端证书有更好的想法。我无法将所有这些放在一起,我们将不胜感激。

【问题讨论】:

    标签: c# asp.net https iis-6 certificate


    【解决方案1】:

    您的 (CAC) 证书的根 ca(颁发者)必须受您的服务器信任。将根 ca 证书添加到服务器的 windows 证书存储的受信任的根证书颁发机构部分并重新启动 iis。

    【讨论】:

      最近更新 更多