2016-06-07 2 views
0

У меня есть строчная строка merkle, закодированная base64, как описано здесь https://www.ietf.org/rfc/rfc6962.txt - Я пытаюсь распаковать/получить сертификат из leaf_input, но не совсем получить нужные мне данные. Использование стандартного декодера base64 http://string-functions.com/base64decode.aspx Я вижу, что внутри строки хранится двоичный кодированный сертификат ssl.Проблема с распаковкой base64 string

$raw = "AAAAAAFP7hcgYQABgMxWOrX4PMQesK9qFNbYBxjBfjUvlkn/vN1n+L9lE5EABIswggSHoAMCAQICEGR1GjEsJZ5ucwLx2+0Xk8IwDQYJKoZIhvcNAQELBQAwdzELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8wHQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMSgwJgYDVQQDEx9TeW1hbnRlYyBDbGFzcyAzIEVWIFNTTCBDQSAtIEczMB4XDTE1MDkyMTAwMDAwMFoXDTE2MTAyMjIzNTk1OVowggEnMRMwEQYLKwYBBAGCNzwCAQMTAk5aMR0wGwYDVQQPExRQcml2YXRlIE9yZ2FuaXphdGlvbjEOMAwGA1UEBRMFMzU5NzYxCzAJBgNVBAYTAk5aMQ0wCwYDVQQRDAQxMDEwMRQwEgYDVQQIDAtOZXcgWmVhbGFuZDERMA8GA1UEBwwIQXVja2xhbmQxNjA0BgNVBAkMLUdyb3VuZCBGbG9vciwgQW56IENlbnRyZSwgMjMtMjkgQWxiZXJ0IFN0cmVldDElMCMGA1UECgwcQU5aIEJhbmsgTmV3IFplYWxhbmQgTGltaXRlZDEZMBcGA1UECwwQV2ViIFRlY2hub2xvZ2llczEiMCAGA1UEAwwZY2RuLlByZS1wcm9kLXNkcGFuei5jby5uejCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKpBFlnMiTfysDDFYFLuyGyqeOWHVKkMuVt0RlXG0OdHKUnISLJmtnFMWs+1ZtL4mhvvVafACHYwb8EFJrOhCCDTmKtNfOMEDke+hlfZS6YVr4qma+rl78DOATaA6dP1sDO3oRjhoO6LCT7ddvPfgNIIUBRzRzZwdBxPRkLS2FMbuCBgboShESEVJp0Q5SgpKBQcG4o5e0Mixe+L9fcLHx+5s23J46oj8GMT1S3SJAEZrJgiNoyJZkuj12hROkNKFqof4wgknG+8EG96qux7BgIg4UN4v54yO7jXunt3TI+VBFFQohkxStntqG/aHoeEI1U7iysE8Nm6X1UK2aZwShMCAwEAAaOCAXMwggFvMCQGA1UdEQQdMBuCGWNkbi5wcmUtcHJvZC1zZHBhbnouY28ubnowCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMGYGA1UdIARfMF0wWwYLYIZIAYb4RQEHFwYwTDAjBggrBgEFBQcCARYXaHR0cHM6Ly9kLnN5bWNiLmNvbS9jcHMwJQYIKwYBBQUHAgIwGRoXaHR0cHM6Ly9kLnN5bWNiLmNvbS9ycGEwHwYDVR0jBBgwFoAUAVmr5906C1mmZGPWzyAHV9WR52owKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3NyLnN5bWNiLmNvbS9zci5jcmwwVwYIKwYBBQUHAQEESzBJMB8GCCsGAQUFBzABhhNodHRwOi8vc3Iuc3ltY2QuY29tMCYGCCsGAQUFBzAChhpodHRwOi8vc3Iuc3ltY2IuY29tL3NyLmNydAAA"; 

Я попытался с помощью действия, описанные в этой теме how to extract DER encoded certificate from base64 string распаковывать и в то время как я могу увидеть некоторые из двоичного выхода оказывается неполным.

Когда я пишу бинарный вывод в файл и сохранить с расширением .der и запустить его, я получаю сообщение об ошибке говорящее

