2015-10-22 16 views
6

Voglio verificare una firma per una richiesta soap su un server soap implementato in php.Verifica firma nell'implementazione server WS *

Il codice del server:

$Server = new SoapServer(); 

$d = new DOMDocument(); 
$d->load('php://input'); 

$s = new WSSESoapServer($d); 
try { 
    if($s->process()) { 
     // Valid signature 
     $Server->handle($s->saveXML()); 
    } else { 
     throw new Exception('Invalid signature'); 
    } 
} catch (Exception $e) { 
    echo "server exception: " . $e; 
} 

L'errore:

exception 'Exception' with message 'Error loading key to handle Signature' in /<path>/wse/src/WSSESoapServer.php:146 

ho implementato un client di firmare richieste SOAP che utilizzano questa libreria: https://github.com/robrichards/wse-php. Non ci sono esempi su come implementare il server ...

Come caricare la chiave pubblica per controllare la firma?

[Edit] Ho ormai in grado di caricare la chiave in dotazione utilizzando

$key = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type' => 'public')); 
    $key->loadKey(CERT, true); 

Non sono più ottenendo un messaggio di errore durante la convalida della firma:

$x = new XMLSecurityDSig(); 
$d = $x->locateSignature($soapDoc); 
$valid = $x->verify($key); 

Tuttavia, $ valida è sempre falso Non ho idea se è perché la chiave è stata caricata in modo errato o non è effettivamente valida. Posso trovare pochissime informazioni sull'implementazione di un server SOAP con PHP e nessuna informazione sull'implementazione di un server SOAP che si basa sul controllo di una richiesta firmata.

CHIARIMENTO

  1. miei client comunica con un servizio Web remoto e ottiene un riconoscimento.

  2. Quindi il server remoto impiega del tempo per elaborare la mia richiesta.

  3. Un client remoto (di cui non ho il controllo) effettua quindi una richiesta al servizio .

L'ultimo passo è dove ho problemi con la verifica della firma

+0

Mi sembra che WSSESoapServer rilevi e convalidi automaticamente le firme all'interno di un messaggio soap. Quindi il tuo primo approccio dovrebbe essere ok, non dovresti aver bisogno di caricare manualmente una chiave o verificare. Ma: WSSESoapServer richiede che il messaggio soap firmato includa la firma E la chiave pubblica per verificare la firma. – smat88dd

+0

Sei ancora interessato a una soluzione o potresti aggiustarla da solo? Ho configurato un client e un server di test e ho potuto postarlo come risposta! Ad ogni modo, potrei farlo funzionare, il server wsse sta convalidando le firme senza errori. – smat88dd

+0

@ smat88dd Penso che il mio ultimo montaggio l'abbia risolto caricando la firma. Non ho alcun controllo sul cliente che effettua la richiesta.Penso che la chiave pubblica che ho potrebbe non essere valida perché sempre valuta false. Se la tua soluzione è diversa dalla mia, mi piacerebbe comunque vederla. Se solo per avere * qualche * documentazione a cui fare riferimento. – soulfreshner

risposta

0

Bene in ogni modo, il tuo primo approccio guarda bene a me, il mio server ha la stessa struttura. Sfortunatamente, WSSESoapServer non eredita da SoapServer, quindi è non in realtà un SoapServer, ma piuttosto un SoapSignatureValidator e dovrebbe essere chiamato in questo modo. Sarebbe facilmente possibile correggere tale comportamento, che non sarebbe necessaria un'istanza separata SoapServer (dovrebbe essere trasparente e automaticamente).

<?php 
require 'soap-server-wsse.php'; 

try { 
    // get soap message 
    $xmlSoap = DOMDocument::load('php://input'); 

    // validate signature 
    $validateSignature = new WSSESoapServer($xmlSoap); 
    if(!$validateSignature->process()) 
     file_put_contents("log.txt", "soapserver: SIGNATURE VALIDATION ERROR - CONTINUING WITHOUT SIGNATURE\n", FILE_APPEND); 
     //throw new Exception('Invalid Signature'); # this would cancel the execution and not send an answer 

    $sServer = new SoapServer($wsdl); 
    // actually process the soap message and create & send answer 
    //$sServer->setClass() or setObject() or set setFunction() 
    $sServer->handle($validateSignature->saveXML()); 
} catch (Exception $fault) { 
    file_put_contents("log.txt", "soapserver soapfault: ".print_r($fault, true), FILE_APPEND); 
} 
?> 
+0

Oh, btw: questo codice funziona effettivamente, ma solo quando la chiave pubblica della firma è inclusa nel messaggio soap. Se si desidera fornire direttamente la chiave pubblica, le modifiche a 'WSSESoapServer' sono necessarie. – smat88dd

+0

.. ma questo non risponde affatto alla domanda. Il mio intero problema è con il caricamento della chiave pubblica per controllare la firma. Quali cambiamenti sono necessari? Grazie per l'aiuto, però. Almeno posso vedere che sono sulla strada giusta – soulfreshner

+0

Mi dispiace, lasciatemi chiarire: WSSESoapServer non ha alcuna opzione per caricare una chiave pubblica. È fatto per ottenere la chiave dall'interno del messaggio di sapone. La mia risposta è stata solo parziale, perché hai anche chiesto come creare un server con WSSESoapServer, perché non c'erano esempi. – smat88dd