引言
这几天公司的项目要上线,小猿对nginx了解还是不够熟悉,为了保证公司项目上限,小猿疯狂的恶补相关知识,然而听君一席话,胜读十年书,小猿对小猿知无不言的老前辈表示衷心的感谢,下面小猿就不感慨了,直接进入今天的正题。
先说办理这件事情也是及其费劲,因为老板当初采购服务器,安全组件以及服务器的时候就是委托商务中的人去办理这些事情,结果导致跨了好多家平台,操作过程极不方便,下面就开始总结小猿的整个ssl证书的安装过程。
什么是ssl证书
首先要谈一谈为什么要装ssl证书。ssl证书是数字证书的一种,它通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secure socket layer(SSL)安全协议,ssl是由Netscape Communication公司设计开发。该安全协议主要用来提供对用户和服务器的认证;对传送的数据进行加密和隐藏;确保数据在传送中不被改变,即数据的完整性,现已成为该领域中全球化的标准。
https 和ssl证书
ssl证书为HTTP网站提供转向HTTPS,加密应用层数据提供保障,ssl证书需要从提前准备。如果想用https的方式进行网站访问,就必须安装类似于ssl的相关证书。
https 通讯过程
下面先放一张图片,该图片能生动的解释https的通讯机理。
从上图可以看出如果想保证整个http中实现安全可靠传输,就需要用道https (Hypertext Transfer Protocol Secure),如果上述已经详细的描述了整个https协议的传输过程:
- 浏览器从服务器获取证书,证书中包含了公钥。
- 浏览器解析公钥,合法后使用公钥生成key,不合法就报警。
- 使用公钥对key进行加密,然后传输到服务器上去。
- 服务器使用私钥对传输的数据解密,并获取到key。
- 服务器获得key后对数据内容进行加密。
- 浏览器端之前生成的key来解密数据,这样就实现了整个传输过程安全且稳定。
图片素材是小猿从网上扒取,如有侵犯请及时在播客下面留言。
ssl证书获取及安装
通常,ssl证书颁发之前必须先申请域名并备案,完成前面的工作后,就可在华为云或者其他运营商处购买相关证书,证书卖完后就可下载,当然证书获取的方式多种多样,也有免费的证书可以申请,就看实际需求。
ssl证书下载
这次由于是用的华为云的安装组件,直接下载
下载后有若干个版本的证书,只需要选择nginx版本的。
ssl安装模式的选择
小猿的项目结构在典型传统项目部署实战文章中阐述的很清楚,小猿在此就不做过多的解释,当下面对小猿的项目结构有以下几种ssl安装模式可以供小猿参考:
-
代理和web容器之间采用加密传输
-
浏览器和代理之间采用加密传输
3. 代理和web容器之间、 浏览器和代理之间均采用加密传输
第一种不太可取,因为浏览器和代理服务器之间的通讯信息安全问题频繁发生的高发区,俗话说,拒敌于千里之外就是说的这个道理。
第三种方式的话比较复杂,配置比较麻烦,如果没有对安全有苛刻要求的应用场景,可以选择第三种,且每次加密解密操作可能会有一定的性能损耗,所以要综合考虑。
综合来看,第二种是最为合理的安全传输方式,围绕第二种模式,小猿开始展开以下工作。
证书上传
将下载好的证书上传至nginx服务器,若没有ssl证书放置文件夹,先建立ssl证书放置文件夹。
mkdir /usr/local/nginx/cert
上传文件
rz
测试ssl证书
先直接配置主页面代理服务器上,看nginx是否接配置成功
server {
listen 80;
server_name xxx.com www.xxx.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
server {
#listen 80;
listen 443 ssl; #配置HTTPS的默认访问端口为443。如果在此处未配置HTTPS的默认访问端口,可能会导致Nginx无法启动。
server_name xxx.com www.xxx.com;
ssl_certificate cert/server.crt; #替换成您的证书文件的路径。
ssl_certificate_key cert/server.key; #替换成您的私钥文件的路径。
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM; #加密套件。
ssl_prefer_server_ciphers on;
#server_name xxx.com www.xxx.com;
if ( $host = 'xxx.com'){
rewrite ^(.*)$ https://www.xxx.com$1 permanent;
}
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /mnt/sdc/apps/wlhy-platform/wlhy-site/;
index index.html index.htm;
}
location ~ /xxx-js/ {
root /mnt/sdc/apps/;
#autoindex on;
}
}
验证证书
需要输入下面的命令来验证准确性
./sbin/nginx -t
证书测试完毕,没有任何问题
配置全部的代理服务器
由于项目结构,需要http和https同时运行,故需要在项目中配置http和https同时运作,具体的项目配置见下面配置
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
error_log /dev/null;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
access_log off;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
client_max_body_size 100m;
client_header_buffer_size 512k;
large_client_header_buffers 4 512k;
underscores_in_headers on;
gzip on;
proxy_hide_header X-Powered-By;
proxy_hide_header Server;
server_tokens off;
upstream tomcat71 {
server 127.0.0.1:18081;
}
upstream tomcat72 {
server 127.0.0.1:18082;
}
upstream tomcat73 {
server 127.0.0.1:18083;
}
server {
listen 80;
server_name xxx.com www.xxx.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
server {
#listen 80;
listen 443 ssl; #配置HTTPS的默认访问端口为443。如果在此处未配置HTTPS的默认访问端口,可能会导致Nginx无法启动。
server_name xxx.com www.xxx.com;
ssl_certificate cert/server.crt; #替换成您的证书文件的路径。
ssl_certificate_key cert/server.key; #替换成您的私钥文件的路径。
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM; #加密套件。
ssl_prefer_server_ciphers on;
#server_name xxx.com www.xxx.com;
if ( $host = 'xxx.com'){
rewrite ^(.*)$ https://www.xxx.com$1 permanent;
}
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /mnt/sdc/apps/wlhy-platform/wlhy-site/;
index index.html index.htm;
}
location ~ /vvise-js/ {
root /mnt/sdc/apps/;
#autoindex on;
}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
server {
listen 80;
server_name pt.xxx.com;
#charset koi8-r;
#access_log logs/host.access.log main;
# rewrite ^(.*)$ https://$host$1 permanent;
add_header backendIP $upstream_addr;
add_header backendCode $upstream_status;
location / {
root html;
index index.html index.htm;
proxy_pass http://tomcat71;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
client_max_body_size 100m;
client_body_buffer_size 128k;
client_body_in_file_only clean;
proxy_read_timeout 600;
proxy_send_timeout 600;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name fh.xxx.com;
#charset koi8-r;
#access_log logs/host.access.log main;
# rewrite ^(.*)$ https://$host$1 permanent;
add_header backendIP $upstream_addr;
add_header backendCode $upstream_status;
location / {
root html;
index index.html index.htm;
proxy_pass http://tomcat72;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
client_max_body_size 100m;
client_body_buffer_size 128k;
client_body_in_file_only clean;
proxy_read_timeout 600;
proxy_send_timeout 600;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name cy.xxx.com;
#charset koi8-r;
#access_log logs/host.access.log main;
#rewrite ^(.*)$ https://$host$1 permanent;
add_header backendIP $upstream_addr;
add_header backendCode $upstream_status;
location / {
root html;
index index.html index.htm;
proxy_pass http://tomcat73;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
client_max_body_size 100m;
client_body_buffer_size 128k;
client_body_in_file_only clean;
proxy_read_timeout 600;
proxy_send_timeout 600;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
#listen 80;
listen 443 ssl; #配置HTTPS的默认访问端口为443。如果在此处未配置HTTPS的默认访问端口,可能会导致Nginx无法启动。
server_name pt.xxx.com;
ssl_certificate cert/server.crt; #替换成您的证书文件的路径。
ssl_certificate_key cert/server.key; #替换成您的私钥文件的路径。
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM; #加密套件。
ssl_prefer_server_ciphers on;
#server_name xxx.com www.xxx.com;
#charset koi8-r;
#access_log logs/host.access.log main;
add_header backendIP $upstream_addr;
add_header backendCode $upstream_status;
location / {
root html;
index index.html index.htm;
proxy_pass http://tomcat71;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
client_max_body_size 100m;
client_body_buffer_size 128k;
client_body_in_file_only clean;
proxy_read_timeout 600;
proxy_send_timeout 600;
}
}
server {
#listen 80;
listen 443 ssl; #配置HTTPS的默认访问端口为443。如果在此处未配置HTTPS的默认访问端口,可能会导致Nginx无法启动。
server_name fh.xxx.com;
ssl_certificate cert/server.crt; #替换成您的证书文件的路径。
ssl_certificate_key cert/server.key; #替换成您的私钥文件的路径。
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM; #加密套件。
ssl_prefer_server_ciphers on;
#server_name xxx.com www.xxx.com;
#charset koi8-r;
#access_log logs/host.access.log main;
add_header backendIP $upstream_addr;
add_header backendCode $upstream_status;
location / {
root html;
index index.html index.htm;
proxy_pass http://tomcat72;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
client_max_body_size 100m;
client_body_buffer_size 128k;
client_body_in_file_only clean;
proxy_read_timeout 600;
proxy_send_timeout 600;
}
}
server {
#listen 80;
listen 443 ssl; #配置HTTPS的默认访问端口为443。如果在此处未配置HTTPS的默认访问端口,可能会导致Nginx无法启动。
server_name cy.xxx.com;
ssl_certificate cert/server.crt; #替换成您的证书文件的路径。
ssl_certificate_key cert/server.key; #替换成您的私钥文件的路径。
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM; #加密套件。
ssl_prefer_server_ciphers on;
#server_name xxx.com www.xxx.com;
#charset koi8-r;
#access_log logs/host.access.log main;
add_header backendIP $upstream_addr;
add_header backendCode $upstream_status;
location / {
root html;
index index.html index.htm;
proxy_pass http://tomcat73;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
client_max_body_size 100m;
client_body_buffer_size 128k;
client_body_in_file_only clean;
proxy_read_timeout 600;
proxy_send_timeout 600;
}
}
}
上述过程中xxx代表项目域名的主要部分,具体的需要具体场景具体应用。
nginx相关项目配置完成后,我们需要在项目的js接口中去处理一些地址这些问题,否则项目访问可能会出现各种奇怪的问题。
修改项目js等相关地址接口
经过上述修改,基本上nginx的证书就安装成功了,网站访问一切正常。