Prerequisite:
确保安装的nginx编译时带有ssl_module
正规的应该是到证书签发机构购买申请,我们在项目初期就自己利用OpenSSL生成证书,节约成本,缩短开发流程。
1、SSL证书生成
linux下openssl生成 签名的步骤:
x509证书一般用到三类文件:key 、csr 、crt
Key是私钥,通常是rsa算法。
Csr是证书请求文件,用于申请证书。在制作csr文件时,必须使用自己的私钥来签署,还可以设定一个秘钥。
Crt是CA认证后的证书文件,签署人用自己的key给你签署的凭证。、
(1)Key的生成
生成rsa私钥,des3算法,openssl格式,2048位强度的key。server.key是秘钥文件名,以下方法需要一个至少4位的密码:
openssl genrsa -out server.key 2048
下面的命令可以生成没有密码的key:
openssl rsa -in server.key -out server.key
(2)生成CA的crt
生成ca.crt文件用来签署下面的server.csr文件:
openssl req -new -x509 -key server.key -out ca.crt -days 3650
(3)生成csr文件
需要依次输入国家、地区、组织、email,最重要的时有一个common name,这里要求必须和域名吻合,否则会引发浏览器报警。
openssl req -new -key server.key -out server.csr
生成的csr文件交给CA签名后形成服务端自己的证书。
(4)crt生成
csr文件必须有CA的签名才可形成证书,可以将此文件发送到versign等机构由它验证,要交一大笔钱,所以这里我们就自己做CA。
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt
输入key的秘钥后,证书就生成了。
-CA选项指明用于被签名的csr证书,-CAkey选项指明用于签名的秘钥,-CAserial指明序列号文件,-CAcreateserial指明文件不存在时自动生成。
(5)证书合并
cat server.key server.crt > server.pem
2、nginx配置
比如我要代理80端口到https,修改nginx.conf配置如下:
注意修改红色部分为实际的证书文件放置的目录。
upstream sslServer{
server xxxxxxx:80;
}
server {
listen 443 ssl;
server_name localhost;
ssl on;
ssl_certificate /usr/local/nginx-inst/key/server.crt;
ssl_certificate_key /usr/local/nginx-inst/key/server.key;
ssl_session_timeout 5m;
#指定SSL服务器端支持的协议版本
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
#指定加密算法
#ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
#在使用SSLv3和TLS协议时指定服务器的加密算法要优先于客户端的加密算法
ssl_prefer_server_ciphers on;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://sslServer;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
重启nginx。
Chrome下访问直接点高级、继续访问即可。
Firefox下访问:
点击高级,添加例外:
确认安全例外即可: