Php 如何从base64字符串中提取DER编码的证书

Php 如何从base64字符串中提取DER编码的证书,php,encoding,certificate,Php,Encoding,Certificate,正在寻找有关如何解码以下base64 MerkleTreeLeaf字符串的帮助 merkletreelaf结构是一种复合数据结构,包含时间戳和数字证书 该结构被编码为Base64编码的字节字符串。在这个字节字符串中,有一个以DER格式编码的实际证书 我正在寻找一个php解决方案来提取DER编码的证书 下面是base64编码字符串的示例 aaaaaa fndpxfCqaaaauamiiffJCCblyGawibagIQM+cDs5qlvsI+P1FKEBKN3TakbgQhkJopQdAjCbiz

正在寻找有关如何解码以下base64 MerkleTreeLeaf字符串的帮助

merkletreelaf结构是一种复合数据结构,包含时间戳和数字证书

该结构被编码为Base64编码的字节字符串。在这个字节字符串中,有一个以DER格式编码的实际证书

我正在寻找一个php解决方案来提取DER编码的证书

下面是base64编码字符串的示例

aaaaaa fndpxfCqaaaauamiiffJCCblyGawibagIQM+cDs5qlvsI+P1FKEBKN3TakbgQhkJopQdAjCbizelmaka1EBHMCVMxTabGnBagFn5WfUdGvJienVbCbCbCbCf0AW9UMR8HyDvQlexTbWnR3JrJrmTwYDqdQdQdEzNgWnEzNtEzHbGw1HbHbGnEzHbHbHbHbHbGyNbGyNbGyNbGyNbGyNbGyNbGyNbGyGyGyGyGyGyGyGyGyGyGyGyGyGyGyGyGyGyGyGyGyGyGyGXGTAXBGSRBGEEAYI3PaibagWIRGVSYXDHCMUXGZAZBGSRBGEEAYI3PaibagQWKV2LWlUZ3RbjElmakGa1EbHMCVVmXeZarbgBgBgBgBgLmBgBgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWg2)B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B NVHR8EjdaimcGhqachHpodhrWOI8VC24UC3Uc2iuy2Tl3Nvc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc0Jbg2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2Uc2U2.这是一个非常令人感兴趣的东西,比如说一篇文章的文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇文章,一篇,一篇文章,一篇,一篇,一篇文章,一篇,一篇,一篇,一篇,一篇,一篇,一WYGRMXYS52lxc/VxzzvdlSRto9y/jLhzAAA

如果我使用在线,它会显示一些细节,但显然它不可读。如果我可以提取DER编码的证书,那么我就可以使用openssl来解析它。

您可以使用与注释中Python脚本相同的方法来处理它,只需将其与进行比较。如果您只想要未解析的证书,您可以不受惩罚

<?php

function mtl_to_x509($base64str) {
    $raw = base64_decode($base64str);
    // Parse the decoded string
    $cert_length = unpack('N', chr(0).substr($raw, 12, 3))[1];
    $cert_as_asn1 = substr($raw, 15, $cert_length);
    return $cert_as_asn1;
}

