准备知识
SSL/TLS:这两个分别是Secure Socket Layer(安全套接字层),Transport Layer Security(传输层安全)的缩写。TLS是SSL的继承者,如果不是搞安全的专业人员,完全可以认为他们是一样的东西。
关于这两者的差异可以参考https://kb.cnblogs.com/page/197396/
key:因为SSL/TLS使用非对称加密算法进行认证,所以会有一对公钥、私钥。这里我们说的key通常指的是私钥。
它长这个样子
csr: Certificate Signing Request,即证书签名请求。这个文件是我们在申请数字证书的过程中使用CSP(Cryptographic Service Provider,加密服务提供程序)生成私钥的时候一起生成的。
它一般张这样:
crt:Certificate的缩写,这就是我们想要的证书。我们只要把CSR文件提交给证书颁发机构(CA)后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件,也就是颁发给用户的证书。
使用openssl自己颁发证书
openssl的命令详细说明可以参考http://linux.51yip.com/search/openssl
**1.**生成私钥
1 | openssl genrsa -out server.key -des3 -passout pass:123456 2048 |
生成2048位RSA私钥,并用DES3对称算法加密它,加密口令为123456,将生成的私钥输出到server.key文件中。
**2.**生成CSR请求
1 | openssl req -new -key server.key -out server.csr |
**3.**生成CA证书
1 | openssl req -new -x509 -key server.key -out ca.crt -days 3650 |
证书的认证者总是CA或者是CA指定的第三方,这里我们只是生成一个CA证书自己玩玩。
**4.**用CA证书给自己颁发一个证书
1 | openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt |
执行完成后server.crt就是我们要的证书了。
在Nginx中配置SSL证书
ngx_http_ssl_module模块的配置参考链接:https://nginx.org/en/docs/http/ngx_http_ssl_module.html
要在nginx中使用ssl需要在编译时安装ssl模块。可以用nginx -V
命令检查当前nginx安装的模块
如果没有安装过nginx,可以参考http://blog.csdn.net/holmofy/article/details/78639670
如果没有http_ssl_module,需要重新编译nginx源码。在执行./configuration
的时候加上该模块
1 | ./configure --prefix=/usr/local/nginx --with-http_ssl_module |
配置完成后用make && make install
命令重新编译安装nginx。
安装完成后在nginx.conf
文件中添加如下配置:
1 | server { |
添加配置后,就可以启动了。
如果启动的时候有类似于下面的报错信息,请检查证书和私钥文件路径有没有写错。
浏览器打开网站看看
这是因为我们的证书是我们自己颁发的,浏览器不信任自己颁发的证书,如果要信任该证书需要在Internet选项中添加信任的证书。自己颁发的证书玩玩就行,实际上我们并不会用自己颁发的证书。
使用免费的SSL证书
我们要向获得受信任的证书,我们的csr必须得交给受信任的CA签名才行。要想获取这样的证书也很简单,国内有很多CA代理,不过一般需要请毛爷爷帮忙才行。
用不起花钱的,也有免费的给你用:https://letsencrypt.org/
letsencrypt有很多第三方工具提供了向(sha)导(gua)式的证书生成工具,这里介绍一个zerossl
开始制作免费证书:
在网站上添加相应的文件,验证网站是受你管理。
证书申请成功,可以在nginx中配置证书了。
注意是配置最后生成的domain-crt.txt和domain-key.txt两个文件。而且这个证书的有效时间是90天,也就是说3个月后这个证书就过期了,到时候你可以用第一步生成的account-key.txt和domain-csr.txt再次申请。
除了这种方式手动申请,还有certbot提供的脚本自动申请:https://certbot.eff.org/,链接扔这了,你们自己玩吧。