2014-10-29 15 views
11

Ho scritto controller Spring. Le richieste di ottenere dai clienti. È solo lo stile REST.Certificato servizio REST di primavera auth

Questo è molto buono. Ma ho bisogno dell'autenticazione del certificato. Solo i client devono avere accesso al servizio di riposo (controller di primavera), che dispone di certificati client con chiave (in altre parole il client deve avere il keystore con la chiave).

Come posso configurare questa sicurezza a primavera? Potresti darmi un esempio o un link in cui questo è scritto?

Grazie

risposta

15

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.

+0

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

+0

Wow, questo è un alto ordine. Cercherò su google e vedrò se c'è qualcosa di simile e aggiorno la risposta. – hooknc

+0

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

0

ho creato un progetto al 100% comprensibile esempio con tutto necessario per l'installazione di un app primavera avvio con un endpoint REST che è garantita dal certificato client - e un Testcase con l'RestTemplate che è configurato per utilizzare il certificato client per comunicare con server sicuro: https://github.com/jonashackt/spring-boot-rest-clientcertificate

Esso contiene inoltre tutte le passaggi necessari per generare i file .key, .crt e .jks. Regola i passaggi di conseguenza, se non vuoi utilizzare un certificato autofirmato.

Il RestTemplate è configurato in questo modo:

package de.jonashackt.restexamples; 

import org.apache.http.client.HttpClient; 
import org.apache.http.impl.client.HttpClients; 
import org.apache.http.ssl.SSLContextBuilder; 
import org.springframework.boot.web.client.RestTemplateBuilder; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; 
import org.springframework.util.ResourceUtils; 
import org.springframework.web.client.RestTemplate; 

import javax.net.ssl.SSLContext; 

@Configuration 
public class RestClientCertTestConfiguration { 

    private String allPassword = "allpassword"; 

    @Bean 
    public RestTemplate restTemplate(RestTemplateBuilder builder) throws Exception { 

     SSLContext sslContext = SSLContextBuilder 
       .create() 
       .loadKeyMaterial(ResourceUtils.getFile("classpath:keystore.jks"), allPassword.toCharArray(), allPassword.toCharArray()) 
       .loadTrustMaterial(ResourceUtils.getFile("classpath:truststore.jks"), allPassword.toCharArray()) 
       .build(); 

     HttpClient client = HttpClients.custom() 
       .setSSLContext(sslContext) 
       .build(); 

     return builder 
       .requestFactory(new HttpComponentsClientHttpRequestFactory(client)) 
       .build(); 
    } 
} 

Quindi è possibile utilizzare proprio come tu sei usato per la @Autowired annotazioni all'interno del vostro Test.class.

Problemi correlati