一、生成证书
1.生成秘钥key,运行命令:
生成带密码的:
openssl genrsa -des3 -out server.key 2048
然后你就获得了一个server.key文件.
以后使用此文件(通过openssl提供的命令或API)可能经常回要求输入密码,如果想去除输入密码的步骤可以使用以下命令:
openssl rsa -in server.key -out server.key
生成不带密码的:
openssl genrsa -out server.key 2048
2.创建服务器证书的申请文件server.csr,运行:
openssl req -new -key server.key -out server.csr
注意:
输入如下:
Enter pass phrase for root.key: ← 输入前面创建的密码
Country Name (2 letter code) [AU]:CN ← 国家代号,中国输入CN
State or Province Name (full name) [Some-State]:Changsha← 省的全名,拼音
Locality Name (eg, city) []:Changsha ← 市的全名,拼音
Organization Name (eg, company) [Internet Widgits Pty Ltd]:humiaomuyun ← 公司英文名
Organizational Unit Name (eg, section) []: ← 可以不输入
Common Name (eg, YOUR name) []: ← 此时不输入
Email Address []:xialvli@163.com ← 电子邮箱,可随意填
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []: ← 可以不输入
An optional company name []: ← 可以不输入
3.创建CA证书:
openssl req -new -x509 -key server.key -out ca.crt -days 3650
其中Country Name填CN,Common Name填主机名也可以不填,如果不填浏览器会认为不安全.(例如你以后的url为https://abcd/xxxx…这里就可以填abcd),其他的都可以不填.
4.创建自当前日期起有效期为期十年的服务器证书server.crt:
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt
5.ls你的文件夹,可以看到一共生成了5个文件:
ca.crt ca.srl server.crt server.csr server.key
其中,server.crt和server.key就是你的nginx需要的证书文件.
二、修改配置
1.conf文件更改
打开你的nginx配置文件,搜索443找到https的配置,去掉这段代码的注释.
server {
listen 443;
server_name localhost;
ssl on;
ssl_certificate /test/server.crt;#配置证书全路径
ssl_certificate_key /test/keys/server.key;#配置秘钥全路径
#ssl_client_certificate ca.crt;#双向认证
#ssl_verify_client on; #双向认证
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
}
2.nginx 重载配置
nginx -s reload
如果配置不生效就 停掉nginx重新启动 。至此,nginx的https就可以使用了,默认443端口.
配置http自动跳转https
配置到这里如果没有意外的话已经可以通过https访问了,但可能很多用户还是会通过http访问,所以需要将你原来的http重定向到你的https上。
只需要在Nginx配置中加入下面配置:
rewrite ^ https:// h t t p h o s t http_host httphostrequest_uri? permanent;
但要注意的是,不是在你原来443端口下加,这样会死循环的,而是另外启个server,类似于下面的配置:
server {
listen 80;
server_name www.***.com;
rewrite ^ https://$http_host$request_uri? permanent; # force redirect http to https
#rewrite ^(.*)$ https://www.***.com permanent;
}
server {
listen 443;
server_name www.****.com; #填写绑定证书的域名
ssl on;
ssl_certificate /xxx/server.crt;
ssl_certificate_key /xxx/server.key;
#ssl_client_certificate /xxx/ca.crt;#双向认证
#ssl_verify_client on; #双向认证
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;
location / {
root html; #站点目录
index index.html index.htm;
}
}
这样就能实现重定向了。
如果想同时启用Http和Https,也可以这样配置:
server {
listen 80;
listen 443 ssl;
server_name www.***.com;
ssl_certificate www.***.com.crt;
ssl_certificate_key www.***.com.key;
...
}
总结
配置的时候还是需要仔细,跟着步骤来,人品好的话一次就能搞定啦。大家可以亲身试验下
server {
listen 8002;
rewrite ^(.*)$ https://testx.cloud.huawei.com permanent;
server_name testx.cloud.huawei.com;
}
server {
listen 443;
ssl_certificate /root/server.crt; #配置证书位置
ssl_certificate_key /root/server.key; #配置秘钥位置
#ssl_client_certificate /xxx/ca.crt;#双向认证
#ssl_verify_client on; #双向认证
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
ssl on;
gzip on;
gzip_min_length 1k;
gzip_comp_level 9;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
root /usr/share/nginx/html;
charset utf-8;
location / {
root html/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
}