Skip to content

网络安全与 HTTPS

鸿蒙 HTTPS/TLS 安全机制、SSL Pinning、证书校验。


1. HTTPS 基础

1.1 HTTPS vs HTTP

HTTP(明文):
├─ 数据明文传输
├─ 可被窃听
└─ 可被篡改

HTTPS(加密):
├─ TLS/SSL 加密传输
├─ 防窃听
├─ 防篡改
└─ 身份验证(证书)

1.2 证书类型

类型用途适用场景
DV域名验证个人网站
OV组织验证企业官网
EV增强验证金融/支付
自签内部测试开发/测试环境

2. SSL Pinning(证书绑定)

2.1 为什么需要 SSL Pinning?

普通 HTTPS:
├─ 信任系统证书库(CA 机构)
├─ 攻击者可以伪造证书(MITM)
└─ 数据可能泄露

SSL Pinning:
├─ 只信任指定的证书/公钥
├─ 伪造证书被拒绝
└─ 有效防止 MITM 攻击

2.2 实现 SSL Pinning

typescript
import { http, ssl } from '@kit.NetworkKit'

// 加载 PEM 格式的证书
let certificate = fs.readSync('rawfile://server.pem')

// 创建 SSL 上下文
let sslContext = ssl.createSSLContext({
    caCertificates: [certificate],  // 信任的证书
    serverCertPin: true,            // 启用证书绑定
    verifyHostname: true,           // 验证主机名
    minVersion: ssl.TLSVersion.TLS1_2  // 最低 TLS 版本
})

// 使用 SSL Pinning 的 HTTP 客户端
let httpClient = http.createHttp({
    sslContext: sslContext
})

// 请求会自动验证证书
httpClient.request('https://api.example.com/data', {
    method: http.HttpRequestMethod.GET
}).then((response: http.HttpResponse) => {
    if (response.statusCode === 200) {
        console.log('安全请求成功')
    }
}).catch((err: http.HttpError) => {
    if (err.code === 4001) {
        console.error('证书验证失败!可能是 MITM 攻击')
    }
})

3. TLS/SSL 配置

3.1 TLS 版本选择

typescript
// TLS 版本优先级(高到低)
TLS 1.3 > TLS 1.2 > TLS 1.1 > TLS 1.0

// 推荐配置
let sslContext = ssl.createSSLContext({
    minVersion: ssl.TLSVersion.TLS1_2,  // 最低 TLS 1.2
    maxVersion: ssl.TLSVersion.TLS1_3,  // 最高 TLS 1.3
    cipherSuites: [                     // 加密套件
        ssl.CipherSuite.TLS_AES_256_GCM_SHA384,
        ssl.CipherSuite.TLS_CHACHA20_POLY1305_SHA256
    ]
})

3.2 证书链验证

typescript
// 证书链验证
let sslContext = ssl.createSSLContext({
    caCertificates: [
        // 根证书
        fs.readSync('rawfile://root.pem'),
        // 中间证书
        fs.readSync('rawfile://intermediate.pem')
    ],
    verifyServerCert: true,  // 验证服务器证书
    verifyHostname: true,    // 验证主机名
    enableCertChainVerify: true  // 启用证书链验证
})

4. 常见安全问题与防御

4.1 MITM 攻击防御

MITM 攻击方式:
├─ 伪造证书
├─ 劫持网络
└─ 中间人监听

防御措施:
├─ ✅ SSL Pinning
├─ ✅ 证书链验证
├─ ✅ 最低 TLS 版本(TLS 1.2+)
├─ ✅ Certificate Transparency
└─ ❌ 禁用 SSL 验证(绝对不要!)

4.2 数据加密

typescript
// 敏感数据加密
import { crypto } from '@kit.CryptoArchitectureKit'

// AES 加密
let key = crypto.generateKey({
    algorithm: crypto.Algorithm.AES_256,
    keySize: 256
})

let encrypted = crypto.encrypt({
    key: key,
    data: sensitiveData,
    algorithm: crypto.Algorithm.AES_256_GCM
})

// 解密
let decrypted = crypto.decrypt({
    key: key,
    data: encrypted,
    algorithm: crypto.Algorithm.AES_256_GCM
})

5. 面试高频考点

Q1: SSL Pinning 的作用?

回答:只信任指定的证书,防止 MITM(中间人)攻击。即使攻击者伪造了 CA 证书也无法通过验证。

Q2: TLS 1.3 相比 TLS 1.2 的优势?

回答:TLS 1.3 握手更快(1-RTT)、加密套件更强、去除了不安全算法、前向保密。

Q3: 敏感数据如何存储?

回答:使用 CryptoArchitectureKit 加密存储,或 AssetStore 安全存储(用户卸载后数据保留)。


🐱 小猫提示:网络安全记住 "SSL Pinning 防 MITM、TLS 1.2+、敏感数据加密"