跳转至正文

Capacitor App 的 SSL Pinning

在 Capacitor 应用中实现 SSL pinning,可增强安全性、防范 MITM 攻击,同时符合应用商店指南。

为 Capacitor 应用配置 SSL Pinning Capgo 博客插图

SSL pinning 通过在应用内直接验证服务器证书,保护您的应用免受中间人(MITM)攻击等安全威胁。 如果没有它,攻击者可能拦截敏感数据或篡改通信。下面说明它为什么重要,以及如何有效实现:

为什么 SSL Pinning 至关重要:

  • 防止 MITM 攻击: 阻止对 API 调用的拦截。
  • 增强安全性: 用已知值校验服务器证书。
  • 满足 App Store 要求: 有助于符合 Apple 和 Google 的安全标准。
  • 建立用户信任: 保障用户数据在传输过程中的安全。

实现 SSL Pinning 的关键步骤:

  1. 选择合适的插件: 确保与 iOS 和 Android 兼容。
  2. 配置你的应用: 将证书数据嵌入应用设置中。
  3. 平台专属设置:
    • Android: 使用 network_security_config.xml 来定义证书锁定。
    • iOS: 调整 Info.plist 并在运行时验证证书。
  4. 测试你的配置: 使用如下工具模拟攻击: Charles Proxy 以验证安全性。
  5. 管理证书: 定期更新证书并保留备份,以避免服务中断。

快速对比:Android 与 iOS 的 SSL Pinning

功能 Android iOS
配置文件 network_security_config.xml Info.plist
证书位置 res/raw 目录 应用 bundle
验证方法 基于 XML 的配置 ATS 和运行时验证
更新流程 手动或自动 手动或自动

专家提示: 使用以下工具自动更新证书 Capgo 以确保无需重新构建应用即可实现平稳、安全的过渡。这可防止服务中断,并符合应用商店指南要求。

SSL Pinning 是任何应用的必备功能 Capacitor 用于保障 API 通信安全并保护用户数据的应用。立即开始实施,提升应用安全性。

详解 TLS/SSL Certificate Pinning

设置要求

在您的应用中配置 SSL pinning Capacitor 应用 需要周密的规划和精确的设置。以下是有效实施证书固定(certificate pinning)需要了解的关键点。

选择合适的 SSL Pinning 插件

第一步是选择一个在 iOS 和 Android 上都能良好运行,且具备强大安全特性的插件。对于 Capacitor 应用, @capgo/capacitor-ssl-pinning 在 iOS 和 Android 上,将 CapacitorHttp 的 HTTPS 连接固定到随应用打包的证书。对比插件时,请考虑以下因素:

  • 平台兼容性:验证该插件在 iOS 和 Android 设备上均能正常工作。
  • 证书管理:选择能简化证书处理流程的插件。
  • 轻松更新:寻找支持在不重新构建整个应用的情况下更新证书的插件。
  • 性能考量:评估插件对应用速度和响应性的潜在影响。

配置您的 Capacitor 应用

Capacitor 框架文档网站

选定插件后,下一步是配置你的 Capacitor 应用以启用 SSL 固定。以下是配置示例:

// Example: capacitor.config.ts
{
  appId: 'com.example.app',
  plugins: {
    SSLPinning: {
      certs: ['cert1', 'cert2'],
      validateCertificates: true,
      allowBackup: false
    }
  }
}

建议逐步推出这些更改,以确保用户平稳过渡。完成通用配置后,请继续针对 Android 和 iOS 进行平台特定调整,以完成实施。

特定平台配置

设置 SSL 固定需要针对 Android 和 iOS 进行定制配置,以有效防范中间人攻击。

Android 实现

在 Android 上,SSL 固定涉及设置网络安全配置和管理证书。操作方法如下:

  • 创建网络安全配置

    首先,创建一个名为 network_security_config.xml ,详见 res/xml 您的 Android 项目目录:

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <domain-config>
            <domain includeSubdomains="true">api.example.com</domain>
            <pin-set>
                <pin digest="SHA-256">your_certificate_hash</pin>
                <!-- Backup pin -->
                <pin digest="SHA-256">backup_certificate_hash</pin>
            </pin-set>
        </domain-config>
    </network-security-config>
  • 更新 AndroidManifest.xml 文件

    在您的 AndroidManifest.xml 文件:

    <application
        android:networkSecurityConfig="@xml/network_security_config"
        ...>
  • 添加证书文件

    将所需的证书文件(.cer 或 .pem)放入 res/raw Android 项目的目录中。

iOS 实现