«Этот файл является недопустимым для использования в качестве следующего: Сертификат безопасности».

Однако строка с кодировкой base64 в примере на другом потоке работает, тогда как с моим только частично.

Вот сценарий, который я использую для распаковки.

<?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, 0, $cert_length); 
    print_r($cert_as_asn1); 

    $file = 'C:/test.der'; 
    file_put_contents($file, $cert_as_asn1); 
} 

$raw = "AAAAAAFP7hcgYQABgMxWOrX4PMQesK9qFNbYBxjBfjUvlkn/vN1n+L9lE5EABIswggSHoAMCAQICEGR1GjEsJZ5ucwLx2+0Xk8IwDQYJKoZIhvcNAQELBQAwdzELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8wHQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMSgwJgYDVQQDEx9TeW1hbnRlYyBDbGFzcyAzIEVWIFNTTCBDQSAtIEczMB4XDTE1MDkyMTAwMDAwMFoXDTE2MTAyMjIzNTk1OVowggEnMRMwEQYLKwYBBAGCNzwCAQMTAk5aMR0wGwYDVQQPExRQcml2YXRlIE9yZ2FuaXphdGlvbjEOMAwGA1UEBRMFMzU5NzYxCzAJBgNVBAYTAk5aMQ0wCwYDVQQRDAQxMDEwMRQwEgYDVQQIDAtOZXcgWmVhbGFuZDERMA8GA1UEBwwIQXVja2xhbmQxNjA0BgNVBAkMLUdyb3VuZCBGbG9vciwgQW56IENlbnRyZSwgMjMtMjkgQWxiZXJ0IFN0cmVldDElMCMGA1UECgwcQU5aIEJhbmsgTmV3IFplYWxhbmQgTGltaXRlZDEZMBcGA1UECwwQV2ViIFRlY2hub2xvZ2llczEiMCAGA1UEAwwZY2RuLlByZS1wcm9kLXNkcGFuei5jby5uejCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKpBFlnMiTfysDDFYFLuyGyqeOWHVKkMuVt0RlXG0OdHKUnISLJmtnFMWs+1ZtL4mhvvVafACHYwb8EFJrOhCCDTmKtNfOMEDke+hlfZS6YVr4qma+rl78DOATaA6dP1sDO3oRjhoO6LCT7ddvPfgNIIUBRzRzZwdBxPRkLS2FMbuCBgboShESEVJp0Q5SgpKBQcG4o5e0Mixe+L9fcLHx+5s23J46oj8GMT1S3SJAEZrJgiNoyJZkuj12hROkNKFqof4wgknG+8EG96qux7BgIg4UN4v54yO7jXunt3TI+VBFFQohkxStntqG/aHoeEI1U7iysE8Nm6X1UK2aZwShMCAwEAAaOCAXMwggFvMCQGA1UdEQQdMBuCGWNkbi5wcmUtcHJvZC1zZHBhbnouY28ubnowCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMGYGA1UdIARfMF0wWwYLYIZIAYb4RQEHFwYwTDAjBggrBgEFBQcCARYXaHR0cHM6Ly9kLnN5bWNiLmNvbS9jcHMwJQYIKwYBBQUHAgIwGRoXaHR0cHM6Ly9kLnN5bWNiLmNvbS9ycGEwHwYDVR0jBBgwFoAUAVmr5906C1mmZGPWzyAHV9WR52owKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3NyLnN5bWNiLmNvbS9zci5jcmwwVwYIKwYBBQUHAQEESzBJMB8GCCsGAQUFBzABhhNodHRwOi8vc3Iuc3ltY2QuY29tMCYGCCsGAQUFBzAChhpodHRwOi8vc3Iuc3ltY2IuY29tL3NyLmNydAAA"; 

print mtl_to_x509($raw); 

?> 

В ответ я вижу двоичный закодированные данные, но я не верю его полной, потому что, когда я запускаю файл я получаю вышеуказанную ошибку.

Я не уверен, что эти две строки правильные, но не уверены, как я могу это определить.

