如何在 flutter/dart 中进行 SSL 公钥固定?

2024-02-15

这里对 Flutter(以及一般编程)来说相对较新。只熟悉更基本的东西,但我现在遇到了在 flutter/dart 中使用 CertificatePinner 的需要:https://square.github.io/okhttp/3.x/okhttp/okhttp3/CertificatePinner.html https://square.github.io/okhttp/3.x/okhttp/okhttp3/CertificatePinner.html(我已经在 android studio 中之前的 kotlin/java 项目中成功实现了这一点)。我的目标是固定公钥(而不是证书)

我所拥有的只是字符串形式的公钥,如下所示,没有其他的: "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="

我该如何实现这一目标?我在 github 上的一个开放问题中提出了这个问题,但尚未得到任何回复(https://github.com/dart-lang/sdk/issues/35981 https://github.com/dart-lang/sdk/issues/35981)。希望有人能够实现这一目标。

我还搜索过其他来源。我认为最接近我的解决方案是如何在 Flutter 中进行公钥固定? https://stackoverflow.com/questions/54726406/how-can-i-do-public-key-pinning-in-flutter但我不太明白那里正在做什么,而且我无法在那里发表评论来提问,因为我还没有足够的声誉。

为了进行比较,我想做的就是通过以下几行代码在 flutter/dart 中实现与 java/kotlin 中相同的功能:

 String hostname = "publicobject.com";
 CertificatePinner certificatePinner = new CertificatePinner.Builder()
     .add(hostname, "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
     .build();

感谢您的帮助


从您引用的答案中的代码开始。这会获取 DER 格式的证书并开始对其进行解码。

ASN1Parser p = ASN1Parser(der);
ASN1Sequence signedCert = p.nextObject() as ASN1Sequence;
ASN1Sequence cert = signedCert.elements[0] as ASN1Sequence;
ASN1Sequence pubKeyElement = cert.elements[6] as ASN1Sequence;
// this is the Subject Public Key element, which describes the type of key and actual value

例如,如果我们解码pub.dev我们发现这是一个RSA密钥,模数为65537,值为2347……:

SEQUENCE (2 elem)
  SEQUENCE (2 elem)
    OBJECT IDENTIFIER 1.2.840.113549.1.1.1 rsaEncryption (PKCS #1)
    NULL
  BIT STRING (1 elem)
    SEQUENCE (2 elem)
      INTEGER (2048 bit) 234782553149463204049153749736864715384123240676730175743244004248041…
      INTEGER 65537

来自RFC https://www.rfc-editor.org/rfc/rfc7469#section-2.4,SPKI 指纹是整个元素的 SHA-256 哈希值。

// you need to import dart:convert and package:crypto/crypto.dart
var hash = base64.encode(sha256.convert(pubKeyElement.contentBytes()).bytes);
var spkiFingerprint = 'sha256/$hash'; // should match the value you have

Caveats

The badCertificateCallback不提供整个证书链,因此您无法遍历整个证书链。更糟糕的是,它似乎并不总是能交付叶子证书!有时它会提供中间证书。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 flutter/dart 中进行 SSL 公钥固定? 的相关文章

随机推荐