对于 iOS,SSL Pinning 通过修改 App Transport Security (ATS) 设置并实现运行时证书验证来配置。请按以下步骤操作:

  • 在 Info.plist 中配置 ATS

    将以下配置添加到你的应用的 Info.plist 文件:

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <false/>
        <key>NSExceptionDomains</key>
        <dict>
            <key>api.example.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSPinnedDomains</key>
                <true/>
            </dict>
        </dict>
    </dict>
  • 在 Code 中初始化 SSL Pinning

    使用以下 code 代码片段,在应用初始化时启用 SSL Pinning:

    import { HTTP } from '@ionic-native/http/ngx';
    
    export class AppComponent {
      constructor(private http: HTTP) {
        this.initializeSSLPinning();
      }
    
      async initializeSSLPinning() {
        try {
          await this.http.setSSLCertMode('pinned');
          console.log('SSL Pinning initialized successfully');
        } catch (error) {
          console.error('SSL Pinning initialization failed:', error);
        }
      }
    }

Android 与 iOS 实现对比

以下是 Android 和 iOS 在 SSL Pinning 实现上的简要对比:

功能 Android iOS
配置文件 network_security_config.xml Info.plist
证书位置 res/raw 目录 应用 bundle
验证方法 XML 配置 ATS 和运行时验证
插件支持 原生 + 自定义插件 原生 + 自定义插件

接下来,我们将深入探讨测试策略和常见错误,帮助你确保 SSL 固定配置可靠且安全。

测试与修复

测试 SSL 固定配置对于防止中间人攻击(MITM)至关重要。以下是如何确保实现安全并排查常见问题的方法。

MITM 攻击测试

你可以使用 Charles Proxy 等代理工具来模拟 MITM 攻击,并验证你的 SSL 固定配置。

Charles Proxy 测试

按照以下步骤使用 Charles Proxy 进行测试:

  1. 在设备上安装 Charles 根证书。
  2. 在 Charles 设置中启用 SSL 代理。
  3. 将你的 API 域名添加到 SSL 代理列表。
  4. 配置你的设备,让流量通过 Charles 代理转发。

如果 SSL Pinning 实现正确,测试期间你应该会在应用日志中看到证书验证错误。

网络配置测试

使用以下 code 代码片段,验证使用固定证书的连接:

// Validate pinned certificate connection
try {
    const response = await Http.get({
        url: 'https://api.example.com/test',
        headers: { 'Content-Type': 'application/json' }
    });
    console.log('Connection successful');
} catch (error) {
    console.error('Certificate validation failed:', error);
}

常见错误解决方案

以下是常见的 SSL Pinning 问题及解决方法:

错误类型 常见原因 解决方案
证书不匹配 配置中的哈希值不正确 使用以下方式验证证书哈希值: OpenSSL.
路径问题 证书位置错误 请检查各平台对应的证书路径。
格式问题 证书格式无效 将证书转换为正确格式(例如 PEM 或 DER)。
网络超时 Pinning 配置错误 请验证您的网络安全设置。

验证证书哈希值

要确保证书哈希与您的配置一致,请使用以下 OpenSSL 命令:

# Generate the correct certificate hash
openssl x509 -in certificate.pem -pubkey -noout | \
openssl rsa -pubin -outform der | \
openssl dgst -sha256 -binary | base64

解决所有错误后,请确保您的证书更新流程运行正常。

证书更新测试

在配置中同时包含主证书和备用证书,以防止更新期间出现服务中断。

更新测试流程

以下是测试证书轮换的示例:

// Rotate certificates
const certificates = {
    current: 'sha256/current_certificate_hash',
    backup: 'sha256/backup_certificate_hash'
};

// Test both certificates
async function validateCertificates() {
    try {
        await testConnection(certificates.current);
        console.log('Primary certificate valid');
    } catch {
        try {
            await testConnection(certificates.backup);
            console.log('Backup certificate valid');
        } catch {
            console.error('All certificates invalid');
        }
    }
}

监控证书过期

定期检查证书是否过期,以避免业务中断:

# Check certificate expiration date
openssl x509 -enddate -noout -in certificate.pem

最后,请在各种条件下测试您的配置,包括稳定的 WiFi、移动数据、离线场景和网络切换,以确保安全性和功能的稳健性。

SSL Pinning 管理

完成 SSL pinning 配置后,下一步就是管理证书和密钥 pinning,以长期维持高强度的安全性。

证书 Pinning vs. 密钥 Pinning

说到 SSL Pinning,主要有两种方式:证书锁定和公钥锁定。两者各有优势,尤其是在 Capacitor 应用:

功能 证书固定 (Certificate Pinning) 公钥固定 (Public Key Pinning)
安全等级 高 – 固定整个证书 极高 – 仅固定公钥
维护 每次续期都需要更新 更新更少,续期后仍有效
实现 实现更简单 初始配置较复杂
存储占用 占用更多存储空间 存储需求极低
更新频率 每次证书续期 仅在公钥变更时

通过这份对比分析,你可以决定哪种方案最符合应用的长期维护策略。

自动化证书更新

保持证书更新对于保障 API 通信安全至关重要。Capgo 通过自动完成这些更新,提供了一套精简方案,无需重新提交到应用商店。其优势如下:

  • 采用速度快: 更新会分阶段发布并跟踪,24 小时内采用率可达 95% [1].
  • 加密传输: 更新全程端到端加密。
  • 实时监控: 分析数据可让你了解更新成功情况。

