本件詳細介紹瞭如何經過幾個簡單步驟在 Tomcat 中配置 SSL/TLS 、使用 JDK 生成自簽名的證書,最終實如今應用中支持 HTTPS 協議。html
Tomcat 目前只能操做 JKS、PKCS十一、PKCS12 格式的密鑰存儲庫。JKS 是 Java 標準的「Java 密鑰存儲庫」格式,是經過 keytool 命令行工具建立的。該工具包含在 JDK 中。PKCS12 格式一種互聯網標準,能夠經過 OpenSSL 和 Microsoft 的 Key-Manager 來。apache
建立一個 keystore 文件保存服務器的私有密鑰和自簽名證書:瀏覽器
Windows:tomcat
"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA安全
UNIX:服務器
$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA工具
執行該命令後,首先會提示你提供 keystore 的密碼。Tomcat 默認使用的密碼是 changeit
(所有字母都小寫),固然你能夠指定一個自定義密碼(若是你願意)。一樣,你也須要將這個自定義密碼在 server.xml
配置文件內進行指定,稍後再予以詳述。性能
接下來會提示關於證書的通常信息,好比組織、聯繫人名稱,等等。當用戶試圖在你的應用中訪問一個安全頁面時,該信息會顯示給用戶,因此必定要確保所提供的信息與用戶所指望看到的內容保持一致。網站
最後,還須要輸入密鑰密碼(key password),這個密碼是這一證書(而不是存儲在同一密碼存儲庫文件中的其餘證書)的專有密碼。keytool 提示會告訴你,若是按下回車鍵,則自動使用密碼存儲庫 keystore 的密碼。固然,除了這個密碼,你也能夠自定義本身的密碼。若是選擇自定義密碼,那麼不要忘了在 server.xml
配置文件中指定這一密碼。加密
下面是詳細步驟:
C:\Users\admin>"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA 輸入密鑰庫口令: 再次輸入新口令: 您的名字與姓氏是什麼? [Unknown]: waylau 您的組織單位名稱是什麼? [Unknown]: waylau.com 您的組織名稱是什麼? [Unknown]: waylau.com 您所在的城市或區域名稱是什麼? [Unknown]: hangzhou 您所在的省/市/自治區名稱是什麼? [Unknown]: zhejiang 該單位的雙字母國家/地區代碼是什麼? [Unknown]: china CN=waylau, OU=waylau.com, O=waylau.com, L=hangzhou, ST=zhejiang, C=china是否正確 ? [否]: y 輸入 <tomcat> 的密鑰口令 (若是和密鑰庫口令相同, 按回車):
若是操做所有正常,咱們如今就會建立一個新的 JKS 密碼存儲庫,該密碼庫包含一個自簽名的證書。建立一個新的 JKS 密碼存儲庫,該密碼庫包含一個自簽名的證書。
該命令將在用戶的主目錄下建立一個新文件:.keystore
。
要想指定一個不一樣的位置或文件名,能夠在上述的 keytool 命令上添加 -keystore 參數,後跟到達 keystore 文件的完整路徑名。你還須要把這個新位置指定到 server.xml
配置文件上,見後文介紹。例如:
Windows:
"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA -keystore \path\to\my\keystore
Unix:
$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA
-keystore /path/to/my/keystore
取消對 Tomcat 安裝目錄下 /conf/server.xml
中 「SSL HTTP/1.1 Connector」 一項的註釋狀態,並制定 keystore 的路徑和密碼:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" keystoreFile="${user.home}/.keystore" keystorePass="changeit" clientAuth="false" sslProtocol="TLS" />
Tomcat 指定了 8443 端口爲 HTTPS 訪問端口。
首先,瀏覽器訪問沒有 HTTPS 支持的頁面,http://localhost:8080
接着,瀏覽器訪問 HTTPS 的頁面:https://localhost:8443/
當用戶首次訪問你站點上的安全頁面時,頁面一般會提供給他一個對話框,包含證書相關細節(好比組織及聯繫方式等),而且詢問他是否願意認可該證書爲有效證書,而後再進行下一步的事務。一些瀏覽器可能會提供一個選項,容許永遠認可給出的證書的有效性,這樣就不會在用戶每次訪問站點時打擾他們了。但有些瀏覽器不會提供這種選項。一旦用戶認可了證書的有效性,那麼在整個的瀏覽器會話期間,證書都被認爲是有效的。
火狐瀏覽器提示
此鏈接不受信任 您想使用 Firefox 安全鏈接至 localhost:8443,可是咱們沒法確認此鏈接是否安全。 一般,當您嘗試安全鏈接時,站點會出示受信任的憑據,以證實您訪問的是正確的位置。然而如今,此網站的身份沒法覈實。 怎麼辦? 若是您過去曾鏈接到此網站且沒有遇到該問題,那麼此錯誤表示可能有人試圖冒充該網站,所以您應該中止瀏覽。 localhost:8443 使用了無效的安全證書。 該證書由於其自簽名而不被信任。 該證書僅對 waylau 有效。 (錯誤碼: sec_error_unknown_issuer) 若是您瞭解如今所發生的一切,您可讓 Firefox 開始信任此站點的憑據。即使您信任此站點,這個錯誤也可能代表有人試圖干涉您的鏈接。 不要隨便添加例外,除非您知道並認同該網站不使用受信任標識的理由。
而谷歌瀏覽器則提示以下:
雖然 SSL 協議的意圖是儘量有助於提供安全且高效的鏈接,但從性能角度來考慮,加密與解密是非茶館耗費計算資源的,所以將整個 Web 應用都運行在 SSL 協議下是徹底沒有必要的,開發者須要挑選須要安全鏈接的頁面。對於一個至關繁忙的網站來講,一般只會在特定頁面上使用 SSL 協議,也就是可能交換敏感信息的頁面,好比:登陸頁面、我的信息頁面、購物車結帳頁面(可能會輸入信用卡信息),等等。應用中的任何一個頁面均可以經過加密套接字來請求訪問,只需將頁面地址的前綴 http:
換成 https:
便可。