在.Net Core中使用HttpClient添加证书
最近公司要对接电信物联网北向API接口,当调用Auth授权接口时,需要用到证书,此篇文章记录下遇到的坑~
有两种调用接口的方式,下面是两种方式的简单示例
1、使用
HttpClient
 public static void Post(string appId, string secret)
{
    var handler = new HttpClientHandler
    {
        ClientCertificateOptions = ClientCertificateOption.Manual,
        SslProtocols = SslProtocols.Tls12,
        ServerCertificateCustomValidationCallback = (x, y, z, m) => true,
    };
    var path = Path.Combine(AppContext.BaseDirectory, "cert\\iot3rd.p12");
    handler.ClientCertificates.Add(new X509Certificate2(path, "IoM@1234"));
    var client = new HttpClient(handler);
    var content = new StringContent($"appId={appId}&secret={secret}");
    content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
    var httpResponseMessage = client.PostAsync("https://180.101.147.89:8743/iocm/app/sec/v1.1.0/login", content).GetAwaiter().GetResult();
    var result = httpResponseMessage.Content.ReadAsStringAsync().GetAwaiter().GetResult();
    Console.WriteLine(result);
}
2、使用
HttpWebRequest
public static string Post(string appId, string secret)
{
    ServicePointManager.ServerCertificateValidationCallback = (x, y, z, m) => true;
    ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
    HttpWebRequest httpRequest = (HttpWebRequest)HttpWebRequest.Create("https://180.101.147.89:8743/iocm/app/sec/v1.1.0/login");
    var p12certfile = Path.Combine(AppContext.BaseDirectory, "cert\\iot3rd.p12");
    X509Certificate2 cerCaiShang = new X509Certificate2(p12certfile, "IoM@1234");
    httpRequest.ClientCertificates.Add(cerCaiShang);
    httpRequest.Method = "POST";
    httpRequest.ContentType = "application/x-www-form-urlencoded";
    Stream requestStem = httpRequest.GetRequestStream();
    StreamWriter sw = new StreamWriter(requestStem);
    sw.Write($"appId={appId}&secret={secret}");
    sw.Close();
    HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse();
    Stream receiveStream = httpResponse.GetResponseStream();
    string result = string.Empty;
    using (StreamReader sr = new StreamReader(receiveStream))
    {
        return sr.ReadToEnd();
    }
}
需要注意一点,上面两种方式都需要设置服务器证书验证回调方法,否则回报下面的异常
The remote certificate is invalid according to the validation procedure.
而且两种方式的设置方式不一样,HttpClient是通过HttpClientHandler对象的ServerCertificateCustomValidationCallback属性设置的,而HttpWebRequest方式是通过ServicePointManager.ServerCertificateValidationCallback来设置的
在.Net Core中使用HttpClient添加证书的更多相关文章
- ASP.NET Core教程:在ASP.NET Core中使用HttPClient调用WebService
		
一.前言 在以前的一篇文章中,曾经讲述过如何在ASP.NET Core中调用WebService.但是那种方式是通过静态引用的方式去调用的,如果是在生产环境中,肯定不能使用这种方式去调用,幸运的是微软 ...
 - .net core 中使用httpclient,HttpClientFactory的问题
		
Microsoft 在.Net Framework 4.5中引入了HttpClient,并且是在.NET服务器端代码中使用Web API的最常用方法.但它有一些严重的问题,如释放HttpClient对 ...
 - asp.net core中使用HttpClient实现Post和Get的同步异步方法
		
准备工作 1.visual studio 2015 update3开发环境 2.net core 1.0.1 及以上版本 目录 1.HttpGet方法 2.HttpPost方法 3.使用示例 4. ...
 - ASP.NET Core中代码使用X509证书,部署到IIS上后报错:System cannot find the specified file 的解决办法(转载)
		
问: I am trying to embrace the mysteries of SSL communication and have found a great tutorial on this ...
 - HttpClient在.NET Core中的正确打开方式
		
问题来源 长期以来,.NET开发者都通过下面的方式发送http请求: using (var httpClient = new HttpClient()) { var response = await ...
 - Asp.Net Core中HttpClient的使用方式
		
在.Net Core应用开发中,调用第三方接口也是常有的事情,HttpClient使用人数.使用频率算是最高的一种了,在.Net Core中,HttpClient的使用方式随着版本的升级也发生了一些变 ...
 - 从零搭建一个IdentityServer——聊聊Asp.net core中的身份验证与授权
		
OpenIDConnect是一个身份验证服务,而Oauth2.0是一个授权框架,在前面几篇文章里通过IdentityServer4实现了基于Oauth2.0的客户端证书(Client_Credenti ...
 - ASP.NET Core中如何针对一个使用HttpClient对象的类编写单元测试
		
原文地址: How to unit test a class that consumes an HttpClient with IHttpClientFactory in ASP.NET Core? ...
 - 项目开发中的一些注意事项以及技巧总结  基于Repository模式设计项目架构—你可以参考的项目架构设计  Asp.Net Core中使用RSA加密   EF Core中的多对多映射如何实现?  asp.net core下的如何给网站做安全设置  获取服务端https证书  Js异常捕获
		
项目开发中的一些注意事项以及技巧总结 1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...
 
随机推荐
- DAX 第四篇:CALCULATE详解
			
CALCULATE()函数是DAX中最复杂的函数,用于计算由指定过滤器修改的上下文中的表达式. CALCULATE(<expression>,<filter1>,<fil ...
 - Zabbix server 更改数据库密码
			
Zabbix server 更改数据库密码 当我们的 Zabbix server 使用的数据库信息发生了改变,我们需要更改旧配置. 涉及到数据库配置信息的文件有2个,分别是 /etc/zabbix/z ...
 - Spring整合Mybaits java.sql.SQLException: Access denied for user '***'@'localhost' (using password: YES)
			
最近在搞Spring和Mybatis的整合,当我们在Spring里面配置数据源,而数据源是从外部的properties文件读取过来的时候就会报错 java.sql.SQLException: Acce ...
 - jakarta-oro-2.0.8.jar-----------JAVA  FTP相关
			
资源不好找,找到了就和大家分享一下! 链接:https://share.weiyun.com/51kBB0y 密码:2hcxcu
 - Winform中设置ZedGraph当前所有曲线的颜色
			
场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...
 - 有两个CIDR地址块208.128/11和208.130.28/22。是否有那一个地址块包含了另一个地址?如果有,请指出,并说明理由。
			
有两个CIDR地址块208.128/11和208.130.28/22.是否有那一个地址块包含了另一个地址?如果有,请指出,并说明理由. 208.128/11的前缀为:11010000 100: 208 ...
 - Java自学-集合框架 HashSet
			
Java集合框架 HashSet 示例 1 : 元素不能重复 Set中的元素,不能重复 package collection; import java.util.HashSet; public cla ...
 - maven 学习---NetBeans IDE集成Maven
			
NetBeans6.7更新版本已经内置对Maven支持.如遇以前的版本,Maven插件在插件管理器中可用.我们正在使用NetBeans在这个例子中使用6.9. 在NetBeans一些特点如下 您可以从 ...
 - ios问题笔记
			
32位 最多内存0到3G 64位 最多内存0到8G iOS模板code4app.com github.com developer.apple.con 动画 label不能变小 只能变大,(而uivie ...
 - windows elasticsearch搭集群启动失败failed to send join request to master....
			
创建几份elasticsearch副本,修改各自config\elasticsearch.yml配置文件: 第一份: #允许elasticsearch跨域访问,使用elasticsearch-head ...