Quello che state cercando è chiamato Mutual Authentication.
È responsabilità del server effettuare/richiedere al client di inviare il proprio certificato. Ogni server fa questo in modo diverso e dovrai cercare come configurare il tuo server particolare.
Per Spring Security, consiglierei di esaminare X.509 Authentication. Questo tipo di autenticazione è abbastanza facile da usare ed estendere secondo necessità.
EDIT
Quindi, ecco un paio di riferimenti che mostrano esempi di ciò che si sta chiedendo:
http://whiteycode.blogspot.com/2012/04/part-3-x509-authentication-with-spring.html
PDF Attenzione
http://www.promixis.com/pdfs/SpringSecurityAndX509ClientCertificates.pdf
T il suo esempio è molto utile per spiegare come configurare i certificati e creare la propria CA personale (autorità di certificazione). Attenzione, il modo in cui mostrano di rendere il certificato del cliente è solo A WAY, non il modo. Il client (browser Web IE o client java httpclient) dovrebbe determinare il modo in cui creare il certificato client. A Java piace usare il suo keystore java e ovviamente i browser preferiscono lo stile p12 dei certificati.
Avviso finale/avviso ... Non conosco il tuo livello di conoscenza con i certificati, ma ... L'autenticazione reciproca riguarda chi si fida di chi. È responsabilità dei severs dire che ho bisogno che tu ti autentichi con un certificato e qui c'è un elenco di fornitori di certificati di cui mi fido. È quindi responsabilità dei clienti rispondere con un certificato firmato da uno di quei fornitori di certificati attendibili del server. È responsabilità delle applicazioni dire quindi, mi fido di questa persona in base al loro nome all'interno del certificato? Se e quando le cose cominciano a sbagliare, pensa a chi è o non si fida di chi.
Un grande strumento utilizza -Djavax.net.debug = ssl sulla tua applicazione. Mostrerà l'intera stretta di mano SSL e ciò che viene richiesto e quali sono le risposte specifiche. Quell'opzione è un po 'prolissa, ma è piacevole avere quando serve.
EDIT X 2
Ecco come abilitare l'autenticazione reciproca su Tomcat 7.
nel server.xml file di configurazione si dovrebbe vedere vicino al seguente per un connettore SSL:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="want" sslProtocol="TLS"
keystoreFile="C:\Java\Certs\localhost.jks"
keystorePass="changeit"
URIEncoding="UTF-8" />
Il valore importante da notare è il valore clientAuth.
L'impostazione di clientAuth su "desidera" indica al client di inviare un certificato ssl del client firmato da un elenco di certificati che il server considera attendibili se ne ha uno. In caso contrario, vai avanti e fai la tua richiesta come al solito.
L'impostazione di clientAuth su "true" indica al client che DEVONO inviare un certificato ssl del client firmato da un elenco di certificati attendibili dal server. Se non si dispone di un certificato firmato da un elenco di certificati attendibili dal server, il client NON è autorizzato a effettuare la richiesta.
L'elenco di certificati che il server considera attendibili proviene dall'archivio java predefinito o può essere impostato utilizzando l'opzione VM -Djavax.net.ssl.trustStore="C:\Java\Certs\jssecacerts1"
.
In genere, quando si ha un certificato CA specifico di cui si ha fiducia che non si trova nel truststore Java predefinito, viene copiato il truststore predefinito, il nuovo certificato CA viene importato nel truststore copiato e quindi utilizzato con l'opzione VM precedente.
ATTENZIONE
E 'super importante non cambiare il truststore Java di default sul posto. Se lo fai, tutte le applicazioni java per impostazione predefinita su quella macchina utilizzeranno il nuovo truststore aggiornato. Non sempre ciò che le persone vogliono e può causare rischi per la sicurezza.
Sì, voglio un esempio di autenticazione X.509, al controller Spring (che riceve richieste di stile REST). Potresti darmi un altro riferimento, dove tutto sarà espanso al rovescio? – grep
Wow, questo è un alto ordine. Cercherò su google e vedrò se c'è qualcosa di simile e aggiorno la risposta. – hooknc
Come mi hai detto "È responsabilità dei server". se è fatto dal lato server (ad esempio possiamo farlo in tomcat), perché la sicurezza di primavera ha l'autenticazione X.509? – grep