HTTPS 是以安全为目标的 HTTP 通道,即 HTTP 下加入 SSL 加密层。HTTPS 不一样于 HTTP 的端口,HTTP默认端口为80,HTTPS默认端口为443。php
SSL 证书是一种数字证书,它使用 Secure Socket Layer
协议在浏览器和 Web 服务器之间创建一条安全通道,从而实现:css
正式使用的话确定是付钱由CA机构给颁发合法证书;部分CA机构也提供免费证书。html
可申请的CA机构举例:
一、阿里云
二、StartSSL前端
具体申请步骤请自行查阅。nginx
内部使用能够本身生成SSL证书(这个用户访问会提示证书无效或过时,存在安全隐患等等,内部人用直接信任继续访问便可使用),通常状况下用不到。segmentfault
内部生成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
,名字能够根据本身须要在生成的时候进行修改。服务器
以nginx服务器示例。咱们只须要在本身网站的配置文件nginx.conf中的server端增长如下配置;dom
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。
一、图解https协议 - - 博客频道 - CSDN.NET
http://blog.csdn.net/yufaw/article/details/8515889
二、https 页面中引入 http 资源的解决方式 - 大前端 - SegmentFault
https://segmentfault.com/a/1190000004200361?utm_source=Weibo