2016-03-07 50 views
5

In allegato il mio fornitore di contesto per SAMLContextProviderLB fagioliPrimavera di sicurezza SAML, reindirizza andando a http invece di HTTPS quando si usa SAMLContextProviderLB impostato su HTTPs schema

**<property name="scheme" value="https"/>** 
     <property name="serverName" value="${sp.hostname}"/> 
     <property name="serverPort" value="#{'${sp.ssl.port}'=='' ? 443 : '${sp.ssl.port}'}"/> 
     <property name="includeServerPortInRequestURL" value="#{'${sp.ssl.port}'=='443' ? false : true }"/> 
     <property name="contextPath" value="/${sp.context.root}"/> 

Sono dietro un proxy inverso in modo che sto scaricando la terminazione SSL . il server back-end stesso è in ascolto su non-SSL ma il webtier sta terminando il protocollo SSL per noi e l'inoltro alla porta non-ssl. Ho impostato SAMLContextProviderLB con le proprietà di cui sopra in modo che anche se il backend è https, saprà mappare il destinatario previsto per il token saml come pubblico https. Quello che sto vedendo nei registri qui sotto, tuttavia, quando vado a una risorsa protetta, la sua restituzione spazzatura sul browser. Quando lo cambio in https nel browser, funziona come previsto. La visualizzazione dei log di seguito mostra che il valore restituito dall'URL DefaultSavedRequest è HTTP quando dovrebbe essere HTTP.

2016-03-07 18: 24: 11,907 INFO org.springframework.security.saml.log.SAMLDefaultLogger.log: 127 - AuthNResponse; SUCCESS; 10.4.203.88; https://myserver:89/fct;https://www.myADFS.com/adfs/services/trust;[email protected] ;;;

2016-03-07 18: 24: 11,909 DEBUG org.springframework.security.saml.SAMLProcessingFilter.successfulAuthentication: 317 - Autenticazione riuscita. Aggiornamento di SecurityContextHolder per contenere: org.springf[email protected]830e9237: Principal: [email protected]; Credenziali: [PROTETTO]; Autenticato: vero; Dettagli: null; Non concesso alcuna autorità

2016/03/07 18: 24: 11.910 DEBUG org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler.onAuthenticationSuccess: 79 - Reindirizzamento a DefaultSavedRequest URL: http : // myserver: 89/fct/pagina

2016-03-07 18: 24: 11.911 DEBUG org.springframework.security.web.DefaultRedirectStrategy.sendRedirect: 36 - Reindirizzamento a 'http://myserver:89/fct/page'

2016-03-07 18: 24: 11,911 DEBUG org.springframework.security.web.context.HttpSessionSecurityContextRepository.saveCon testo: 292 - SecurityContext memorizzato in HttpSession: '[email protected]0e9237: Autenticazione: org.springf[email protected]830e9237: Principal: [email protected]; Credenziali: [PROTETTO]; Autenticato: vero; Dettagli: null; Non concesso alcuna autorità

2016-03-07 18: 24: 11.912 DEBUG org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter: 97 - SecurityContextHolder ora cancellato, come la richiesta di trasformazione completata

Tutte le idee come forzare questo su HTTPS in questa configurazione? Grazie in anticipo.

risposta

3

Questa domanda è vecchia ma se l'ho trovata qualcun altro potrebbe quindi postare una risposta.

Il servizio di bilanciamento del carico o il proxy inverso (Apache httpd o nginx) deve svolgere un lavoro supplementare per voi. Spring (o Spring Boot) e l'Tomcat incorporato (o Jetty) pensano di utilizzare un server http. Che sta facendo Se il proxy passa alcune variabili di intestazione, Tomcat inizierà a pensare che sia in esecuzione https.

Ecco cosa ha bisogno Apache come esempio:

ProxyPreserveHost On 
RequestHeader add X-Forwarded-Proto https 
ProxyPass/http://127.0.0.1:8080/ 
ProxyPassReverse/http://127.0.0.1:8080/ 

ProxyPass e ProxyPassReverse sono ciò che probabilmente avete già. Ma lo ProxyPreserveHost e lo X-Forwarded-Proto contano davvero.

Dai un'occhiata a questa sezione del numero Spring Boot Docs. Se X-Forwarded-For o X-Forwarded-Proto sono impostati, è necessario aggiungere questo al file application.properties:

server.use-forward-headers=true 

Si vedrà anche in quel documento che è possibile aggiungere queste proprietà per la configurazione specifica Tomcat:

server.tomcat.remote-ip-header=x-your-remote-ip-header 
server.tomcat.protocol-header=x-your-protocol-header 

Completa tutto questo in aggiunta a in base a ciò che hai sopra e inizierà a funzionare. Quello che hai sopra, da solo, non è abbastanza per costringere Tomcat ad avviare l'inoltro delle richieste con https.

Ho scoperto che poiché la mia azienda disponeva di un servizio di bilanciamento del carico basato su hardware (gestito da Rackspace), era difficile configurarlo per apportare queste modifiche. Quindi eseguiamo la terminazione SSL nel firewall/bilanciamento del carico, quindi inoltriamo le richieste ad Apache sulla porta 80 e Apache le inoltra a Java sulla porta 8080. Sì, è un disastro. Ma ha funzionato tutte queste sciocchezze.