鸿蒙Next域名SSL证书校验中certificate pinning如何配置

在鸿蒙Next开发中,配置HTTPS请求时遇到SSL证书校验问题。请问如何正确实现certificate pinning(证书固定)?需要具体配置步骤或示例代码,包括如何获取并绑定特定域名的公钥或证书哈希值,以及是否需要修改系统默认的证书链验证逻辑?

2 回复

在鸿蒙Next中配置SSL证书锁定(certificate pinning)可通过以下步骤实现:

  1. 获取证书指纹
    使用OpenSSL提取服务器证书的SHA256指纹:

    openssl s_client -connect example.com:443 | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256
    
  2. 配置网络安全
    module.json5中声明网络权限:

    "requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      }
    ]
    
  3. 实现证书校验
    使用http模块创建请求时,通过[@ohos](/user/ohos)/sslCertificate模块验证指纹:

    import sslCert from '[@ohos](/user/ohos)/sslCertificate';
    
    // 在请求选项中设置自定义校验逻辑
    let options = {
      // 对比服务器返回证书与预置指纹是否匹配
      caCerts: [/* 预置证书 */],
      verifyCert: (cert: sslCert.X509Cert) => {
        return cert.getFingerprint('SHA256') === '预置指纹';
      }
    };
    
  4. 注意事项

    • 建议预置多个证书指纹以支持证书轮换
    • 生产环境需通过安全方式存储指纹(如加密配置)
    • 定期更新证书指纹避免服务中断

通过以上步骤可有效防止中间人攻击,确保通信安全。

更多关于鸿蒙Next域名SSL证书校验中certificate pinning如何配置的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next(HarmonyOS NEXT)应用中配置SSL证书锁定(Certificate Pinning)可增强通信安全性,确保应用仅信任指定证书。以下是配置步骤及示例代码:

配置步骤:

  1. 获取证书公钥哈希
    提取服务器证书的SHA-256哈希值(可通过OpenSSL命令获取):

    openssl s_client -connect example.com:443 | openssl x509 -pubkey | openssl pkey -pubin -outform der | openssl dgst -sha256
    
  2. 在代码中配置证书锁定
    使用鸿蒙网络管理模块(@ohos.net.http)的CertificatePinning实现。

示例代码:

import http from '@ohos.net.http';
import { BusinessError } from '@ohos.base';

// 配置证书哈希(示例值,需替换为实际值)
const pinnedCertHashes: string[] = [
  "SHA256:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" // 替换为实际哈希
];

// 创建HttpClient实例
let httpClient = http.createHttp();

// 设置证书锁定
try {
  httpClient.setCertificatePinning({
    certificates: pinnedCertHashes,
    callback: (error: BusinessError) => {
      if (error) {
        console.error("Certificate pinning failed: " + JSON.stringify(error));
        // 处理校验失败(如终止请求)
      }
    }
  });
} catch (error) {
  console.error("Failed to set certificate pinning: " + JSON.stringify(error));
}

// 发送HTTPS请求
httpClient.request(
  "https://example.com",
  {
    method: http.RequestMethod.GET,
  }, (err, data) => {
    if (err) {
      console.error("Request failed: " + JSON.stringify(err));
      return;
    }
    console.info("Request success: " + JSON.stringify(data));
  }
);

关键说明:

  • 证书哈希:必须使用Base64编码的SHA-256哈希值,格式为SHA256:<哈希值>
  • 错误处理:若证书校验失败,应在callback中中断请求或通知用户。
  • 兼容性:确保证书更新时同步调整哈希值,避免因证书过期导致服务中断。

通过以上配置,应用将仅接受匹配预设哈希的证书,有效防御中间人攻击。

回到顶部