C#发起带证书的https请求

1 篇文章 0 订阅
1 篇文章 0 订阅

在对接API过程中,需要用到对方提供的xxx.p12证书,以及对应的密码,解决方案如下:

/// <summary>
/// 带证书请求
/// </summary>
/// <param name="url">请求地址</param>
/// <param name="method">请求方式</param>
/// <param name="content">请求的字符串</param>
/// <param name="headers">请求头</param>
/// <param name="certificatePath">证书路径</param>
/// <param name="certPassword">证书密码</param>
/// <returns>响应结果</returns>
/// <example>
/// Console.WriteLine(HttpWebRequestWithCertificate("https://host:port/path","POST", "{JsonData}", null,@"......\xxx.p12","123456"));
/// </example>

public string HttpWebRequestWithCertificate(string url, string method, string content, Dictionary<string, string> headers, string certificatePath, string certPassword)
{
    string result = string.Empty;
    try
    {
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | (SecurityProtocolType)768 | (SecurityProtocolType)3072 | (SecurityProtocolType)0x300 | (SecurityProtocolType)0xC00;
        ServicePointManager.ServerCertificateValidationCallback += (q, w, e, r) => r == SslPolicyErrors.None;
        X509Certificate2 cer = new X509Certificate2(certificatePath, certPassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
        byte[] bytes = System.Text.Encoding.UTF8.GetBytes(content);
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.ClientCertificates.Add(cer);//必须先最先配置ClientCertificates字段,否则会报有关SSL/TLS错
        request.ContentType = "application/json";
        request.Method = method;
        request.ContentLength = bytes.Length;
        if (headers != null && headers.Count > 0)
        {
            foreach (var item in headers)
            {
                 request.Headers.Add(item.Key, item.Value);
            }
        }
        using (Stream requestStream = request.GetRequestStream())
        {
            requestStream.Write(bytes, 0, bytes.Length);
            requestStream.Close();
        }
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream responseStream = response.GetResponseStream();
        if (responseStream != null)
        {
            StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.UTF8;
            result = reader.ReadToEnd().Trim();
            reader.Close();
            responseStream.Close();
            request.Abort();
            response.Close();
        }
    }
    catch (Exception ex)
    {
        return ex.Message + ex.StackTrace;
    }
    return result;
}

参考链接:
C#发起带证书的http请求(通常用于微信发红包)
java使用安全证书进行接口联调

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在C#发起HTTP请求,可以使用HttpWebRequest类或HttpClient类。使用HttpWebRequest类时,可以按照以下步骤进行操作: 1. 创建一个HttpWebRequest实例,并设置请求的URL: ``` HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); ``` 2. 设置请求的方法(GET、POST等): ``` request.Method = "GET"; ``` 3. 设置请求头(可选): ``` request.Headers.Add("key", "value"); ``` 4. 发送请求并获取响应: ``` using (WebResponse response = request.GetResponse()) { // 读取响应数据 using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { string content = reader.ReadToEnd(); // 对响应数据进行处理 // ... } } ``` 另外,还可以使用HttpClient类来发起HTTP请求,代码示例如下: ```csharp using (HttpClient client = new HttpClient()) { HttpResponseMessage response = await client.GetAsync(url); if (response.IsSuccessStatusCode) { string content = await response.Content.ReadAsStringAsync(); // 对响应数据进行处理 // ... } } ``` 以上是两种常用的C#发起HTTP请求的方法。可以根据具体需求选择其中一种来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C#实现发送简单HTTP请求的方法](https://download.csdn.net/download/weixin_38688352/12806593)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C# 发送http网络请求](https://blog.csdn.net/weixin_44517477/article/details/121725560)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [C#发起http的GET/POST请求并处理响应,及其函数封装](https://blog.csdn.net/qq_40649350/article/details/118682995)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值