赞
踩
安全是移动应用开发中不断变化的环境中的首要任务。由于Android是最流行的移动操作系统,它成为了网络攻击的主要目标。为了加强我们的防御系统,我们必须研究复杂的安全方法,其中一种值得关注的技术是“证书锁定”(Certificate Pinning)。
在本文中探讨Android上证书锁定的细节。将介绍证书锁定的概念以及它在应用安全中的重要性。我们还将探讨“中间人攻击”(MITM)的可怕前景以及证书锁定如何帮助我们防御此类攻击。
证书锁定作为一种安全技术,当然也存在一些缺点和实施上的问题。不过不用担心,我们将引导您完成获取证书的过程,并更重要的是向您展示如何在Android应用中成功使用证书锁定。让我们开始这个知识探索之旅,装备自己所需的信息和能力,为我们的Android应用提供更安全的数字未来。
中间人攻击(MITM)是一种狡猾且危险的网络威胁,可能严重破坏用户的在线安全和隐私。在这种攻击中,未经授权的第三方截取并窃听两个相信彼此直接连接的各方之间的通信,通常是用户和受信任的服务器或网站。攻击者潜入通信流的中心位置,因此得名“中间人”。
1. 拦截:攻击者将自己置于您和目标服务器之间。您的数据在您不知情的情况下经过他们。
2. 监视:攻击者可以监视数据的传递,甚至在您不知情的情况下修改数据。他们可以看到您的登录详细信息、财务数据或其他敏感信息的明文内容。
3. 中继:一些中间人攻击者还可以将拦截的数据中继到其预定的目的地,使通信看起来正常进行。您甚至可能意识不到自己已经受到了攻击。
中间人攻击对用户造成重大危害,包括:
• 数据窃取:攻击者可以窃取敏感信息,如用户名、密码、信用卡号码或个人消息,导致身份盗窃、财务损失或隐私泄露。
• 身份欺骗:通过冒充您或受信任的服务器,攻击者可以诱使您透露更多敏感信息或在您不知情的情况下代表您执行操作。
• 财务损失:中间人攻击可以导致未经授权的财务交易,从而清空您的银行账户或超出您的信用卡额度。
• 隐私侵犯:个人消息、照片和其他私人数据可能会被曝光,导致尴尬、骚扰或勒索。
• 安全受损:如果您在进行在线银行业务、医疗保健或购物等安全任务时使用应用程序或网站,中间人攻击可能会compromise your security and trust in these services.
综上所述,中间人攻击是用户的噩梦,因为它可能导致严重后果,如财务损失、身份盗窃和个人隐私泄露。认识到中间人攻击的威胁凸显了采取强大安全措施的重要性,例如证书锁定,以保护用户数据和在线互动。
证书锁定是一种安全实践,限制应用程序从服务器接受的可信数字证书的数量,以建立安全连接。与仅依赖公钥基础设施(PKI)范 paradigm 不同,PKI中有大量证书颁发机构(CA)发行证书,证书锁定要求应用程序仅信任与受信任机构相关联的某些证书或公钥。
1. 初始信任建立:当您首次连接到服务器或网站时,您的应用程序会检查服务器的数字证书,该证书由受信任的CA颁发。如果证书有效并由受信任的CA签名,连接将顺利进行,这是基于传统PKI的信任建立过程。
2. 固定配置:证书锁定将进一步进行。应用程序除了依赖CA的证书外,还会检查预定义的一组证书或公钥,以确保在连接过程中服务器呈现的证书与其固定的证书或公钥匹配。
3. 比对:在连接过程中,应用程序将服务器的证书与其固定的证书或公钥进行比对。如果匹配,连接继续进行。如果存在差异,应用程序会发出警告并终止连接。
虽然证书锁定是一种有效的安全技术,但需要注意的是,与其他安全方法一样,它也存在一些缺点和障碍。这些缺点通常涉及增加安全性与操作复杂性之间的权衡:
1. 维护开销:证书锁定需要定期维护。随着证书过期或需要更新,开发人员必须在应用程序中修改固定的证书/公钥列表。这可能是一个繁琐且耗时的过程,特别是对于大型应用程序而言。
2. 停机风险:如果管理不当,在固定证书的更新过程中,如果新证书未能及时传播,可能会导致服务中断。在安全更新和不中断服务之间需要平衡。
3. 用户体验:证书锁定可能是无情的。如果服务器的证书由于合法原因(例如证书续订或基础设施升级)而发生更改,则用户可能会遇到错误和连接问题,直到应用程序更新为识别新证书为止。
4. 调试复杂性:对与证书锁定相关的问题进行故障排除和诊断可能具有挑战性。与固定相关的错误可能无法提供明确的错误消息,从而很难查明确切的问题。
5. 有限的安全范围:虽然证书锁定提供了针对 MITM 攻击的强大保护,但它并不是解决所有安全威胁的灵丹妙药。它不解决服务器端攻击、应用程序级缺陷或其他可能危及安全的攻击媒介等漏洞。
6. 可扩展性降低:随着应用程序与之通信的服务器或服务数量的增加,管理固定证书列表变得更具挑战性。扩展固定过程可能很复杂,并且可能需要额外的资源。
7. 与某些网络更改不兼容:某些网络配置(例如负载平衡、内容交付网络 (CDN) 或故障转移机制)可能会因严格的证书锁定而中断。确保与这些配置的兼容性可能很棘手。
8. 拒绝更新:一些用户可能会延迟或拒绝将应用程序更新到最新版本,特别是当他们因证书更改而遇到中断时。这可能会导致用户群分散,运行较旧的、可能安全性较低的应用程序版本。
为了防止这些风险,开发人员必须仔细设计和执行证书锁定,管理有效的证书更新流程,并向用户正确解释更改。此外,为了在保持强大的安全态势的同时保留良好的用户体验,在固定的安全优势和可能的负面影响之间找到平衡至关重要。
第 1 步:连接到服务器并检索证书 打开终端并执行以下命令连接到目标服务器(将 example.com 替换为实际服务器主机名或 IP 地址):
openssl s_client -connect example.com:443 -showcerts < /dev/null | openssl x509 -outform der > server_cert.der
此命令建立与服务器的 SSL/TLS 连接,检索其证书,并将其以 DER 格式保存为 server_cert.der。
第2步:提取公钥
接下来,使用以下命令从 DER 编码的证书中提取公钥并将其以 PEM 格式保存为 server_cert_public_key.pem:
openssl x509 -inform der -in server_cert.der -pubkey -noout > server_cert_public_key.pem
此命令将 DER 证书转换为 PEM 格式并提取公钥。
步骤 3:计算 SHA-256 指纹
现在,使用以下命令计算公钥的 SHA-256 指纹:
cat server_cert_public_key.pem | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
该命令执行以下操作:
• 将 PEM 公钥转换为 DER 格式。
• 计算 DER 编码公钥的 SHA-256 哈希值。
• 以 base64 格式对哈希进行编码,这是 Android 期望证书锁定的格式。
结果是 SHA-256 公钥指纹,可以在 Android 应用程序中使用它来进行证书锁定。
重要提示:请确保将 example.com 替换为您要与其建立安全连接的实际服务器。此外,将此 SHA-256 指纹集成到 Android 应用程序的代码中,以启用证书锁定并增强应用程序的安全性。
第 4 步:将密钥添加到 Android 项目中
获得密钥后,只需将其放入“strings.xml”资源文件中即可。理想情况下作为字符串数组,因为您可以在给定时间信任多个证书。
- <string-array name="cert_pins" translatable="false">
- <item>sha256/flkjfg8WrJFSisd87609if</item>
- </string-array>
使用 OkHttpClient 和 Retrofit 时,在 Android 上添加证书 pin 非常简单:
- val certificatePinner = CertificatePinner.Builder()
- .add(serverHostName, context.resources.getStringArray(R.array.cert_pins))
- .build()
-
- val okHttpClient = OkHttpClient.Builder()
- .certificatePinner(certificatePinner)
- .build()
- val retrofit = Retrofit.Builder()
- .baseUrl("https://$serverHostName/")
- .client(okHttpClient)
- .addConverterFactory(GsonConverterFactory.create())
- .build()
了解了证书锁定以及它如何作为对中间人 (MITM) 攻击的强有力防御。认识到它在提高 Android 应用程序安全性方面的重要性,以及它的潜在危险和复杂性。
虽然证书锁定需要维护,但它在保护敏感数据和维持用户信心方面的重要性怎么强调也不为过。通过将受信任证书的范围限制在少数,我们可以在对抗试图渗透应用程序的攻击者时获得优势。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。