gpt4 book ai didi

flutter - 如何在 Flutter/Dart 中手动验证 x509 证书上的签名

转载 作者:行者123 更新时间:2023-12-05 04:53:19 26 4
gpt4 key购买 nike

我有两个 X509Certificate 对象 x1(root) 和 x2 .pem 格式。

我想验证 x2 是否由 x1 手动签名。

如何在 Flutter/Dart 中准确地做到这一点?

我找到了这个 article , 但所有操作都是在终端中使用 openssl 完成的,并且在某个阶段需要将 .pem 转换为 .der 以提取签名来自证书。

我也知道 C# 有这样的 method用于验证,我在 flutter/dart 中找不到任何模拟

最佳答案

我正在使用 x509b 执行此操作来自 pub.dev 的包。原来的 x509 包似乎不再更新,使用的是过时版本的 asn1lib。在我的版本中,我同时使用 x509 和 asn1lib 本身。很确定有更清洁/更高效的方法,但这对我有用。

我还直接使用从我的根证书中提取的公钥,而不是使用整个证书,但我相信您也可以使用这些库执行该步骤。

x509 库中的 tbsCertificate 属性似乎有误,所以我使用 ASN1Parser 手动提取 TBS 证书部分。

decodePEM 函数取自 asn1lib 中的示例 repo 。

import 'dart:convert';
import 'dart:typed_data';
import 'package:x509b/x509.dart' as x509;
import 'package:asn1lib/asn1lib.dart';

bool verifyCertificate() {
var strX1PublicKeyInfo = "-----BEGIN PUBLIC KEY-----\nSOME PUBLIC KEY\n-----END PUBLIC KEY-----";
var strX2Certificate = "-----BEGIN CERTIFICATE-----\nSOME CERTIFICATE\n-----END CERTIFICATE-----";

var x1PublicKey = (x509.parsePem(strX1PublicKeyInfo).single as x509.SubjectPublicKeyInfo).subjectPublicKey as x509.RsaPublicKey;
var x2Certificate = x509.parsePem(strX2Certificate).single as x509.X509Certificate;
var x2CertificateDER = decodePEM(strX2Certificate);

var asn1Parser = ASN1Parser(x2CertificateDER);
var seq = asn1Parser.nextObject() as ASN1Sequence;
var tbsSequence = seq.elements[0] as ASN1Sequence;

var signature = x509.Signature(Uint8List.fromList(x2Certificate.signatureValue!));
var verifier = x1PublicKey.createVerifier(x509.algorithms.signing.rsa.sha256);

return verifier.verify(tbsSequence.encodedBytes, signature)
}

Uint8List decodePEM(pem) {
var startsWith = [
'-----BEGIN PUBLIC KEY-----',
'-----BEGIN PRIVATE KEY-----',
'-----BEGIN CERTIFICATE-----',
];
var endsWith = [
'-----END PUBLIC KEY-----',
'-----END PRIVATE KEY-----',
'-----END CERTIFICATE-----'
];

//HACK
for (var s in startsWith) {
if (pem.startsWith(s)) pem = pem.substring(s.length);
}

for (var s in endsWith) {
if (pem.endsWith(s)) pem = pem.substring(0, pem.length - s.length);
}

//Dart base64 decoder does not support line breaks
pem = pem.replaceAll('\n', '');
pem = pem.replaceAll('\r', '');
return Uint8List.fromList(base64.decode(pem));
}

关于flutter - 如何在 Flutter/Dart 中手动验证 x509 证书上的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66132838/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com