当前位置: 首页 > 知识库问答 >
问题:

使用C#Restsharp库使用需要客户端证书和根证书的webservice

鲁霄
2023-03-14

我正在尝试使用一个Web服务,该服务要求开发人员作为参数的一部分传递签名证书。该服务在测试环境中运行良好,但是对于生产环境,除了签名证书外,还需要根证书才能成功访问该服务。这已经在《邮递员》中进行了测试,并取得了成功的结果。

当使用RestSharp库在C#代码中实现时,我得到如下所示的响应。

查询客户端响应日志:{“statusCode”:0,“statusDescription”:null,“content”:“”,“headers”:[],“responseUri”:null,“errorMessage”:“请求已中止:无法创建SSL/TLS安全通道。”}

我的问题是,如何使用Restsharp库在C中实现这一点。下面是我实现这一点的代码。然而,我不断收到错误“请求被中止:无法创建SSL/TLS安全通道。”


    log.Info("-------------------Initiating Query Request---------------------------");
    
                QueryClient ad = new QueryClient();
                ad.institutionId = ConfigurationManager.AppSettings["OriginInst"];
                ad.proxyId = pr.proxyId;
                ad.requestSource = "XX";
                ad.requestTimestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                string concat = ad.institutionId + ad.proxyId + ad.requestSource + ad.requestTimestamp;
                HelperLibrary hl = new HelperLibrary();
                string key = ConfigurationManager.AppSettings["pkey2"];
                string signature = hl.GetSignature(concat, key);
                ad.requestSignature = signature;
    
                ServicePointManager.Expect100Continue = true;
                ServicePointManager.DefaultConnectionLimit = 9999;
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
                           | SecurityProtocolType.Tls11
                           | SecurityProtocolType.Tls12
                           | SecurityProtocolType.Ssl3;
    
    
                var client = new RestSharp.RestClient("https://service.url");
                
                //load certificates
                var myCert = new X509Certificate2(ConfigurationManager.AppSettings["certificatePath"], 
                    ConfigurationManager.AppSettings["certificatePassword"],
                    X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
                var rootCert = new X509Certificate2(ConfigurationManager.AppSettings["certificateRootPath"]);
    
                X509Chain chain = new X509Chain();
                chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
                chain.ChainPolicy.ExtraStore.Add(rootCert);
                X509CertificateCollection clientCerts = new X509CertificateCollection();
                clientCerts.Add(myCert);
                clientCerts.Add(rootCert);
               
                client.ClientCertificates = clientCerts;
                ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback((sender, certificate, chain, policyErrors) => { return true; });
                
                var request = new RestSharp.RestRequest(RestSharp.Method.POST);
                log.Info("Query Client Using Certificate Path: " + ConfigurationManager.AppSettings["certificatePath"]);
                request.AddHeader("accept", "application/html" target="_blank">json");
                request.AddHeader("content-type", "application/json");
                request.AddParameter("application/json", jsonString, RestSharp.ParameterType.RequestBody);
                var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
                var requestToLog = new
                {
                    resource = request.Resource,
                    parameters = serializer.Serialize(request.Parameters),
                method = request.Method.ToString(),
                    // This will generate the actual Uri used in the request
                    uri = client.BuildUri(request),
                };
                log.Info("Query Client Request: " + requestToLog);
    
                RestSharp.IRestResponse response = client.Execute(request);
                var responseToLog = new
                {
                    statusCode = response.StatusCode,
                    statusDescription = response.StatusDescription,
                    content = response.Content,
                    headers = response.Headers,
                    responseUri = response.ResponseUri,
                    errorMessage = response.ErrorMessage,
                };
                log.Info("Query Client Response Log: " + JsonConvert.SerializeObject(responseToLog));

非常感谢您的建议。

共有1个答案

娄建义
2023-03-14

这个错误与代码无关。出现问题的原因是我正在从浏览器访问该服务。然而,浏览器没有该证书颁发机构的任何记录。根证书必须添加到浏览器中的证书管理器中。以下是在Firefox浏览器中添加证书颁发机构的步骤。

工具-

关于如何在Firefox浏览器中添加证书颁发机构的第一个屏幕截图

关于如何在Firefox浏览器中添加证书颁发机构的第二个屏幕截图

一旦添加了证书,我就可以无障碍地访问该服务。

 类似资料:
  • 我正在努力做一些基本的事情,但我的头脑还没有完全清醒过来。我有一个spring boot应用程序,它应该公开一个rest url。 我是这样做的: 正如您所见,它使用的是另一个服务,我正试图用一个外部客户机实现该服务: 界面看起来像: 当MdmhClient在调用: 我知道要解决这个问题,我需要将证书导入jre。我正在运行Intellij IDE,并将项目的jdk路径设置为: 我还通过firefo

  • 问题内容: 我想要求基于Java 1.7内置HttpsServer的服务器进行客户端证书认证。 我似乎找不到任何使服务器无法通过身份验证的方法。无论客户端证书是受信任的,未知的还是完全不存在的,它都会愉快地为所有旧客户端提供数据。 我对文档的阅读建议,如果不信任客户端,则设置HttpsParameters.setNeedClientAuth(true)应该会导致身份验证失败。我发现有类似问题的人的

  • 对于我们的指向站点VPN,我们希望创建一个根证书。因此我们可以为所有需要登录VPN的合作伙伴创建尽可能多的客户端证书。(Azure虚拟网络) 手工完成这件事很完美。我们生成一个作为根CA的证书(自签名)。我们可以在powershell中这样做:

  • :) 我在本地Gentoo Linux集群上安装了kubenretes 1.9.3。 我正在尝试配置kubectl,如https://kubernetes.io/docs/getting-started-guides/scratch/ kubernetes文档声明使用和配置kubectl。到目前为止,我在文档中设置了和。不知道我还需要创建哪些证书。 文档声明使用和但是我找不到如何创建它们。 我使用

  • 使用用户证书验证 SSH (服务端) 在以安全为前提下要保障可靠性、可控性和一致性是非常复杂的。我们可以利用 SSH 又或者说 OpenSSH 来替代所依赖的中央身份验证(比如 LDAP 或者 Kerberos) 除了 通过 PIV 和 PKCS#11 验证 SSH 之外,还可以增加远程 SSH 验证的安全性。Facebook 和 Yahoo 已经更换使用 SSH 用户证书来避免中心认证系统宕机。