Как мне проверить подпись PDF-документа с PHP? - PullRequest
0 голосов
/ 09 апреля 2020

Фон

Мы разрешаем пользователям загружать в нашу бэкэнд-систему файл pdf (Laravel / php), содержащий информацию об их зарплате, которую они загружают с веб-сайта правительства Нидерландов. агентство (UWV Verzekeringsbericht). Этот документ имеет цифровую подпись.

Цель

Мы хотим проверить и подтвердить эту подпись, поэтому мы знаем, что пользователь ничего не изменил из этого файла и что файл правильный. Как вы можете проверить сертификат в Adobe Acrobat Reader.

Вопрос

Я пытался выполнить sh это в течение последних нескольких часов, но потому что из моих ограниченных знаний / опыта я не могу заставить это работать. Любая информация и / или дополнительная информация / учебные пособия о том, как выполнить sh, будет очень признательна. Я готов прочитать об основах этого, но я действительно не знаю, с чего начать.

Код

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

  public function first_attempt(): void
{
    $path = app_path('/Verzekeringsbericht.pdf');

    $content = file_get_contents($path);

    $regexp = '#ByteRange\s*\[(\d+) (\d+) (\d+)#'; // subexpressions are used to extract b and c

    $result = [];
    preg_match_all($regexp, $content, $result);

    // $result[2][0] and $result[3][0] are b and c
    if (isset($result[2]) && isset($result[3]) && isset($result[2][0]) && isset($result[3][0])) {
        $start = $result[2][0];
        $end = $result[3][0];
        if ($stream = fopen($path, 'rb')) {
            $signature = stream_get_contents($stream, $end - $start - 2, $start + 1); // because we need to exclude < and > from start and end

            fclose($stream);
        }

        file_put_contents('signature.pkcs7', hex2bin($signature));

        shell_exec('openssl pkcs7 -in signature.pkcs7 -inform DER -print_certs > cert.pem');
    }
}

public function second_attempt(): void
    {
        $path = 'file://' . app_path('/qveucag4.pem');
        $authorKey = openssl_pkey_get_public($path);
    }

public function third_attempt(): void
{
    $pemPath = app_path('/qveucag4.pem');
    $fileCertPath = app_path('/cert.pem');

    shell_exec("openssl verify -verbose -CAfile $pemPath $fileCertPath");
}
...