现在很多网站都使用https进行加密通讯及对网络服务器身份的鉴定。这遍文章介绍怎么在Nginx web服务上设置自签名SSL证书。由于不是由权威机构发布的证书,它(自签名证书)不能确认网络服务器身份,但是它可以对通信进行加密。
自签名证书适合个人或公司内部使用,如果要对外提供web服务,最好购买权威机构发布的证书。在github上有一个项目叫Let’s Encrypt,可以使用它签发免费的证书,并且大多数web浏览器都信任它。
系统要求
安装LEMP(Linux, Nginx, MySQL, PHP)):http://www.linuxdiyf.com/linux/20461.html
如果你只使用Nginx,可以使用下面命令安装:
$ sudo apt-get update
$ sudo apt-get install nginx
创建SSL证书
我们可以创建一个目录用来存放所有SSL相关文件,在/etc/nginx下创建:
$ sudo mkdir /etc/nginx/ssl
创建 SSL密钥和证书文件:
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt
我们来看一看上面命令各个选项的意思:
openssl:这是创建和管理OpenSSL密钥、证书和其它文件的命令行工具
req:指定使用X.509证书签名要求(CSR)
-x509:创建自签名证书,而不生成签名请求
-nodes:证书不使用密码,我们需要Nginx能直接读取文件,在重启Nginx时,不用输入密码
-days 365::证书的有效时间,这里是一年
-newkey rsa:2048:同时生成一个新证书和新密钥,RSA密钥长度:2048位
-keyout:密钥生成的路径
-out:证书生成的路径
执行上面命令,需要回答一系列问题。其中,最重要的一个问题是Common Name (e.g. server FQDN or YOUR name),输入你的域名。如果没有域名的话,使用ip地址。
问题大似如下:
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:hainan
Locality Name (eg, city) []:sanya
Organization Name (eg, company) [Internet Widgits Pty Ltd]:topspeedsnail.
Organizational Unit Name (eg, section) []:topspeedsnail
Common Name (e.g. server FQDN or YOUR name) []:your_domain.com
Email Address []:admin@your_domain.com
配置Nginx使用SSL
修改server块(server block设置参考:http://blog.topspeedsnail.com/archives/232):
$ sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/your_domain.com
把your_domain.com替换为你的域名。
编辑your_domain.com:
$ sudo vim /etc/nginx/sites-available/your_domain.com
修改如下:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
listen 443 ssl;
root /usr/share/nginx/html;
index index.html index.htm;
server_name your_domain.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location / {
try_files $uri $uri/ =404;
}
}
创建链接:
$ sudo ln -s /etc/nginx/sites-available/your_domain.com /etc/nginx/sites-enabled/
删除默认的配置:
$ sudo rm /etc/nginx/sites-enabled/default
重启Nginx:
$ sudo service nginx restart
上面设置完成之后,nginx可以同时提供HTTP和HTTPS (SSL)请求。
测试
先使用HTTP访问:
http://server_domain_or_IP
使用HTTPS访问:
https://server_domain_or_IP
前面提到过,自签名的证书是不被浏览器信任的,需要手动添加信任;点击I Understand the Risks,会弹出一个对话框,添加信任即可。
中间部分显示,传输的数据是加密的。
如果你打算在对外网站上使用SSL,你应该购买权威的SSL证书,防止吓人的警告页面把用户吓跑。