Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何在flatter/dart中进行SSL公钥固定?_Flutter_Dart_Pinning_Public Key Pinning - Fatal编程技术网

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

Flutter 如何在flatter/dart中进行SSL公钥固定?,flutter,dart,pinning,public-key-pinning,Flutter,Dart,Pinning,Public Key Pinning,这里的颤振(以及一般编程)相对较新。只熟悉更基本的东西,但我现在遇到了在颤振/飞镖中使用这样的认证器的需要: (我在之前的android studio kotlin/java项目中成功地实现了这一点)我的目标是锁定公钥(不是证书) 我所拥有的是字符串形式的公钥,如下图所示,除此之外没有其他内容: “sha256/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

这里的颤振(以及一般编程)相对较新。只熟悉更基本的东西,但我现在遇到了在颤振/飞镖中使用这样的认证器的需要: (我在之前的android studio kotlin/java项目中成功地实现了这一点)我的目标是锁定公钥(不是证书)

我所拥有的是字符串形式的公钥,如下图所示,除此之外没有其他内容
“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())
into
var 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())
into
var hash=base64.encode(sha256.convert(pubkeyement.contentBytes()).bytes)我希望这不会导致意外结果?(我不得不这样做,因为它给出了一个错误“参数类型'Digest'无法分配给参数类型'List'”,末尾没有.bytes)是的,请尝试打印
certificate.subject
以查看您在回调中是否获得了正确的证书。是的,获得了正确的证书(至少从链中获得了一个证书),但他们的关键似乎仍然不同。