Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di dacdam
    Registrato dal
    Feb 2009
    Messaggi
    48

    openssl_pkcs7_verify e firma digitale DER

    Ciao a tutti,
    stò cercando di estrapolare il file originale da uno firmato digitalmente.
    Sò che devo usare la funzione openssl_pkcs7_verify, che non riesco a far funzionare, ed ho già fatto diverse ricerce sul motivo.

    Quello che ho scoperto è che il problema dipende dal fatto che la firma digitale che stò cercando di gestire è in formato DER, mentre PHP gestisce solamente firme PEM.

    Qualcuno sà se c'è un modo per convertire una firma DER in una firma PEM ? Tenete presente che la firma è attached nel file, quindi la codifica in base64 credo non sia possibile in quanto codificherebbe anche il contenuto del file rendendolo inutilizzabile.

    In alternativa, qualcuno sà se esiste un modo per gestire le firme DER in PHP ?

    Grazie per l'aiuto!

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Hai cercato nel posto più ovvio? La documentazione di PHP?
    http://php.net/manual/it/ref.openssl.php

    secondo contributo degli utenti.

  3. #3
    Utente di HTML.it L'avatar di dacdam
    Registrato dal
    Feb 2009
    Messaggi
    48
    Sì, certo, è per quello che ho scritto che la codifica base64 non penso possa andare bene.
    Usando quella soluzione ottengo tutto il file codificato in base64, non solo la chiave... penso che questo non vada bene.
    Dico questo perchè ho fatto una prova: codifico in base64 secondo quello riportato nel commento che mi hai citato e poi eseguo di nuovo la verify.... niente da fare: ottengo sempre risultato -1. Andando a vedere nel dettaglio gli errori prodotti (openssl_error_string) vedo che sono gli stessi che ottenevo prima, in sostanza verify non riesce a leggere la firma.

    Ecco il codice che ho scritto, se può servire:

    /**
    Metodo di gestione dei file p7m
    */
    private function gestioneP7M($contenutoFileP7M,$nomeFileP7M){

    $nomeFileEstratto = substr($nomeFileP7M,0,-4);
    $nomeTemporaneoP7M = $_SERVER['DOCUMENT_ROOT'].'/temp/'.basename($nomeFileP7M);
    $nomeTemporaneoEstratto = $_SERVER['DOCUMENT_ROOT'].'/temp/'.basename($nomeFileEstratto);

    //Salvo il file p7m nella cartella temporanea
    file_put_contents($nomeTemporaneoP7M,$this->der2pem($contenutoFileP7M));

    //Estrazione dei dati
    //exec('openssl smime -decript -in \''.$nomeTemporaneoP7M.'\' -inform DER -verify -noverify -out \''.$nomeTemporaneoEstratto.'\'');
    openssl_pkcs7_verify($nomeTemporaneoP7M, PKCS7_BINARY, null, array(), null, $nomeTemporaneoEstratto);

    //DEBUG
    while ($msg = openssl_error_string()) echo $msg . "<br />\n";
    var_dump($nomeTemporaneoP7M)."\n";
    var_dump($nomeTemporaneoEstratto)."\n";
    exit;

    .......
    .......

    .......
    .......

    }

    /*
    Metodo necessario per via del fatto che PHP per ora lavora solo con file firmati in formato PEM, mentre i nostri sono firmati DER (routine presa dal manuale php: http://php.net/manual/it/ref.openssl.php)
    */
    private function der2pem($der_data) {
    return $pem = "-----BEGIN CERTIFICATE-----".PHP_EOL.chunk_split(base64_encode($der_data) , 64, PHP_EOL)."-----END CERTIFICATE-----".PHP_EOL;
    }

    Ciao!

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.