Un peu fatiguant de ne pas pouvoir configurer ce genre de chose sur l'ELB directement...
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
Un peu redondant, non ?
Si un site fait bien son job en définissant les cookie en secure, ils ne partiront jamais en http
Le HSTS c'est un peu fait pour ça non ? Eviter que des infos partent en http au lieu de https ? Après il n'y a pas que les cookie, mais bon, c'est là que se trouve le + important en général (session id)
Surtout que le site en face renverra une redirect sur https
https://scotthelme.co.uk/hpkp-http-public-key-pinning/
https://scotthelme.co.uk/hpkp-toolset/
https://tools.ietf.org/html/rfc7469#page-7
eli5 :
Si le browser reçoit un header "Public-Key-Pins" avec une liste de hash, il va les stocker en local avec le domaine associé (pour un temps donnée par le max-age, la rfc conseille 2 mois)
Firefox les stocke au même endroit que les HSTS : http://security.stackexchange.com/questions/92954/how-can-i-see-which-sites-have-set-the-hsts-flag-in-my-browser
Quand un browser se connecte en https à un site, et qu'il a en local une entrée HPKP, il va y avoir une condition pour que la connexion s'établisse :
Les hashs dans le header qui ne correspondent à rien sont considérés comme des backup.
Si aucun hash de l'entrée HPKP locale ne correspond à aucun hash de clé publique de la chaine : impossible de se connecter.
à partir de là, on peut implémenter comme on veut HPKP, en étant plus ou moins strict.
Par exemple, pour https://infomee.fr, grâce à https://report-uri.io/home/pkp_hash on peut voir les hash des clés publiques de ma chaine de certification :
Leaf : Here is your PKP hash for infomee.fr: pin-sha256="oM+/1421Ew13AzUUxBTNbJjxofRe40CxO2Lt89BUeHk="
Intermediate : Here is your PKP hash for Let's Encrypt Authority X3: pin-sha256="YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg="
Root : Here is your PKP hash for DST Root CA X3: pin-sha256="Vjs8r4z+80wjNcr1YKepWQboSIRi63WsWXhIMN+eWys="
Si je décide de renvoyer dans le header Public-Key-Pins seulement le hash du root :
Ce qui est déjà bien, mais si cette autorité est corrompue, un certificat frauduleux pourra toujours être utilisé.. C'est là qu'on peut aller plus loin et utiliser l'intermediate seulement ou encore plus loin le leaf seulement
Test :
Pour être top secure mais touchy à config/gérer : pin seulement le leaf (et bien sur un backup)
Un peu une saloperie ce HSTS tout de même
Chrome:
Open Chrome
Type chrome://net-internals/#hsts in the address bar of chrome
Query domain: if it appears as a result, it is HSTS enabled
Firefox:
Open file explorer
Copy paste %APPDATA%\Mozilla\Firefox\Profiles\ in the address bar of file explorer (for Linux it is ~/.mozilla/firefox)
Double click the folder you see (if you have multiple FF profiles, there will be multiple folders)
Open SiteSecurityServiceState.txt. This textfile contains sites that have enabled HSTS.
ngrep pas glop quand https, du coup :
sudo apt install mitmproxy
mitmdump -v -d
Dans l'application, configurer la lib (curl ou autre..) pour utiliser un proxy http/https sur 127.0.0.1:8080 (mitmdump écoute sur ce port)
ou bien plus violent :
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080
Dans tous les cas, la lib va raler car certif pas ok : utiliser insecure si possible dans l'app ou bien generer certif et le trust au niveau de l'os
à partir de là on peut voir les call/response avec mitmdump
Si on veut curl une ressource sur l'ip (car pas de résolution, pas envie de modifier /etc/hosts..)
On va utiliser -H pour rajouter un header host et arriver sur le bon virtualhost :
curl -H 'Host: www.foo.com' http://192.168.1.1/
Si la ressource est en https, ça ne passe pas :
curl -H 'Host: www.foo.com' https://192.168.1.1/
curl: (51) SSL: certificate subject name (*.foo.com) does not match target host name '192.168.1.1'
Car le SNI hello se fait avec l'host dans l'url (192.168.1.1) et non pas avec le Header Host
Un workaround est d'utiliser l'option --resolve
curl --resolve www.foo.com:192.168.1.1 https://www.foo.com
On peut aussi utiliser --insecure pour ignore l'erreur mais on ne valide pas que le certificat est ok :
curl --insecure -H 'Host: www.foo.com' http://192.168.1.1/
Ce n'est pas secure de load en http en le formulaire et de le submit en https.
Petit pense bête :
<VirtualHost :80>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>
ou
<VirtualHost *:80>
ServerName mon.domaine.fr
Redirect / https://mon.domainefr/
</VirtualHost>
Bon article sur quelques subtilités ssl
via Skunnyk
Sympa la découpe : DNS Lookup / Initial Connection (RTT) / SSL nego / TTFB