$example = "AAAAAAFNDPxFcQAAAAUaMIIFFjCCBLygAwIBAgIQM+cDs5qlvsI+p1fkebkn3TAKBggqhkjOPQQDAjCBizELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8wHQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMTwwOgYDVQQDEzNTeW1hbnRlYyBDbGFzcyAzIEVDQyAyNTYgYml0IEV4dGVuZGVkIFZhbGlkYXRpb24gQ0EwHhcNMTQxMjA4MDAwMDAwWhcNMTUxMjA4MjM1OTU5WjCCARExEzARBgsrBgEEAYI3PAIBAxMCVVMxGTAXBgsrBgEEAYI3PAIBAgwIRGVsYXdhcmUxGzAZBgsrBgEEAYI3PAIBAQwKV2lsbWluZ3RvbjELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxHTAbBgNVBA8TFFByaXZhdGUgT3JnYW5pemF0aW9uMRAwDgYDVQQFEwcyMTU4MTEzMRYwFAYDVQQKDA1TeW1hbnRlYyBDb3JwMR0wGwYDVQQLDBRmb3IgY3QgdGVzdGluZy0tIGVjYzEgMB4GA1UEAwwXZXZwcm8xLmV2MS5zeW1hbnRlYy5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASdGXgRQD4CxlJr1QU7hZ86gbPxjlCHWDBZBSb5+vbo9bw2sZxaxwF15mHiSlEiaGVuwv2DxOPO+w/QVgMTggZ5o4ICdzCCAnMwIgYDVR0RBBswGYIXZXZwcm8xLmV2MS5zeW1hbnRlYy5jb20wCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCB4AwZgYDVR0gBF8wXTBbBgtghkgBhvhFAQcXBjBMMCMGCCsGAQUFBwIBFhdodHRwczovL2Quc3ltY2IuY29tL2NwczAlBggrBgEFBQcCAjAZDBdodHRwczovL2Quc3ltY2IuY29tL3JwYTArBgNVHR8EJDAiMCCgHqAchhpodHRwOi8vc24uc3ltY2IuY29tL3NuLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHwYDVR0jBBgwFoAUSBNlF5TsnhYqKnRc6FMttPuD644wVwYIKwYBBQUHAQEESzBJMB8GCCsGAQUFBzABhhNodHRwOi8vc24uc3ltY2QuY29tMCYGCCsGAQUFBzAChhpodHRwOi8vc24uc3ltY2IuY29tL3NuLmNydDCCAQIGCisGAQQB1nkCBAIEgfMEgfAA7gB1AKS5CZC0GFgUh7sTosxncAo8NZgE+RvfuON3zQ7IDdwQAAABSitKXtQAAAQDAEYwRAIgIQ2Dr+ktUJh1OFYAJxUqHwMjLmsMdvGToFaxSqEcAg8CIDjgHlQ8mV/NXsUC115hF5S7MZirjD7mdH52s6yv5JQiAHUAOTdvVF97Rgf1l0LXaM1dJDe/NHO2U0pINLz3Lmgcg8kAAAFKK0phCQAABAMARjBEAiA1GlOmlOeAP+uOmq+uPMVeN0TDsRZBxUE7oWUtZlKBOAIgFOoXuDXnAFALmW7CN66yrnHO7UyuMYy5t4oJqvgmzzowCgYIKoZIzj0EAwIDSAAwRQIgNqNb4f3YfKCvnkYjihpB9jGq0iUnfPclyD7mWxDJYt8CIQCJbJ48ZxGx2WYGRMXys52lxc/VxzzvdlSRto9y/jLhzAAA";

print mtl_to_x509($example);

?>
如果您最终也需要数据结构的其余部分,那么相关的解包将如下所示:

$version = unpack('C', substr($raw, 0, 1))[1];
$ctype = unpack('C', substr($raw, 1, 1))[1];
$timestamp = unpack('J', substr($raw, 2, 8))[1];
$entry_type = unpack('n', substr($raw, 10, 2))[1];

如果有帮助的话,我相信这里有一个python解决方案,它可能会提供一些线索,但不确定如何在phpthis作品中实现同样的效果!但是,对于$version、ctype等,我收到消息“警告:unpack():64位格式代码不适用于32位版本的PHP”,这可能是
$timestamp
导致问题的原因,因为解析未签名的long-long在32位上不起作用。要查看值应该是什么,可以使用
print\r(unpack('C*',substr($raw,2,8))
数组([1]=>0[2]=>0[3]=>1[4]=>77[5]=>12[6]=>52[7]=>69[8]=>113)
。也就是说,时间戳应该是
113*256^0+69*256^1+252*256^2+12*256^3+77*256^4+1\*256^5=1430441969009。
给出
数组([1]=>333[2]=>217859441)
。和
217859441+333*256^4=1430441969009。
在您的解决方案中,您是如何计算出
$cert\u length
中的数字12、3和
$cert\u as\u asn1
中的数字15的?我问这个问题的原因是因为我有另一个base64字符串,我正在尝试解析,但它不太有效。你可以在这里找到base64字符串:@user3436467:我刚从原始帖子的评论中提供的示例中获得它们,但是你也可以在CT RFC中找到它们;
$version = unpack('C', substr($raw, 0, 1))[1];
$ctype = unpack('C', substr($raw, 1, 1))[1];
$timestamp = unpack('J', substr($raw, 2, 8))[1];
$entry_type = unpack('n', substr($raw, 10, 2))[1];