單域名下多子域名同時認證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的辦法吧,先放一放,之後須要了再研究吧

相關文章
相關標籤/搜索