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