2016-03-11 2 views
2

Мне нужно установить PHP-композитор, но я не готов к curl | php, и я хочу проверить загруженные пакеты на подпись или контрольную сумму.PHP composer загрузить подпись валидации

download links на сайте - так, как я хочу. Разработчики также опубликовали их public keys на сайте. И есть сигнатуры пакетов, доступные в $ {download} .sig (их нашли, просто искали их), однако я не могу понять, как проверить эти подписи.

Например это текущие последние ФАР и сиг файлы:

Файл сиг содержит:

{"sha384":"FGC1jaYN4TCnaaeha3aeHx1W8gn/GyBaNk09TEOxLXjhWdwFb7psJBtZgXEsrq1Sm0J91j3l2AZDWofQ1s1FHD6A4cZY5H2KQ7KleqIFmDWDVyASHc6tjvaPtlQJ4BCVJEOPsRHX2NTH1roCs48t7S+MbVj5j5K8oVggEw9IOG4uurABUiadOLj/gQ3UpXz1+oflkr358qCkQuUW2upMuHDto8BNLSDYrCLgct1i8aCTCgKo6BYMBGSZxQdGY/dDyRX6rHbR1/CzfJmECgA9qGgeXxDRyjFg/93wsQfuFPCijd6vTpRmsFKYpwfQXMult8t+0mPh4PcvX1GzKtYcLxmsA2MmyPVfX80KtGp2EF5ExRAxOqZtd3ZtwqqOxUeNUfESKrXif1v0PxVGlER4KX5MBvCH9UvwwUPOzyplJ8N+4ybtNGfHiOD3MpPsiVBVoWkQouI5qbHRT39kAGKfMQBDWounrwMGGQV2Ca2/bFMcnInYkXFyLD12yekluoktpBcyFyZcHOJXXbbMGeXLZn3cepBwneUPklB4Q6zkouIdCkZZIzyOkLp4XgCP55idmD+DNmeoaGNlqDJmN+2wTWQv5GBj9DEEXBFHZ5f4hfn6ZEYWO7GlgOz0YeijuknvtvdCR+Iqr3Vn72UKhtoBQd2L74YwzCG/4CBYhGtknMc"} 

Тело этой подписи похоже, кодируется base64, но декодируется o долго быть контрольной суммой sha384. Он также не является сигнатурой GPG.

Как я могу проверить пакет?

ответ

3

sign script можно найти на GitHub и содержит следующий код:

openssl_sign(file_get_contents($_SERVER['argv'][1]), $sha384sig, $pkeyid, OPENSSL_ALGO_SHA384) 
// ... 
$sha384sig = trim(base64_encode($sha384sig), '='); 

Так что подпись действительно является кодировке base64 SHA384 контрольной суммы.


Обратите внимание, что установщик, используемый для загрузки композитора phar, также проверяет подпись. It's code также можно найти на GitHub:

$signature = $httpClient->get($url.'.sig'); 
if (!$signature) { 
    out('Download failed: '.$errorHandler->message, 'error'); 
} else { 
    $signature = json_decode($signature, true); 
    $signature = base64_decode($signature['sha384']); 
} 

// ... 

if (false === $disableTls) { 
    $pubkeyid = openssl_pkey_get_public('file://'.$home.'/' . ($version ? 'keys.tags.pub' : 'keys.dev.pub')); 
    $algo = defined('OPENSSL_ALGO_SHA384') ? OPENSSL_ALGO_SHA384 : 'SHA384'; 
    if (!in_array('SHA384', openssl_get_md_methods())) { 
     out('SHA384 is not supported by your openssl extension, could not verify the phar file integrity', 'error'); 
     exit(1); 
    } 
    $verified = 1 === openssl_verify(file_get_contents($file), $signature, $pubkeyid, $algo); 
    openssl_free_key($pubkeyid); 
    if (!$verified) { 
     out('Signature mismatch, could not verify the phar file integrity', 'error'); 
     exit(1); 
    } 
} 
Смежные вопросы