您的位置:首页 > 理论基础 > 计算机网络

网站使用https协议以及在nginx的配置

2017-12-01 17:55 761 查看


了解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 {
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网站 https 协议