如何实现:

  • 设置自动更新
    集成 Capgo 的 CI/CD 流水线,自动处理证书更新。Capgo 套餐每月 12 美元起,包含 OTA 更新以及每月约 15 次原生构建。额外的构建分钟数通过积分按分钟计费。

  • 跟踪证书指标
    使用 Capgo 的分析仪表盘监控关键指标,例如当前为 82% 的全球更新成功率 [1].

这些措施有助于保护您的应用免受潜在的 MITM(中间人)攻击。

App Store 安全指南

Apple App Store 和 Google Play Store 对 SSL Pinning 都有严格的安全要求。以下是它们的要求概览:

Apple App Store:

  • 证书更新必须使用端到端加密。
  • 必须对证书进行正确验证。
  • 审核过程中需要提供安全文档。

Google Play Store:

  • 更新必须使用经批准的机制。
  • 证书管理必须透明。
  • 必须配备回退机制。

Capgo 的解决方案符合所有这些要求,同时支持即时更新 [1]。为了构建稳健的安全方案,建议将传统应用商店更新与通过 Capgo 进行的 Live Updates 结合使用。这种混合策略可确保应用安全合规,同时避免不必要的延迟。

总结

为了保护您的 Capacitor 应用免受 MITM 攻击,SSL Pinning 必不可少。将受信任的证书数据直接嵌入应用,可显著提升 API 通信的安全性。

为了顺利实施,请牢记以下关键要点:

  • 证书管理: 请务必定期更新并监控证书,以避免潜在的服务中断。
  • 开发工作流: 在测试环境中加入绕过机制,同时确保生产构建采用严格的安全协议。
  • 平台指南: 遵守 Apple App Store 和 Google Play Store 的安全要求以确保合规。

SSL pinning 在保护用户数据和维护应用完整性方面起着关键作用。结合前文讨论的更广泛的安全措施,它可以帮助构建更安全的应用环境。

常见问题

::: 常见问题

如果在 Capacitor 应用中不使用 SSL pinning,可能会带来哪些风险?

如果 Capacitor 应用未设置 SSL pinning,该应用将更容易受到 中间人 (MITM) 攻击。这些攻击允许恶意行为者拦截并篡改应用与服务器之间传输的数据。这可能导致用户凭据或 API 密钥.

此外,如果没有 SSL pinning,攻击者可以使用伪造或受损的证书冒充受信任的服务器,从而增加数据泄露的风险。通过实施 SSL pinning,您可以确保通信安全,并保护用户免受这些风险的影响。 :::

::: 常见问题

在 Capacitor 应用中,Android 和 iOS 在实现和维护 SSL pinning 上有哪些主要区别?

由于各自独特的 API 和安全机制,Android 和 iOS 的 SSL pinning 工作方式略有不同。

当 Android,开发者通常依赖 OkHttp 等网络库,或通过原生设置来配置 SSL pinning。不过,需要更新已固定的证书时,通常意味着要发布应用的新版本。

当 iOS,SSL pinning 通常通过 URLSession 或借助第三方库来处理。与 Android 一样,证书的任何更新都需要谨慎管理,以确保 API 通信不会中断。

两个平台都需要持续关注证书过期和更新,以保障 API 连接安全。定期测试对于及早发现兼容性问题以及防范 中间人 (MITM) 攻击至关重要。 :::

::: 常见问题

如何自动更新 SSL 证书,并确保我的 Capacitor 应用符合应用商店的安全要求?

虽然本文没有深入探讨用于自动更新 SSL 证书或确保符合应用商店安全指南的工具或策略,但你可以采取一些措施来提升应用的安全性。一个有效的措施是 SSL Pinning 在你的 Capacitor 应用中实施。这有助于保护你的应用免受 中间人(MITM)攻击,这可能导致敏感数据泄露。

在管理 Live Update 和简化应用维护方面,像 Capgo 这样的平台可以带来变革。它们让发布更新变得更加容易,同时符合应用商店的规定,为开发者和用户带来更流畅的体验。 :::

继续了解 Capacitor 应用的 SSL Pinning

如果你正在使用 Capacitor App 的 SSL Pinning 来规划安全与合规,请结合 加密 了解 Encryption 的实现细节, 合规性 了解合规部分的实现细节, Capgo 安全扫描器 了解 Capgo Security Scanner 的产品工作流, Capgo 安全 用于 Capgo 安全的产品工作流,以及 Capgo 信任中心 用于 Capgo 信任中心的产品工作流。

为 Capacitor 应用提供 Live Updates

当 Web 层出现线上 Bug 时,通过 Capgo 发布修复,而不用等 App Store 审核好几天。用户会在后台收到更新,原生变更则仍走正常审核流程。

博客最新动态

Capgo 为你提供打造真正专业的移动应用所需的最有价值的洞察。