一:开始Nginx的SSL模块
1.1 Nginx如果未开启SSL模块,配置Https时提示错误
1
|
nginx: [emerg] the
"ssl"
parameter requires ngx_http_ssl_module
in
/usr/local/nginx/conf/nginx.conf:37
|
原因也很简单,nginx缺少http_ssl_module模块,编译安装的时候带上--with-http_ssl_module配置就行了,但是现在的情况是我的nginx已经安装过了,怎么添加模块,其实也很简单,往下看: 做个说明:我的nginx的安装目录是/usr/local/nginx这个目录,我的源码包在/usr/local/src/nginx-1.6.2目录
1.2 Nginx开启SSL模块
切换到源码包:
1
|
cd /usr/local/src/nginx-1.11.3
|
查看nginx原有的模块
1
|
/usr/local/nginx/sbin/nginx -V
|
在configure arguments:后面显示的原有的configure参数如下:
1
|
--prefix=/usr/local/nginx --with-http_stub_status_module
|
那么我们的新配置信息就应该这样写:
1
|
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
|
运行上面的命令即可,等配置完
配置完成后,运行命令
1
|
make
|
这里不要进行make install,否则就是覆盖安装
然后备份原有已安装好的nginx
1
|
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
|
然后将刚刚编译好的nginx覆盖掉原有的nginx(这个时候nginx要停止状态)
1
|
cp ./objs/nginx /usr/local/nginx/sbin/
|
然后启动nginx,仍可以通过命令查看是否已经加入成功
1
|
/usr/local/nginx/sbin/nginx -V
|
Nginx 配置Http和Https共存
1
2
3
4
5
6
7
8
9
|
server {
listen 80
default
backlog=2048;
listen 443 ssl;
server_name wosign.com;
root /
var
/www/html;
ssl_certificate /usr/local/Tengine/sslcrt/ wosign.com.crt;
ssl_certificate_key /usr/local/Tengine/sslcrt/ wosign.com .Key;
}
|
把ssl on;这行去掉,ssl写在443端口后面。这样http和https的链接都可以用
Nginx 配置SSL安全证书重启避免输入密码
可以用私钥来做这件事。生成一个解密的key文件,替代原来key文件。
1
|
openssl rsa -
in
server.key -
out
server.key.unsecure
|
Nginx SSL性能调优
1
2
3
4
5
|
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
ssl_prefer_server_ciphers
on
;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
|
=============================================================================
了解https
HTTPS 是以安全为目标的 HTTP 通道,即 HTTP 下加入 SSL 加密层。HTTPS 不同于 HTTP 的端口,HTTP默认端口为80,HTTPS默认端口为443。
SSL 证书是一种数字证书,它使用 Secure Socket Layer
协议在浏览器和 Web 服务器之间建立一条安全通道,从而实现:
- 数据信息在客户端和服务器之间的加密传输,保证双方传递信息的安全性,不可被第三方窃听;
- 用户可以通过服务器证书验证他所访问的网站是否真实可靠。
获取SSL证书
正式使用的话肯定是付钱由CA机构给颁发合法证书;部分CA机构也提供免费证书。
可申请的CA机构举例:
1、阿里云
2、StartSSL
具体申请步骤请自行查阅。
内部使用可以自己生成SSL证书(这个用户访问会提示证书无效或过期,存在安全隐患等等,内部人用直接信任继续访问即可使用),一般情况下用不到。
内部生成SSL证书步骤:
# 生成一个RSA密钥
$ openssl genrsa -des3 -out ssltest.key 1024
# 拷贝一个不需要输入密码的密钥文件
$ openssl rsa -in ssltest.key -out ssltest_nopass.key
# 生成一个证书请求
$ openssl req -new -key ssltest.key -out ssltest.csr
# 自己签发证书
$ openssl x509 -req -days 365 -in ssltest.csr -signkey ssltest.key -out ssltest.crt
第3步是生成证书请求,会提示输入省份、城市、域名信息等,重要的是,email一定要是你的域名后缀的。这样就有一个 csr
文件了,提交给 ssl 提供商的时候就是这个 csr
文件。
当然我这里并没有向证书提供商申请,而是在第4步自己签发了证书。到这里证书就生成成功到目标目录下,名字为ssltest.crt
,还有ssltest_nopass.key
,名字可以根据自己需要在生成的时候进行修改。
服务器启用https
以nginx服务器示例。我们只需要在自己网站的配置文件nginx.conf中的server端增加以下配置;
listen 443 ssl;
# ssl on;
ssl_certificate /etc/nginx/ssltest.crt;
ssl_certificate_key /etc/nginx/ssltest_nopass.key;
完整示例:
server {
listen 443 ssl;
listen 80;
server_name 52fhy.com www.52fhy.com;
index index.php index.html index.htm;
root /www/52fhy.com/;
#ssl on;
ssl_certificate_key /usr/local/nginx/conf/52fhy.com.key;
ssl_certificate /usr/local/nginx/conf/1_52fhy.com_bundle.crt;
if ($scheme = http) {
# rewrite ^(.*)$ https://$host$1 permanent;
}
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 1h;
}
access_log /usr/local/nginx/log/access/52fhy.com.log;
}
注意:这个
ssl on
我本来是加上的,但是发现这样http就不能访问了,去掉后且listen 443 ssl
能同时支持http和https。listen 443 ssl
表示仅443端口使用ssl。
重启之后网站就可以用https访问啦,同时还支持http访问。
常见问题
网页引入的站外资源加载不了
例如页面引入了百度地图的资源,打开控制台发现使用https后加载不了,直接block了。
原因是览器默认是不允许在 https 里面引用 http 资源的。
解决办法是将http://
改成相对协议//
。具体使用方法为:
<img src="//domain.com/img/logo.png">
简而言之,就是将URL的协议(http、https)去掉,只保留//
及后面的内容。这样,在使用https的网站中,浏览器会通过https
请求URL,否则就通过http
发送请求。
当然,如果站外链接的资源不支持https还是加载不了的。这时候可以采用其它方法,如使用 iframe,或者使用nginx方向代理将https转向http。
以下是使用腾讯用的证书和私钥在nginx.conf中的配置
server {
listen 443;
server_name xxx.com.cn;
ssl on;
ssl_certificate /usr/share/nginx/conf/1_xxx.com.cn_bundle.crt;
ssl_certificate_key /usr/share/nginx/conf/2_xxx.com.cn.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
include /etc/nginx/default.d/*.conf;
location /r/ {
rewrite ^/r/(.*) /$1 break;
proxy_pass http://localhost:8080;
}
location / {
root /data/ifmall/static/;
index index.html index.htm;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}