Brug af flere SSL certifikater Amazon Load Balancer | MiniFinans
stars
stars
stars
stars
stars
Existing Users Log In
   

Brug af flere SSL certifikater Amazon Load Balancer

Brug af flere SSL certifikater Amazon Load Balancer

Brug af flere SSL certifikater Amazon Load Balancer

Er det muligt at bruge flere forskelige SSL certifikater under den samme Amazon Load Balancer i et auto scaling miljø?

Det korte svar er ja, det lange svar er at dette stadig er besynderligt svært at sætte op. Vi havde for nyligt et behov for at kunne have flere SSL certifikater associeret med et enkelt Elastic Beanstalk miljø i AWS.

Når man skal tilføje et enkelt SSL certifikat til en Elastic Load Balancer (ELB) i AWS, er dette meget lige til. Man uploader sine certifikater, og ELB vil herefter terminnere SSL krypteret trafik, og sende det til ens server via port 80.

Hvis du skal have flere certifikater associeret med den samme load balancer er dette ikke muligt fordi at HTTPS protokolen kryptere HTTP anmodningen, inklusivt Host headeren. Det er derfor ikke muligt at vide hvilket SSL certifikat der skal bruges for at autentificere anmodningen.
Man er derfor nød til at konfigurere ELB til at vidersende port 443 trafik til din server cluster, hvor den udvalgte server selv skal terminnere SSL krypteringen.

Her opstår der dog et problem. Siden at klientens anmodning først rammer ELB, hvorefter den vidersendes SSL krypteret til EC2, vil IP source headeren blive overskrevet af ELB’s IP, og ELB vil ikke have mulighed for at skrive en X-Forwarded-For header da anmodningen er krypteret.
Du vil derfor ikke have mulighed for at få den oprindelige klients IP adresse, og det vil ligne at alle anmodninger kommer fra ELB.

Heldigvis har Amazon for nyligt gjort det muligt at tilføje ProxyProtocol til sin Load Balancer: http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/enable-proxy-protocol.html
ProxyProtocol instruere ELB til at skriver den oprindelige IP adresse ved siden af det krypterede indehold, hvorefter det vil være muligt for NGINX at aflæse headeren og evt skrive den ind i X-Forwarded-For, hvorefter din applikation kan få klientens IP.

Et eksempel på sådan en NGINX konfiguration kunne se sådan her ud:

server {
listen 443 ssl proxy_protocol;
server_name dummy.com;
root /var/www/html/web;
charset utf-8;

real_ip_header proxy_protocol;

resolver 8.8.8.8 valid=300s;
resolver_timeout 10s;

location ~ ^/(app)\.php(/|$) {

proxy_pass http://dummy.com;
proxy_http_version 1.1;

proxy_set_header Connection “”;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $proxy_protocol_addr;
proxy_set_header X-Forwarded-For $proxy_protocol_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

Skrevet af Ivan Ristic
CTO Minifinans.dk