從http到https需要申請ssl證書。
阿里雲有免費的ssl證書,買了一個測試。
步驟
我的環境為nginx+springboot。springboot中不配置ssl,只需要配置nginx即可。
- 首先,在服務器控制台打開443端口。默認的網站都是80端口,https默認為443端口
- 在域名控制台建好用來測試的二級域名,用一級域名當然也可以。
- 申請ssl證書,驗證的時候,按照網站提示的要求,在域名那里填相應的記錄就好。
- ssh連接到服務器,配置nginx.conf文件。
- 測試配置文件nginx.conf是否正確。/usr/local/nginx/sbin/nginx -t (nginx安裝的目錄/sbin/nginx -t)。
- 當填寫完,測試過,沒有錯誤信息的時候,重啟nginx。/usr/local/nginx/sbin/nginx -s reload
一些錯誤
- nginx 報錯 : [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead
因為nginx 1.15 及以后的版本,不需要再寫 ssl on; 了。需要把ssl on 改為listen 443 ssl;
如果還不行,那就是服務器的443端口沒有打開。
- 配置文件中不要直接復制百度到的。出現這個錯誤,nginx: [emerg] unknown directive " " in /usr/local/nginx/conf/nginx.conf,是因為復制到的空格的原因。需要刪除空格重新寫。
源碼
貼上我的https的部分的配置文件(每個二級域名都需要一個這種配置):
# http -> Https 如果使用的http協議訪問,重定向到https訪問
server {
listen 80;
server_name xxx.xxx; # 域名
add_header Strict-Transport-Security max-age=15768000;
return 301 https://$server_name$request_uri;
}
# Https 的配置,除了有注釋的地方,其他地方和我一樣即可
server {
listen 443 ssl; # 老版本是ssl on;較新的為listen 443 ssl;
server_name xxx.xxx; # 域名
keepalive_timeout 10m;
ssl_certificate cert/xxx.xxx.pem; # 申請的證書,把證書和秘鑰上傳到nginx.conf的同級目錄cert的目錄下
ssl_certificate_key cert/xxx.xxx.key; # 秘鑰
ssl_session_timeout 24h;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:8080; # 反向代理到本機的8080端口,8080端口的那個服務器不需要任何關於https的配置。
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
}