最近公司要对接电信物联网北向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来设置的

最新文章

  1. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(15)-权限管理系统准备
  2. 数据库日常维护-CheckList_01历史Agent Job执行情况检查
  3. ELK日志管理之——kibana部署
  4. 创建MyOffice项目
  5. 加载cocos studio场景
  6. poj 2777
  7. 循序渐进之Spring AOP(5) - 创建切面
  8. excel vba 当cell的值变化时 进行判断操作
  9. 【OJ】PAT-A解题报告
  10. POJ 1733 Parity game(离散化+带权并查集)
  11. js获取当前url地址及参数
  12. cf C. Valera and Elections
  13. Java的一些基础小知识之JVM与GC (转)
  14. spring AOP 代理机制、执行过程、四种实现方式及示例详解
  15. 解读Java内部类
  16. VB6获取Chrome地址栏的URL信息
  17. CSS(选择器)
  18. 微信小程序 选择微信自带的地址 用户授权选择了拒绝
  19. laravel migrate时报错:Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
  20. python3.4用函数操作mysql5.7数据库

热门文章

  1. Window权限维持(四):快捷方式修改
  2. 【04】Nginx:rewrite / if / return / set 和变量
  3. Python破解js加密实例(有道在线翻译)
  4. Winform中设置ZedGraph鼠标双击获取距离最近曲线上的点的坐标值
  5. linux桌面系统的约定
  6. https申请证书并部署到网站流程,浏览器验证证书流程
  7. amanda安装
  8. 英文DIAMAUND钻石DIAMAUND词汇
  9. 【vuejs】vue数组操作
  10. 3-3 groupby操作