之前在度娘搜索资料,无意间看到一些个人站点的博客都用了 https 协议,在浏览器地址栏中被标记为绿色的 "安全",前些天特地给自己负责的小项目升级成 https 协议,其优点这里不再赘述,小伙伴们可以自行百度,今天把整合部署分享在这里,希望小伙伴们少走弯路~
效果如下:
软件版本如下:
SSL 证书 Let's Encrypt 免费 SSL 证书
SystemCentos 6.5
NginxTengine/2.1.2 (nginx/1.6.2)
一,生成 SSL 证书
TomcatApache-tomcat-8.0.47
CDN Cloudflare.com
首先我们创建一个用来存放 letsencrypt 生成证书项目的路径并进入:
cd / usr / local / letsencrypt
接下来我们克隆 letsencrypt 项目:
git clone https://github.com/letsencrypt/letsencrypt
开始生成 SSL 证书:
. / letsencrypt - auto certonly--standalone--email test@qq.com - d www.test1.com - d www.test2.com--agree - tos
这里一定注意:
(1). 域名绑定在国内 DNS 服务器无法生成,需要先将 DNS 服务器切换到 DNS 服务商,例如 ClouldFlare,Godaddy,Dnsever 后才能正常生成!
(2). web 服务需要处于关闭状态,注意关闭 nginx 和 80 端口的占用!(不间断服务方式生成可以自行百度)
(3). -d 代表 domain 可以同时生成多个域名对应证书,生成后我们可以在默认目录中看到:
/etc/letsencrypt/live/www.test.com/
cert.pem(用户证书)
chain.pem(中间证书)
fullchain.pem(证书链)
privkey.pem(证书私钥)
最后我们生成 Perfect Forward Security(PFS)键值,具体作用可以自行百度:
二,Nginx 配置 SSL 证书及 Tomcat 代理
mkdir /etc/ssl/private/ -p
cd /etc/ssl/private/
openssl dhparam 2048 -out dhparam.pem
三,Tomcat 的 SSL 配置:
#Tomcat 8080端口
upstream tomcat_8080{
server 127.0.0.1:8080 weight=1;
}
#将所有http协议内容重定向到https协议
server {
listen 80;
server_name www.test.com;
rewrite ^ https://$server_name$request_uri? permanent;
}
#https协议
server {
listen 443;
server_name www.test.com;
# letsencrypt生成的文件
ssl on;
ssl_certificate /etc/letsencrypt/live/www.test.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.test.com/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets on;
ssl_dhparam /etc/ssl/private/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 一般推荐使用的ssl_ciphers值: https://wiki.mozilla.org/Security/Server_Side_TLS
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK';
ssl_prefer_server_ciphers on;
# 代理tomcat
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
proxy_pass http://tomcat_8080;
#proxy_redirect default;
}
access_log /home/wwwlogs/www.test.com_access.log;
error_log /home/wwwlogs/www.test.com_error.log;
}
1. Connector 节点将 redirectPort="8443" 修改为 redirectPort="443" proxyPort="443" 最终为:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" proxyPort="443" />
2. 找到 Engine 节点,在最后一个 Host 标签后加入:
四:CloudFlare CDN 设置(这里很重要):
<Host name="www.test.com" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="x-forwarded-for"
remoteIpProxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto"/>
<Context docBase="/www/java/projectName" path="" crossContext="true" debug="3" privileged="true" reloadable="false" deubt="true" />
</Host>
我们将域名解析到自己服务器后,点击 Crypto 选项卡,将 SSL 状态修改为 Full(strict) 模式,在这种模式下会使用你服务器中的 ssl 证书,否则会导致页面无限 301 跳转,导致 chrome 提示重定向次数过多,请求失败!
五:参考文献:
1. Nginx+SSL 整合 http://blog.csdn.net/sheng119/article/details/72956717
2. Tomcat+SSL 整合 https://www.cnblogs.com/zhanghaoh/p/5293158.html
3. 解决 CloudFlare CDN 无限 301 重定向问题 答案在 9 楼 https://www.v2ex.com/t/188230#r_2026842
六:搜索引擎优化建议:
如果是外网项目,建议到百度站长平台,全站 HTTPS 协议申请,HTTPS 协议也在排名算法之一.
原 文: 开源中国社区
作 者:lu54977212
来源: https://sdk.cn/news/7994