证书锁定功能示例有哪些?

在典型的 SSL 场景中,服务端会配置证书,并且证书由证书授权机构(CA)签名。 SSL连接建立过程中,服务端把CA签过名的证书传递给客户端,客户端使用自己预置的CA列表校验签名,保证证书的合法性和通信的安全性。

但有些预装 CA也不可靠,有可能颁发欺诈性证书,此时SSL连接会面临中间人攻击的风险。一些安全要求较高的应用,需要限制只信任固定的证书,来确保服务端证书的合法性。这就是证书锁定功能。

证书锁定功能示例有哪些?-鸿蒙开发者社区

HarmonyOS
2024-05-28 20:33:34
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
leeixndong

使用的核心API

核心代码解释

  • 生成证书pin码
$ cat pingan.com.cn.pem \ 
> | sed -n '/-----BEGIN/,/-----END/p' \ 
> | openssl x509 -noout -pubkey \ 
> | openssl pkey -pubin -outform der \ 
> | openssl dgst -sha256 -binary \ 
> | openssl enc -base64 
QPNGUynqMxBjlGKt1aqSQ93bCq9T4wJ1ENO7TVAGJpw=
  •  entry\src\main\resources\base\profile\network_config.json配置
{ 
  "network-security-config": { 
    "domain-config": [ 
      { 
        "domains": [ 
          { 
            "include-subdomains": true, 
            "name": "www.baidu.com" 
          } 
        ], 
        "trust-anchors": [ 
          {"certificates": "/data/app/el1/bundle/public/com.example.pin/entry/resources/resfile"} 
        ] 
      }, 
      { 
        "domains": [ 
          { 
            "include-subdomains": true, 
            "name": "www.test.com" 
          }, 
          { 
            "include-subdomains": true, 
            "name": "test2.com" 
          }, 
          { 
            "include-subdomains": true, 
            "name": "rsb-stg2.pingan.com.cn" 
          } 
        ], 
        "pin-set": { 
          "expiration": "2024-08-06", 
          "pin": [ 
            { 
              "digest-algorithm": "sha256", 
              "digest": "QPNGUynqMxBjlGKt1aqSQ93bCq9T4wJ1ENO7TVAGJpw=" 
            }, 
            { 
              "digest-algorithm": "sha256", 
              "digest": "Q6TCQAWqP4t+eq41xnKaUgJdrPWqyG5L+Ni2YzMhqdY=" 
            }, 
            { 
              "digest-algorithm": "sha256", 
              "digest": "Q9TCQAWqP4t+eq41xnKaUgJdrPWqyG5L+Ni2YzMhqdY=" 
            } 
          ] 
        } 
      } 
    ] 
  } 
} 

验证时,将如下代码从配置文件中删除

{ 
              "digest-algorithm": "sha256", 
              "digest": "QPNGUynqMxBjlGKt1aqSQ93bCq9T4wJ1ENO7TVAGJpw=" 
            },
  • 请求百度    没有锁定证书,可以正常请求
request_baidu() { 
    let httpRequest = http.createHttp(); 
    httpRequest.request(// 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定 
      "https://www.baidu.com/", 
      { 
        // method: http.RequestMethod.POST, // 可选,默认为http.RequestMethod.GET 
        // 当使用POST请求时此字段用于传递内容 
        // extraData: '{"clientInfo":{"appId":"koudai","deviceId":"AUUID_ecb20135c96032e205f9a0aed0196f3a67e4d257","platform":"iOS","version":"6.18.0","osVersion":"","equipmentBrand":"","equipmentType":""},"configMeta":[{"bk":"Leek-RSA-Retry","files":[{"id":0,"bk":"","level":0,"fileName":"dynamic","version":"20231122092739-08b444522cc0abd2","fileStatus":0,"content":"","decryptKey":"","fileSize":0,"fileType":0}]}]}', 
        // expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型 
        // usingCache: true, // 可选,默认为true 
        priority: 1, // 可选,默认为1 
        // 开发者根据自身业务需要添加header字段 
        // header: new Header('application/json'), 
        readTimeout: 60000, // 可选,默认为60000ms 
        connectTimeout: 60000, // 可选,默认为60000ms 
      }, 
      (err: BusinessError, data: http.HttpResponse) => { 
        if (!err) { 
          AlertDialog.show({message : `result = ${JSON.stringify(data.result)}`}); 
          // data.result为HTTP响应内容,可根据业务需要进行解析 
          console.info('Result:' + JSON.stringify(data.result)); 
          console.info('code:' + JSON.stringify(data.responseCode)); 
          console.info('type:' + JSON.stringify(data.resultType)); 
          // data.header为HTTP响应头,可根据业务需要进行解析 
          console.info('header:' + JSON.stringify(data.header)); 
          console.info('cookies:' + JSON.stringify(data.cookies)); // 自API version 8开始支持cookie 
          // 取消订阅HTTP响应头事件 
          httpRequest.off('headersReceive'); 
          // 当该请求使用完毕时,开发者务必调用destroy方法主动销毁该JavaScript Object。 
          httpRequest.destroy(); 
        } else { 
          AlertDialog.show({message : `error = ${JSON.stringify(err)}`}); 
          console.info('error:' + JSON.stringify(err)); 
          // 取消订阅HTTP响应头事件 
          httpRequest.off('headersReceive'); 
          // 当该请求使用完毕时,开发者务必调用destroy方法主动销毁该JavaScript Object。 
          httpRequest.destroy(); 
        } 
      }); 
  }
  • 请求平安    配置了证书锁定,请求会报错,curl错误码为90
