單域名下多子域名同時認證HTTPS


參考:

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

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

前言:

在完成了上一篇博文之后

用Let's Encrypt實現Https(Windows環境+Tomcat+Java)

遇到了新問題,那就是一個Tomcat下配置了多個網站,結果由於在tomcat里配置了默認使用SSL認證,導致存放在同一tomcat里的項目,都要使用https,然而那些沒有https證書的項目就很尷尬了,比如:

在手機上訪問就更尷尬了,會蹦出來安全提示彈框,說該網站證書不安全,是否繼續訪問,點繼續才能訪問.

所以,配置多域名證書勢在必行

說個題外話:

(貌似)Tomcat下(一個IP)只能配置一個CA證書,多個的話會讓前面的失效

所以,那就得多個域名簽一個證書.

注意:這里的多個域名,我這里使用的是同一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的辦法吧,先放一放,以后需要了再研究吧

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM