參考:
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的辦法吧,先放一放,以后需要了再研究吧