request_pingan() { 
    let httpRequest = http.createHttp(); 
    httpRequest.request(// 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定 
      "https://rsb-stg2.pingan.com.cn/brcp/stp/cust/artemis/v2/config/get", 
      { 
        method: http.RequestMethod.POST, // 可选,默认为http.RequestMethod.GET 
        // 当使用POST请求时此字段用于传递内容 
        extraData: '{"clientInfo":{"appId":"koudai","deviceId":"AUUID_ecb20135c96032e205f9a0aed0196f3a67e4d257","platform":"iOS","version":"6.18.0","osVersion":"","equipmentBrand":"","equipmentType":""},"configMeta":[{"bk":"Leek-RSA-Retry","files":[{"id":0,"bk":"","level":0,"fileName":"dynamic","version":"20231122092739-08b444522cc0abd2","fileStatus":0,"content":"","decryptKey":"","fileSize":0,"fileType":0}]}]}', 
        expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型 
        usingCache: true, // 可选,默认为true 
        priority: 1, // 可选,默认为1 
        // 开发者根据自身业务需要添加header字段 
        header: new Header('application/json'), 
        readTimeout: 60000, // 可选,默认为60000ms 
        connectTimeout: 60000, // 可选,默认为60000ms 
        // usingProtocol: http.HttpProtocol.HTTP1_1, // 可选,协议类型默认值由系统自动指定 
        // usingProxy: false, //可选,默认不使用网络代理,自API 10开始支持该属性 
        // caPath: '/data/storage/el2/base/haps/entry/files/pingan.com.cn.pem', // 可选,默认使用系统预设CA证书,自API 10开始支持该属性 
        // caPath: filePath, // 可选,默认使用系统预设CA证书,自API 10开始支持该属性 
        // dnsOverHttps:"", 
        // dnsServers:[], 
        // multiFormDataList: [ // 可选,仅当Header中,'content-Type'为'multipart/form-data'时生效,自API 11开始支持该属性 
        //   { 
        //     name: "Part1", // 数据名,自API 11开始支持该属性 
        //     contentType: 'text/plain', // 数据类型,自API 11开始支持该属性 
        //     data: 'Example data', // 可选,数据内容,自API 11开始支持该属性 
        //     remoteFileName: 'example.txt' // 可选,自API 11开始支持该属性 
        //   }, { 
        //   name: "Part2", // 数据名,自API 11开始支持该属性 
        //   contentType: 'text/plain', // 数据类型,自API 11开始支持该属性 
        //   // data/app/el2/100/base/com.example.myapplication/haps/entry/files/fileName.txt 
        //   filePath: `${getContext(this).filesDir}/fileName.txt`, // 可选,传入文件路径,自API 11开始支持该属性 
        //   remoteFileName: 'fileName.txt' // 可选,自API 11开始支持该属性 
        // } 
        // ] 
      }, 
      (err: BusinessError, data: http.HttpResponse) => { 
        if (!err) { 
          AlertDialog.show({message : `result = ${JSON.stringify(data.result)}`}); 
          // data.result为HTTP响应内容,可根据业务需要进行解析 
          console.info('Result:' + JSON.stringify(data.result)); 
          console.info('code:' + JSON.stringify(data.responseCode)); 
          console.info('type:' + JSON.stringify(data.resultType)); 
          // data.header为HTTP响应头,可根据业务需要进行解析 
          console.info('header:' + JSON.stringify(data.header)); 
          console.info('cookies:' + JSON.stringify(data.cookies)); // 自API version 8开始支持cookie 
          // 取消订阅HTTP响应头事件 
          httpRequest.off('headersReceive'); 
          // 当该请求使用完毕时,开发者务必调用destroy方法主动销毁该JavaScript Object。 
          httpRequest.destroy(); 
        } else { 
          AlertDialog.show({message : `error = ${JSON.stringify(err)}`}); 
          console.info('error:' + JSON.stringify(err)); 
          // 取消订阅HTTP响应头事件 
          httpRequest.off('headersReceive'); 
          // 当该请求使用完毕时,开发者务必调用destroy方法主动销毁该JavaScript Object。 
          httpRequest.destroy(); 
        } 
      }); 
  }

实现效果

注明适配的版本信息

IDE版本:4.1.3.500

SDK版本:HarmonyOS Next Developer Preview1

分享
微博
QQ
微信
回复
2024-05-29 21:39:00
相关问题
侧滑删除功能的列表哪些
425浏览 • 1回复 待解决
用户认证功能哪些
378浏览 • 1回复 待解决
PolarDB支持哪些备份功能
2097浏览 • 1回复 待解决
PolarDB拥有哪些诊断和优化的功能
1157浏览 • 1回复 待解决
NoSQL的MongoDB哪些优点?
2738浏览 • 1回复 待解决
横竖屏旋转demo哪些
393浏览 • 1回复 待解决
ArkUI调试技巧哪些
230浏览 • 1回复 待解决
GlobalThis替代方案哪些
433浏览 • 1回复 待解决
MongoDB的优势哪些
2731浏览 • 1回复 待解决
OceanBase业务案例哪些
2749浏览 • 1回复 待解决
PolarDB 备份过程哪些
1589浏览 • 1回复 待解决
ability的主题哪些可以设置?
15529浏览 • 3回复 待解决
支持鸿蒙系统的手机哪些
3762浏览 • 2回复 待解决
redis相比memcached的优势哪些
1223浏览 • 1回复 待解决
哪些好用的MySQL监控软件?
980浏览 • 1回复 待解决
公共事件哪些简单使用
467浏览 • 1回复 待解决
ArkTS哪些语法规则,懂得吗?
705浏览 • 1回复 待解决
WaterFlow的使用范例哪些
322浏览 • 1回复 待解决
应用物理存储路径哪些
206浏览 • 1回复 待解决
哪些创建线程的方式
985浏览 • 1回复 待解决
PolarDB MySQL 的参数哪些
1741浏览 • 1回复 待解决