参考:html
http://blog.csdn.net/wzj0808/article/details/53401101web
http://www.cnblogs.com/silin6/p/5931640.htmljson
前言:tomcat
在完成了上一篇博文以后安全
遇到了新问题,那就是一个Tomcat下配置了多个网站,结果因为在tomcat里配置了默认使用SSL认证,致使存放在同一tomcat里的项目,都要使用https,然而那些没有https证书的项目就很尴尬了,好比:app
在手机上访问就更尴尬了,会蹦出来安全提示弹框,说该网站证书不安全,是否继续访问,点继续才能访问.oop
因此,配置多域名证书势在必行post
说个题外话:
网站
(貌似)Tomcat下(一个IP)只能配置一个CA证书,多个的话会让前面的失效url
因此,那就得多个域名签一个证书.
注意:这里的多个域名,我这里使用的是同一host的,多个子域名,没试过不一样host的状况
下面开始正题
与前一篇博文略有不一样,主要是前9步,后续相同这里就再也不说了
1,用CMD进入命令窗口,跳转至letsencrypt客户端解压缩后的文件,输入letsencrypt.exe --san
2,接下来就是邮箱认证什么的,因为我以前认证过了,这里被跳过了,无法截图
3,这一步,按M
4,输入host名
注意:好比你要配置
a.xyz.com
b.xyz.com
那么这里就输入xyz.com,是不带子域名的
5,输入所有你想认证的子域名,用英文逗号隔开
6,**重点**
这里要的是未来存放验证的路径,这个认证会依次顺序访问第五步填写的子域名,而后请求一个路径(/.well-known/acme-challenge/+生成的随机码),验证经过了就下发证书
这里的路径存放全部要验证的网址的配置文件,与单域名不一样
我就存放在letsencrypt目录下
7,认证域名
单域名能够指定认证网址,好比:www.gutongxue.com/check/.well-known/acme-challenge/+生成的随机码
可是多域名认证的话,必须为根目录,就好比
www.gutongxue.com/.well-known/acme-challenge/+生成的随机码
student.gutongxue.com/.well-known/acme-challenge/+生成的随机码
因此写验证文件的时候就要作好准备了,另外文件存放的路径也不对了,因此我对验证的方法稍做修改,贴在下面了:
这个是SpringMVC的Java代码,其余的若有敬请自行编写,我并不会
@RequestMapping("/.well-known/acme-challenge/*") public ResponseEntity<String> check(HttpServletRequest request, HttpServletResponse response){ HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.set("Content-Type", "application/json;charset=UTF-8"); String result=""; try { String URI=request.getRequestURI(); URI=URI.split("/")[URI.split("/").length-1]; //文件路径填写大家上一步指定的路径+\.well-known\acme-challenge\ File file=new File("C:\\Users\\Administrator\\Desktop\\letsencrypt-win-simple.V1.9.1\\.well-known\\acme-challenge\\"+URI); InputStream is = new FileInputStream(file); // 设置response参数,能够打开下载页面 response.reset(); response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename="+ new String(("验证文件").getBytes(), "iso-8859-1")); ServletOutputStream out = response.getOutputStream(); BufferedInputStream bis = null; BufferedOutputStream bos = null; try { bis = new BufferedInputStream(is); bos = new BufferedOutputStream(out); byte[] buff = new byte[2048]; int bytesRead; // Simple read/write loop. while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead); } } catch (final IOException e) { throw e; } finally { if (bis != null) bis.close(); if (bos != null) bos.close(); } }catch (Exception e){ } return new ResponseEntity<String>(result, responseHeaders, HttpStatus.OK); }
记住,生成文件的路径是在这里:
每一个域名对应的项目都要放这么一段代码,如出一辙的就行,而后,没完
8,由于你看到了,认证文件的路径开头是.开头的(.well-known),有的时候可能认证程序不认识,无法经过,因此要写个文件mimeMap.xml,放在该项目的根目录下(我的建议是每一个项目都放,就1kb而已),根目录在JavaWeb项目里就是这:
内容是:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <staticContent> <mimeMap fileExtension="." mimeType="text/plain" /> </staticContent> </system.webServer> </configuration>
9,回到命令行,回车认证
10,与以前的博文第十步同样,后面也都同样,这里就再也不放了
后记:
目前尚未单Tomcat配多host的需求
之后有需求我再研究,若是大家遇到了这个状况,请搜索:
tomcat 实现多域名多IP多SSL证书
原理是在指定CA证书的时候,多添一个属性address,多配一个IP
但我以为应该还有一个CA证书配置多个host的办法吧,先放一放,之后须要了再研究吧