Flutter 如何在flatter/dart中进行SSL公钥固定?
这里的颤振(以及一般编程)相对较新。只熟悉更基本的东西,但我现在遇到了在颤振/飞镖中使用这样的认证器的需要: (我在之前的android studio kotlin/java项目中成功地实现了这一点)我的目标是锁定公钥(不是证书) 我所拥有的是字符串形式的公钥,如下图所示,除此之外没有其他内容:Flutter 如何在flatter/dart中进行SSL公钥固定?,flutter,dart,pinning,public-key-pinning,Flutter,Dart,Pinning,Public Key Pinning,这里的颤振(以及一般编程)相对较新。只熟悉更基本的东西,但我现在遇到了在颤振/飞镖中使用这样的认证器的需要: (我在之前的android studio kotlin/java项目中成功地实现了这一点)我的目标是锁定公钥(不是证书) 我所拥有的是字符串形式的公钥,如下图所示,除此之外没有其他内容: “sha256/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
“sha256/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
我该如何实现这一目标?我在github上的公开问题中问过这个问题,但还没有得到任何回应()。希望有人能做到这一点
我还搜寻了其他来源。我认为最接近我的解决方案是
但我不太明白那里正在做什么,我不能在那里发表评论提问,因为我还没有足够的声誉
为了进行比较,我只想在flift/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
从中,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
注意事项
badCertificateCallback
不能传递整个证书链,因此您不能沿着整个链走。更糟糕的是,它似乎并不总是提供叶子证书!有时它会传递一个中间证书。从您所指答案中的代码开始。以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
从中,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
注意事项
badCertificateCallback
不能传递整个证书链,因此您不能沿着整个链走。更糟糕的是,它似乎并不总是提供叶子证书!有时它会提供一个中间证书。这有帮助吗?还有其他问题吗?很抱歉,我有机会回到这里。我认为它奏效了。我确实成功地以我期望的形式生成了一个字符串(“sha256/AAAAA…”)。但它似乎与我在kotlin版本的应用程序中锁定相同url时收到的密钥不同。这可能是你提到的警告之一。不管怎样,非常感谢你的帮助!哦,还有。似乎我必须更改这一行:var hash=base64.encode(sha256.convert(pubkeyement.contentBytes())
intovar hash=base64.encode(sha256.convert(pubkeyement.contentBytes()).bytes)代码>我希望这不会导致意外结果?(我不得不这样做,因为它给出了一个错误“参数类型'Digest'无法分配给参数类型'List'”,末尾没有.bytes)是的,请尝试打印certificate.subject
以查看您在回调中是否获得了正确的证书。是的,获得了正确的证书(至少从链中获得了一个证书),但他们的钥匙似乎还是不同的。这有帮助吗?还有其他问题吗?很抱歉,我有机会回到这里。我认为它奏效了。我确实成功地以我期望的形式生成了一个字符串(“sha256/AAAAA…”)。但它似乎与我在kotlin版本的应用程序中锁定相同url时收到的密钥不同。这可能是你提到的警告之一。不管怎样,非常感谢你的帮助!哦,还有。似乎我必须更改这一行:var hash=base64.encode(sha256.convert(pubkeyement.contentBytes())
intovar hash=base64.encode(sha256.convert(pubkeyement.contentBytes()).bytes)代码>我希望这不会导致意外结果?(我不得不这样做,因为它给出了一个错误“参数类型'Digest'无法分配给参数类型'List'”,末尾没有.bytes)是的,请尝试打印certificate.subject
以查看您在回调中是否获得了正确的证书。是的,获得了正确的证书(至少从链中获得了一个证书),但他们的关键似乎仍然不同。