https网站的搭建

  现在很多网站都需要从原先的http协议升级到https协议,最近对我们网站进行了升级改动,在此做下记录。

  若要使网站变成https协议首先需要申请SSL证书,由于我们网站较为依赖微信,所以我查看微信官网用的是GeoTrust的证书,所以我在网上找到了一家代理GeoTrust证书的网站(https://www.myssl.cn/)。在此网站购买了相应证书(由于我们有多个子域名,所以我们购买的是通配符域名证书)后在订单页可以下载CRT文件(私钥 *.key 文件会在购买的过程中提供下载,后续安装按照具体服务器情况可以参照 https://www.myssl.cn/ssl/install.html 。

tomcat安装

tomcat服务器上面需要一个 JKS文件,JKS(Java Keystore)文件是Tomcat用来管理和使用SSL证书的文件格式。将收到的server.crt和server.key文件,到JKS在线合成工具(https://www.myssl.cn/tools/merge-jks-cert.html)合成一个新的JKS文件,这里面有两个参数需要填写:1.别名:导入到JKS中的密钥对的索引名称(在tomcat的server.xml配置文件中需要用到),2.密码:访问JKS的密码,需要在Tomcat配置文件中写入。将合成的JKS文件放到tomcat目录下的conf文件夹下,也就是和server.xml同一个文件夹,放好之后修改server.xml配置如下:

<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="200"

  scheme="https" secure="true" SSLEnabled="true" clientAuth="false" sslProtocol="TLS"

  keystoreFile="/usr/apache-tomcat-7.0.67/conf/geotrustssl.jks" keystorePass="密码" />

tomcat相关配置设置好之后到java项目中在web.xml中加入以下代码(此段代码是设置http自动转为https)

<security-constraint>
  <web-resource-collection>
    <web-resource-name>securedapp</web-resource-name>
    <url-pattern>/*</url-pattern>
  </web-resource-collection>
  <user-data-constraint>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
  </user-data-constraint>
</security-constraint>

至此单服务器(无负载均衡)https相关所有配置都已完成。

 

tomcat+负载均衡 安装

若是使用阿里云的负载均衡则需要在阿里云负载均衡上面配置证书,不用生成JKS文件放到tomcat下面。

1.创建证书

 

 

证书内容:将包含中间证书的CRT文件内容全部复制并粘贴。

私钥:将 *.key文件复制并粘贴

 

2.部署证书

在“负载均衡”菜单点击“实例管理”,选择需要部署证书的实例,点击“管理”。选择“添加监听”:“前端协议”选择“HTTPS”:“443”,后端协议”选择“80”,“服务器证书”选择刚刚上传的服务器证书,在高级配置里面选择“SLB监听协议”,勾选了此选项后在request请求头里面可以通过X-Forwarded-Proto来获取前端协议是http还是https。

在负载均衡配置了证书后需要在web端配置http自动跳转https,java中我们是通过一个全局拦截器来拦截所有请求(详见下面代码),然后获取header中的X-Forwarded-Proto值,若此值为空或为http则将此请求转发到https请求(可以获取请求url然后修改http为https后做转发)

至于为什么不能用之前配置web.xml的方式来做是由于阿里云的负载均衡是将证书配置在前端,而后端请求到具体的服务器都是从80端口进入,所以后端服务器永远都是http协议,因此web.xml配置的方式会陷入死循环。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 重定向拦截
return filterRedirect(request, response);
}

/**
* 判断请求若是http则跳转到https
*/
private boolean filterRedirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
String scheme = request.getHeader("X-Forwarded-Proto")==null?request.getScheme():request.getHeader("X-Forwarded-Proto");
if(!scheme.equals("https")){
StringBuilder url = new StringBuilder();
url.append("https");
url.append(request.getRequestURL().substring(4));

String param = request.getQueryString();
if(StringUtils.isNotBlank(param)){
url.append("?").append(param);
}
response.sendRedirect(url.toString());
return false;
}

return true;
}

 

posted @ 2017-04-17 19:10  Zard_李  阅读(1872)  评论(0编辑  收藏  举报