Voglio ottenere dati da un server che accetta solo l'autenticazione del client tramite smartcard e li salviamo sul mio server. Dato che sono molti dati, voglio creare una connessione tra il mio server e questo server di terze parti, ma ho bisogno del certificato dell'utente nella smart card. È impossibile per me estrarre la chiave privata dalla smart card, ovviamente, quindi non so se sia possibile o meno.
Ho abilitato sul mio server Apache l'autenticazione del client in questo modo:
SSLVerifyClient require
SSLVerifyDepth 4
SSLProtocol +TLSv1.1 +TLSv1.2
SSLOptions +ExportCertData +StdEnvVars
SSLCACertificateFile /usr/share/ca-certificates/ca-bundle.crt
Dopo che l'utente ha inserito il PIN, con il mio script PHP posso ottenere il certificato in questo modo:
$_SERVER["SSL_CLIENT_CERT"];
Infine cerco di utilizzare questo certificato per firmare la richiesta tramite php cURL in questo modo:
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://ext.processotelematico.giustizia.it/pda/pycons/GLMV/JPW_SICID",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSLCERT => $certificate,
CURLOPT_POSTFIELDS => "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>\r\n <soapenv:Header>\r\n <ws:InvocationDomain name=\"JPW\" role=\"AVV\" group=\"9876\" soapenv:mustUnderstand=\"1\" soapenv:actor=\"http://schemas.xmlsoap.org/soap/actor/next\" xmlns:ws=\"http://www.netserv.it/anag/security\" />\r\n </soapenv:Header>\r\n <soapenv:Body>\r\n <sicc:execute xmlns:sicc=\"urn:CONS-ANONIMA-SICC-BE\">\r\n <sicc:name>RicercaRuoloGenerale</sicc:name>\r\n <sicc:valueSet>\r\n <sicc:value name='idUfficio' type='string'>9876</sicc:value>\r\n <sicc:value name='numero' type='integer'>1</sicc:value>\r\n <sicc:value name='anno' type='string'>2017</sicc:value>\r\n </sicc:valueSet>\r\n <sicc:orderBy>\r\n <sicc:entry mode='asc' property='IDFASCICOLO' />\r\n </sicc:orderBy>\r\n </sicc:execute>\r\n </soapenv:Body>\r\n</soapenv:Envelope>",
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache",
"content-type: text/xml",
"x-wasp-user: user-id"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
Ma ho ricevuto questo errore: "impossibile impostare il file della chiave privata:". Quindi, suppongo di avere solo la parte pubblica del certificato. C'è qualcosa che posso fare per accedere da remoto? O è impossibile? So che dovrei usare il codice lato client, come Java Applet, ma, come detto, ci sono molti dati e voglio evitare di scaricarli sul client e caricare di nuovo sul mio server.
UPDATE: Giusto per chiarire il caso d'uso:
-
Il secondo server è un server governativo. Il ministero fornisce i dati dei cittadini dopo il login. Non posso cambiare nulla su questo server, ovviamente.
-
Il governo rilascia le smartcard per l'autenticazione, tramite le autorità di certificazione attendibili. Ho sul mio server i certificati CA, quindi la CA non è un problema (suppongo)
-
La mia app web dovrebbe scaricare, gestire e rappresentare i dati del cittadino in un modo migliore rispetto al server originale