问题标签 [public-key-pinning]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
259 浏览

ios - 公共固定是 iOS 不与 Almofire 一起使用

嗨,我想使用公钥实现 SSL 固定,我正在使用 Alamofire 4.8.2 下面是该代码

如果我做错了什么,请帮助我。

0 投票
0 回答
132 浏览

python - 如何在 python 中向服务器发出 http 请求时验证 google 管理的 ssl 证书的公钥哈希密钥?

我正在为我的应用程序使用谷歌应用引擎,它启用了谷歌管理的 SSL 证书。谷歌也会在到期前自动更新它。

我注意到谷歌使用相同的私钥来创建或更新新证书的一件事,因此公钥的哈希值不会改变。

现在我想做的是在使用 urllib3 或任何其他库在 python 中向服务器发出请求时验证这个公钥哈希。因此,如果它与传入的公钥哈希的哈希不匹配,它将使请求失败并提醒我有关我的信息。

我浏览了很多关于固定的链接,但都找不到任何可以进行此类比较的链接。有人可以在这里帮助我吗?具体如何用python3做到这一点?

PS:我没有证书或其私钥,因为它是由谷歌管理的(也没有找到从谷歌应用引擎下载当前证书的任何选项)。我已经有了公钥的哈希值Pin SHA256: xxxxxxxxxxxx

0 投票
1 回答
440 浏览

react-native - OkHttp certificatePinner 似乎不起作用

我需要一些帮助,

我试图在我的 react-native 应用程序(v0.63)上实现 SSLPinning。

我已经关注 OkHttp github 页面上的文档了

这是我为我的应用程序制作的代码:

OkHttpCertPin:

这是我在 MainActivity 上的 onCreate 方法:

它允许所有请求通过,即使我使用随机公钥和主机名。

我做错了什么?

我从 sslLabs 获得的所有公钥

0 投票
1 回答
80 浏览

android - 是否有必要在 android 中安全地存储 SPKI 哈希?

我正在尝试启用公钥固定,因为我不想为每次证书续订发布更新,只要我每次都使用相同的 CSR。

我用这个脚本生成了哈希。

希望不会变!

我正在使用 okhttp3 certificatePinner 将其嵌入到改造中。

我的问题是我们是否应该使用 NDK 或其他方式将其安全地存储在应用程序中?因为每个人只要知道 API 基本 URL 就可以生成这个密钥。

不确定这是否是一个愚蠢的问题。

谢谢

0 投票
0 回答
183 浏览

ios - 如何在 Swift 中使用 Moya 实现 SSL 固定 - 公钥固定(不是证书固定)?

我浏览了互联网上的可能博客,但在实施时发现了问题。像https://betterprogramming.pub/ssl-pinning-with-moya-in-swift-d5a5edae22c2之类的博客(使用证书固定)

有没有人用 Moya 做过公钥固定,可以分享我如何实现这一点的方法。

感谢期待!

0 投票
1 回答
77 浏览

security - HTTP 的公钥固定扩展

我们的渗透测试团队建议在 IIS 级别为 HTTP 配置公钥固定扩展。

维基百科说这是一种已弃用的安全机制。并且大多数博客和文章不推荐钉住,因为它涉及巨大的风险。

在网站上有 PKP 有什么好处吗?

请指教。

0 投票
3 回答
567 浏览

ios - iOS TLS/SSL Pinning 在 Info.plist 中使用 NSRequiresCertificateTransparency 键

我想使用 SSL Pinning 保护我的应用免受中间人 (mitm) 攻击。
默认情况下,可以使用像 Charles 或 mitmproxy 这样的代理来拦截流量,并使用自签名证书对其进行解密。

经过广泛的研究,我发现了几种选择:

  1. 添加NSPinnedDomains > MY_DOMAIN > NSPinnedLeafIdentitiesInfo.plist
    Apple 文档:Identity Pinning
    Guardsquare:利用基于 Info.plist 的证书固定
    优点:简单
    缺点:一旦更新证书/私钥(通常在几个月后),应用程序将无法使用

  2. 添加NSPinnedDomains > MY_DOMAIN > NSPinnedCAIdentitiesInfo.plist
    Apple 文档:与上述相同
    优点:简单。叶证书更新没有失败,因为根 CA 被固定(过期日期为几十年)
    缺点:似乎多余,因为大多数根 CA已经包含在操作系统中

  3. 检查代码中的证书URLSessionDelegate> SecTrustEvaluateWithError(或 Alamofire 包装器)
    Ray Wenderlich:使用 SSL Pinning 防止 iOS 中的中间人攻击
    Apple 文档:处理身份验证挑战
    Medium 文章:关于 SSL Pinning 需要了解的一切
    Medium 文章:保护 iOS具有 SSL Pinning
    优点的应用程序:更大的灵活性。可能更安全。Apple 推荐(参见上面的 Apple 链接)。
    缺点:(1)或(2)的一个更费力的版本。关于叶子到期/根 CA 冗余的缺点与 (1) 和 (2) 相同。更复杂。

  4. 添加 NSExceptionDomains > MY_DOMAIN > NSRequiresCertificateTransparency 到 Info.plist
    Apple 文档:部分 Info.plist 键“证书透明度”
    优点:非常简单。没有多余的 CA 集成。
    缺点:文档不清楚这是否应该用于 ssl pinning