$cert_length = unpack('N', chr(0).substr($raw, 12, 3))[1]; 
$cert_as_asn1 = substr($raw, 0, $cert_length); 

любые идеи?

+0

я получил что-то вроде этого, после декодирования: [http://pastebin.com/eSFPnwSg](http://pastebin.com/eSFPnwSg) –

+0

Да, это просто прерванный просмотр того, что внутри. Я пытаюсь извлечь сертификат целиком из строки b64. – user3436467

+0

«У меня строка base64 ..» - base64 - это всего лишь способ сделать ASCII из двоичного. Он ничего не говорит о неотъемлемой структуре данных, что означает, что это может быть что угодно. Чтобы узнать, как извлечь сертификат из него, может быть полезно знать неотъемлемую структуру этих данных или, по крайней мере, какую программу вывести эти данные. –

ответ

2

У меня есть base64 закодирован Merkle лист строку ...

Похоже, у вас действительно есть подписанный сертификат штамп времени. Там нет сертификата в этом, только TBSCertificate:

3.2. Structure of the Signed Certificate Timestamp 

    enum { certificate_timestamp(0), tree_hash(1), (255) } 
    SignatureType; 

    enum { v1(0), (255) } 
    Version; 

    struct { 
     opaque key_id[32]; 
    } LogID; 

    opaque TBSCertificate<1..2^24-1>; 

    struct { 
     opaque issuer_key_hash[32]; 
     TBSCertificate tbs_certificate; 
    } PreCert; 

    opaque CtExtensions<0..2^16-1>; 

Чтобы добраться до реального сертификата вам необходимо будет также подпись эмитента, не имеют:

Certificate ::= SEQUENCE { 
    tbsCertificate  TBSCertificate, 
    signatureAlgorithm AlgorithmIdentifier, 
    signatureValue  BIT STRING } 

Это TBSCertificate начинается со смещения 47 (1163 октета). Извлеченные данные можно передать в openssl asn1parse -inform der, где вы можете просмотреть эту структуру:

0:d=0 hl=4 l=1159 cons: SEQUENCE   
    4:d=1 hl=2 l= 3 cons: cont [ 0 ]   
    6:d=2 hl=2 l= 1 prim: INTEGER   :02 
    9:d=1 hl=2 l= 16 prim: INTEGER   :64751A312C259E6E7302F1DBED1793C2 
    27:d=1 hl=2 l= 13 cons: SEQUENCE   
    29:d=2 hl=2 l= 9 prim: OBJECT   :sha256WithRSAEncryption 
    40:d=2 hl=2 l= 0 prim: NULL    
    42:d=1 hl=2 l= 119 cons: SEQUENCE   
    44:d=2 hl=2 l= 11 cons: SET    
    46:d=3 hl=2 l= 9 cons: SEQUENCE   
    48:d=4 hl=2 l= 3 prim: OBJECT   :countryName 
    53:d=4 hl=2 l= 2 prim: PRINTABLESTRING :US 
    57:d=2 hl=2 l= 29 cons: SET    
    59:d=3 hl=2 l= 27 cons: SEQUENCE   
    61:d=4 hl=2 l= 3 prim: OBJECT   :organizationName 
    66:d=4 hl=2 l= 20 prim: PRINTABLESTRING :Symantec Corporation 
    88:d=2 hl=2 l= 31 cons: SET    
    90:d=3 hl=2 l= 29 cons: SEQUENCE   
    92:d=4 hl=2 l= 3 prim: OBJECT   :organizationalUnitName 
    97:d=4 hl=2 l= 22 prim: PRINTABLESTRING :Symantec Trust Network 
    121:d=2 hl=2 l= 40 cons: SET    
    123:d=3 hl=2 l= 38 cons: SEQUENCE   
    125:d=4 hl=2 l= 3 prim: OBJECT   :commonName 
    130:d=4 hl=2 l= 31 prim: PRINTABLESTRING :Symantec Class 3 EV SSL CA - G3 
    163:d=1 hl=2 l= 30 cons: SEQUENCE   
    165:d=2 hl=2 l= 13 prim: UTCTIME   :150921000000Z 
    180:d=2 hl=2 l= 13 prim: UTCTIME   :161022235959Z 
    195:d=1 hl=4 l= 295 cons: SEQUENCE   
    199:d=2 hl=2 l= 19 cons: SET    
    201:d=3 hl=2 l= 17 cons: SEQUENCE   
    203:d=4 hl=2 l= 11 prim: OBJECT   :jurisdictionCountryName 
    216:d=4 hl=2 l= 2 prim: PRINTABLESTRING :NZ 
    220:d=2 hl=2 l= 29 cons: SET    
    222:d=3 hl=2 l= 27 cons: SEQUENCE   
    224:d=4 hl=2 l= 3 prim: OBJECT   :businessCategory 
    229:d=4 hl=2 l= 20 prim: PRINTABLESTRING :Private Organization 
    251:d=2 hl=2 l= 14 cons: SET    
    253:d=3 hl=2 l= 12 cons: SEQUENCE   
    255:d=4 hl=2 l= 3 prim: OBJECT   :serialNumber 
    260:d=4 hl=2 l= 5 prim: PRINTABLESTRING :35976 
    267:d=2 hl=2 l= 11 cons: SET    
    269:d=3 hl=2 l= 9 cons: SEQUENCE   
    271:d=4 hl=2 l= 3 prim: OBJECT   :countryName 
    276:d=4 hl=2 l= 2 prim: PRINTABLESTRING :NZ 
    280:d=2 hl=2 l= 13 cons: SET    
    282:d=3 hl=2 l= 11 cons: SEQUENCE   
    284:d=4 hl=2 l= 3 prim: OBJECT   :postalCode 
    289:d=4 hl=2 l= 4 prim: UTF8STRING  :1010 
    295:d=2 hl=2 l= 20 cons: SET    
    297:d=3 hl=2 l= 18 cons: SEQUENCE   
    299:d=4 hl=2 l= 3 prim: OBJECT   :stateOrProvinceName 
    304:d=4 hl=2 l= 11 prim: UTF8STRING  :New Zealand 
    317:d=2 hl=2 l= 17 cons: SET    
    319:d=3 hl=2 l= 15 cons: SEQUENCE   
    321:d=4 hl=2 l= 3 prim: OBJECT   :localityName 
    326:d=4 hl=2 l= 8 prim: UTF8STRING  :Auckland 
    336:d=2 hl=2 l= 54 cons: SET    
    338:d=3 hl=2 l= 52 cons: SEQUENCE   
    340:d=4 hl=2 l= 3 prim: OBJECT   :streetAddress 
    345:d=4 hl=2 l= 45 prim: UTF8STRING  :Ground Floor, Anz Centre, 23-29 Albert Street 
    392:d=2 hl=2 l= 37 cons: SET    
    394:d=3 hl=2 l= 35 cons: SEQUENCE   
    396:d=4 hl=2 l= 3 prim: OBJECT   :organizationName 
    401:d=4 hl=2 l= 28 prim: UTF8STRING  :ANZ Bank New Zealand Limited 
    431:d=2 hl=2 l= 25 cons: SET    
    433:d=3 hl=2 l= 23 cons: SEQUENCE   
    435:d=4 hl=2 l= 3 prim: OBJECT   :organizationalUnitName 
    440:d=4 hl=2 l= 16 prim: UTF8STRING  :Web Technologies 
    458:d=2 hl=2 l= 34 cons: SET    
    460:d=3 hl=2 l= 32 cons: SEQUENCE   
    462:d=4 hl=2 l= 3 prim: OBJECT   :commonName 
    467:d=4 hl=2 l= 25 prim: UTF8STRING  :cdn.Pre-prod-sdpanz.co.nz 
    494:d=1 hl=4 l= 290 cons: SEQUENCE   
    498:d=2 hl=2 l= 13 cons: SEQUENCE   
    500:d=3 hl=2 l= 9 prim: OBJECT   :rsaEncryption 
    511:d=3 hl=2 l= 0 prim: NULL    
    513:d=2 hl=4 l= 271 prim: BIT STRING   
    788:d=1 hl=4 l= 371 cons: cont [ 3 ]   
    792:d=2 hl=4 l= 367 cons: SEQUENCE   
    796:d=3 hl=2 l= 36 cons: SEQUENCE   
    798:d=4 hl=2 l= 3 prim: OBJECT   :X509v3 Subject Alternative Name 
    803:d=4 hl=2 l= 29 prim: OCTET STRING  [HEX DUMP]:301B821963646E2E7072652D70726F642D736470616E7A2E636F2E6E7A 
    834:d=3 hl=2 l= 9 cons: SEQUENCE   
    836:d=4 hl=2 l= 3 prim: OBJECT   :X509v3 Basic Constraints 
    841:d=4 hl=2 l= 2 prim: OCTET STRING  [HEX DUMP]:3000 
    845:d=3 hl=2 l= 14 cons: SEQUENCE   
    847:d=4 hl=2 l= 3 prim: OBJECT   :X509v3 Key Usage 
    852:d=4 hl=2 l= 1 prim: BOOLEAN   :255 
    855:d=4 hl=2 l= 4 prim: OCTET STRING  [HEX DUMP]:030205A0 
    861:d=3 hl=2 l= 29 cons: SEQUENCE   
    863:d=4 hl=2 l= 3 prim: OBJECT   :X509v3 Extended Key Usage 
    868:d=4 hl=2 l= 22 prim: OCTET STRING  [HEX DUMP]:301406082B0601050507030106082B06010505070302 
    892:d=3 hl=2 l= 102 cons: SEQUENCE   
    894:d=4 hl=2 l= 3 prim: OBJECT   :X509v3 Certificate Policies 
    899:d=4 hl=2 l= 95 prim: OCTET STRING  [HEX DUMP]:305D305B060B6086480186F84501071706304C302306082B06010505070201161768747470733A2F2F642E73796D63622E636F6D2F637073302506082B0601050507020230191A1768747470733A2F2F642E73796D63622E636F6D2F727061 
    996:d=3 hl=2 l= 31 cons: SEQUENCE   
    998:d=4 hl=2 l= 3 prim: OBJECT   :X509v3 Authority Key Identifier 
1003:d=4 hl=2 l= 24 prim: OCTET STRING  [HEX DUMP]:301680140159ABE7DD3A0B59A66463D6CF200757D591E76A 
1029:d=3 hl=2 l= 43 cons: SEQUENCE   
1031:d=4 hl=2 l= 3 prim: OBJECT   :X509v3 CRL Distribution Points 
1036:d=4 hl=2 l= 36 prim: OCTET STRING  [HEX DUMP]:30223020A01EA01C861A687474703A2F2F73722E73796D63622E636F6D2F73722E63726C 
1074:d=3 hl=2 l= 87 cons: SEQUENCE   
1076:d=4 hl=2 l= 8 prim: OBJECT   :Authority Information Access 
1086:d=4 hl=2 l= 75 prim: OCTET STRING  [HEX DUMP]:3049301F06082B060105050730018613687474703A2F2F73722E73796D63642E636F6D302606082B06010505073002861A687474703A2F2F73722E73796D63622E636F6D2F73722E637274 
+0

Я получил тот же результат со смещением 47 '$ cert_as_asn1 = substr ($ raw, 47, $ cert_length);' - Можете ли вы взглянуть на эту строку b64 из extra_data https: // justpaste.it/v1u8 - В RFC дополнительные_данные должны иметь целую цепочку сертификатов. Я бы предположил, что я смогу получить настоящий сертификат отсюда? – user3436467

+0

@ user3436467: один из пасты имеет реальный сертификат со смещением 3, длиной 1589 и еще один со смещением 1598, длина 1327 внутри. –

+0

, который работает - спасибо! Вы уже давно помогли, но, зная, что я могу получить эти данные сейчас, как я могу самостоятельно выработать эти смещения? Если бы вы могли обновить свое решение с помощью процедуры, я был бы очень любезен. – user3436467

Смежные вопросы