一、在阿里云中购买证书服务
在阿里云中购买证书服务,功能可以在阿里云的控制台中的“证书服务”中找到,由于是个人站点,我购买的是DV类型的证书。
OK,这里补充一下证书的几个类型,根据不通的业务类型使用不通的证书:
证书类型 | 使用范围 |
DV | 个人使用证书,能起到加密传输的作用,但无法向用户证明网站的真实身份。 |
OV | 企业使用证书,提供加密功能,对申请者做严格的身份审核验证,提供可信身份证明。 |
EV | 增强型证书,为目前企业最广泛使用的证书。金融证券、银行、第三方支付、网上商城等,重点强调网站安全、企业可信形象的网站,涉及交易支付、客户隐私信息和账号密码的传输。 |
当证书已经签发完成后,下载到本地,准备上传到服务器了。可以发现证书一共是2个文件,一个是pem,一个是key
二、web服务器结构
我的web服务器结构很简单,使用了典型的nginx+php+mysql。在开启https之前,需要将阿里云安全规则的443端口对外开放,否则无法使用https服务。
这里关键点在于Nginx的配置,首先,确保你在编译、安装nginx的时候加上了ssl模块,如果没有,就必须重新编译或者安装了。
//查看nginx是否支持ssl
bash-4.1# /usr/local/nginx_1.10.1/sbin/nginx -V
nginx version: nginx/1.10.1
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
configure arguments: --prefix=/usr/local/nginx_1.10.1 --user=www --group=www --with-pcre --with-http_gzip_static_module --with-http_realip_module --with-http_stub_status_module
//很遗憾,需要重新编译nginx,在编译的时候带上--with-http_ssl_module,--with-stream_ssl_module参数,否则ssl模块无法使用
重新编译后nginx后,我在nginx的目录下新建一个cert目录,将证书的key和pem文件复制到该目录下,并配置站点文件。
在server中添加ssl支持:
1)listen设置443端口,这个是https的默认端口
2)ssl_certificate和ssl_certificate_key设置为证书的路径
3)ssl_ciphers指令为ssl加密方式(可参考:
http://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_ciphers)
server {
listen 443;
server_name localhost;
ssl on;
root html;
index index.html index.htm;
ssl_certificate cert/xxx.pem;
ssl_certificate_key cert/xxx.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
listen 443;
server_name localhost;
ssl on;
root html;
index index.html index.htm;
ssl_certificate cert/xxx.pem;
ssl_certificate_key cert/xxx.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
配置完后,重启nginx,并测试https的访问。到目前为止,https已经部署完成,但是会发现https和http均可以访问。因此,我们需要在http做301跳转到https。
server {
listen 80;
server_name localhost;
rewrite ^/(.*)$ https://localhost.com permanent;
}
最后在线测试一下安全性,等级为F级,对于个人证书来说,已经是不错了。至于性能和更高的安全性优化,那是后话了。
附录:
一个在线的https安全性检测站点: