单域名下多子域名同时认证HTTPS

参考:html

http://blog.csdn.net/wzj0808/article/details/53401101web

http://www.cnblogs.com/silin6/p/5931640.htmljson

前言:tomcat

在完成了上一篇博文以后安全

用Let's Encrypt实现Https(Windows环境+Tomcat+Java)

遇到了新问题,那就是一个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的办法吧,先放一放,之后须要了再研究吧

相关文章
相关标签/搜索