一、按openssl
1、下载
下载地址:https://www.openssl.org/source/old/1.0.2/
2、安装
# 解压
$ tar -zxvf openssl-1.1.1g.tar.gz
$ cd openssl-1.1.1g
# 添加openssl配置
$ ./config --prefix=/usr/local/openssl
# 更新配置
$ ./config -t
$ make depend
$ make install
# 切换目录
$ cd /usr/local
$ vi /etc/ld.so.conf
# 在/etc/ld.so.conf文件的最后面,添加如下内容:
/usr/local/openssl/lib
# 执行:
$ ldconfig
# 添加OPESSL的环境变量
$ vi /etc/profile
#看清楚你的openssl/bin在哪里
export OPENSSL=/usr/local/openssl/bin
export PATH=$OPENSSL:$PATH:$HOME/bin
# 刷新profile 生效
$ source /etc/profile
# 安装完毕,检查一下
$ ldd /usr/local/openssl/bin/openssl
3、yum安装openssl相关软件
[root@test nginx]¥ yum -y install openssl*
4、检测openssl是否安装
二、使用openssl创建https的ssl证书
链接:https://pan.baidu.com/s/1tj62l5wN4Id3TYJpgCQP_A
提取码:ta54
1、创建秘钥
[root@edge-02 srs]#openssl genrsa -des3 -out server.key 2048
注意:生成私钥,需要提供一个至少4位,最多1023位的密码。
2、生成CSR(证书签名请求)
[root@edge-02 srs]# openssl req -new -key server.key -out server.csr
说明:需要依次输入国家,地区,城市,组织,组织单位,Common Name和Email。其中Common Name,可以写自己的名字或者域名,如果要支持https,Common Name应该与域名保持一致,否则会引起浏览器警告。
可以将证书发送给证书颁发机构(CA),CA验证过请求者的身份之后,会出具签名证书,需要花钱。另外,如果只是内部或者测试需求,也可以使用OpenSSL实现自签名。
3、删除秘钥中的密码
[root@edge-02 srs]#openssl rsa -in server.key -out server.key
说明:如果不删除密码,在应用加载的时候会出现输入密码进行验证的情况,不方便自动化部署。
4、生成自签名证书
内部或者测试使用,只要忽略证书提醒就可以了。
[root@edge-02 srs]# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
5、生成pem格式的公钥
有些服务,需要有pem格式的证书才能正常加载,可以用下面的命令:
[root@edge-02 srs]# openssl x509 -in server.crt -out server.pem -outform PEM# 最终生成证书的文件
三、nginx配置ssl证书
1、将证书文件放到指定目录中
mkdir /etc/nginx/ssl/
cp /server.key /etc/nginx/ssl/
cp /server.pem /etc/nginx/ssl/
cp /server.crt /etc/nginx/ssl/
2、配置nginx
vi /etc/nginx/conf.d/admin-ui.conf
server {
listen 80; #侦听80端口
listen 443 ssl; #侦听443端口,用于SSL
server_name dpi.com; # 自己的域名
# 注意证书文件位置,是从/etc/nginx/下开始算起的
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#CDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
client_max_body_size 1024m;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 这里写的是我的腾讯云内网地址
proxy_pass http://xx.xx.xx.xx:8080;
}
}
server {
listen 80; #侦听80端口
listen 443 ssl; #侦听443端口,用于SSL
server_name dpi.test.com; # 自己的域名
# 注意证书文件位置,是从/etc/nginx/下开始算起的 #ssl_certificate /etc/nginx/ssl/server.pem;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
client_max_body_size 1024m; if($scheme = http){ return 301 https://$host$request_uri; }
location / {
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://xx.xx.xx.xx:8181;
}
location ~ /(code|manage|edge){
#root html;
#index index.html index.htm;
# OPTIONS预检命令,预检命令通过时才发送请求
# 检查请求的类型是不是预检命令
if ($request_method = 'OPTIONS'){
# 指定允许跨域的方法,*代表所有
add_header 'Access-Control-Allow-Methods' 'GET,POST,PUT,DELETE,OPTIONS';
# 预检命令的缓存,如果不缓存每次会发送两次请求
add_header 'Access-Control-Max-Age' 360000;
# 带cookie请求需要加上这个字段,并设置为true
add_header 'Access-Control-Allow-Credentials' 'true';
# 表示允许这个域跨域调用(客户端发送请求的域名和端口)
# $http_origin动态获取请求客户端请求的域 不用*的原因是带cookie的请求不支持*号
add_header 'Access-Control-Allow-Origin' $http_origin;
# 表示请求头的字段 动态获取
add_header 'Access-Control-Allow-Headers' $http_access_control_request_headers;
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
}
#配置多个域名,如dpi.test.com和dpi.com
#同时监听80和443端口,当使用http访问自动跳转到https,根据if($schema ==http)完成
#ssl_certificate配置证书路径
#ssl_certificate_key 配置key路径
3、重启nginx
nginx -s reload
4、访问效果