经过评估,我得出以下结论:

  1. 由于证书过期,不适合生产应用程序
  2. 可能是简单性、安全性和可持续性之间的最佳平衡——但我不喜欢重复添加系统已经知道的根 CA
  3. 太复杂,太冒险,任何实现错误都可能锁死应用
  4. 我的首选方式。简单的。在我的测试中有效,但文档不明确。

我很想使用选项(4),但我不确定这是否真的适用于 ssl pinning。

在文档中它说:

证书透明度 (CT) 是 ATS 可用于识别错误或恶意颁发的 X.509 证书的协议。将 NSRequiresCertificateTransparency 键的值设置为 YES 以要求对于给定域,服务器证书由来自 Apple 信任的至少两个 CT 日志的有效签名 CT 时间戳支持。有关证书透明度的更多信息,请参阅 RFC6962。

并在链接的 RFC6962 中:

本文档描述了一个实验性协议,用于公开记录传输层安全 (TLS) 证书的存在 [...]

术语“实验性协议”和“公开日志记录”对我来说是一个标志,虽然在 Info.plist 中启用该功能似乎可以解决 SSL 固定问题,但我不确定是否应该使用它。
我绝不是安全专家,我需要一个非常简单的解决方案,它可以为我提供体面的保护,同时保护我免于因可能过期/更改的证书而窒息我自己的应用程序。

我的问题:

我应该NSRequiresCertificateTransparency在我的应用程序上使用 ssl pinning 和防止 mitm-attacks 吗?

如果不:

我应该改用什么?


PS:

在这个线程中基本上已经提出了同样的问题:
https ://developer.apple.com/forums/thread/675791

然而,答案是模糊的NSRequiresCertificateTransparency(4。在我上面的列表中):

对,证书透明度是一个很好的工具,用于验证提供的叶子是否包含一组 SCT(签名证书时间戳),或者嵌入在证书(RFC 6962)中,通过 TLS 扩展(可以在数据包跟踪中看到),或者通过检查证书的 OCSP 日志。当您在应用程序中做出信任决定时,我建议您通过 SecPolicyRef 对象查看 is 属性。

附加说明:

作为一家具有安全意识的公司,我对 Apple 的期望是,默认情况下会启用对根 CA 的固定,并且我必须手动添加异常,例如允许在调试版本时使用 Charles 代理。我听说Android就是这样做的。

0 投票
1 回答
58 浏览

ssl - HTTPS - 浏览器验证服务器 SSL 证书

我对 Web 浏览器(如 Firefox/Chrome)验证服务器 SSL 证书的过程有一个疑问。

我阅读了很多关于最大限度地降低攻击者/黑客应用错误颁发的 CA/中间 CA 证书(即被黑客攻击的 CA 或错误地将证书颁发给实际上不应该接收它们的实体)的风险的机制,例如 HPKP HTTP 标头或证书透明度日志。

根据我阅读的解释,潜在的攻击者可能会出示这个错误颁发的证书来冒充终端服务器并劫持来自预期被加密的请求发送者的内容。

但怎么可能呢?浏览器验证证书的机制是什么?

当我使用编程库通过 HTTPS 执行对 API 的请求时,默认情况下会打开一个选项,以将证书中的“主题”字段与我传递来查询服务的 URL 进行比较。如果比较失败,则通信中断。可以绕过此设置(在 Apache HTTP 中称为 NoopH​​ostnameVerifier)。如果我理解得很好,这个功能会导致,如果我拥有域(例如“blablabla.com”)并为域“xyxyxy.xom”提供错误颁发的证书,并带有 CA 的有效签名,Http Client 将由于不匹配而阻止连接具有请求 URL 的证书中的主题。

它在浏览器中是如何工作的?浏览器是否对 x509 证书中的主题和地址栏中的 URL 进行比较?如果不是,为什么浏览器不做这个比较?如果是,浏览器会阻止此请求吗?或者只是发出一些警告?

换句话说:正确验证 CA 的签名是确认证书和整个服务器对证书的响应有效的唯一条件吗?在这种情况下浏览器会忽略 X509 中的“主题”字段和 URL 地址栏之间的不匹配吗?