2016年10月20日 星期四

在全新的 Tomcat 8 設定 HTTPS

前面的文章成功在 Apache2 設定 HTTPS 之後,接著要在 Tomcat 8 上也設定 HTTPS。
環境一樣是要用全新的 Tomcat,因此流程也會包含環境建置。
而金鑰跟憑證的部份跟前面一樣,由 Godaddy 給予的兩個檔案:fe461f1ba212ab7.crt 和 gd_bundle-g2-g1.crt
以及事先產生好的金鑰檔 my-private-key.key。

    安裝 Tomcat 8 環境

    首先要先安裝 Tomcat 8,安裝之前當然也需要 Java 8 執行環境
    由於 Ubuntu 14.04 官方的 APT 伺服器並未提供 Java 8 的執行環境,因此需要加入 OpenJDK 的 Repository [1]。

    add-apt-repository ppa:openjdk-r/ppa && apt-get update && apt-get install openjdk-8-jre
    

    Java 環境安裝好以後,接著就是下載 Tomcat 8 了。

    cd ~
    wget http://www-us.apache.org/dist/tomcat/tomcat-8/v8.5.6/bin/apache-tomcat-8.5.6.tar.gz
    tar -zxvf ./apache-tomcat-8.5.6.tar.gz
    

    到這裡基礎的 Tomcat 環境就完成了。

    製作 Keystore

    在設定 Tomcat 之前,要先準備好讓 Tomcat 使用的 Keystore。
    不過需要注意的是,Tomcat 只有在要使用 NIO/NIO2 的時候,才是使用 Keystore
    如果是使用 APR 的話,並不需要特地把金鑰和憑證打包成 Keystore,因為 APR 是直接使用 OpenSSL 的。

    準備 Keystore 的流程,其實是整個設定過程中最困難的地方
    因為 Godaddy 給的憑證有包含中繼憑證(intermediate certificate)
    一般正常打包 Keystore 時,都是直接打包自己網站的憑證跟金鑰,但在某些狀況下客戶端就會回報說憑證無法被驗證
    以 Java 來說,就是會噴 javax.net.ssl.SSLHandshakeException 的錯誤
    底下會有「PKIX path building failed Error」的錯誤訊息
    這就是因為中繼憑證沒有被包在憑證裡,所以客戶端無法正確地驗證憑證。

    而在實驗的過程中,看了包括 Tomcat 官方文件 [2] 以及 Godaddy 官方文件 [3] 以及其他各種文章 [4-5]
    其實看來看去步驟都大同小異,就是透過一連串的 import 指令,把憑證一一放進 keystore 裡
    但實務上在我的實驗中,最後透過 [7] 做憑證驗證時,結果都會說憑證內不包含中繼憑證。

    最後成功的關鍵文章是 Stackoverflow 上的 [6] 這篇討論
    跟 [2-3] 的作法的不同之處在於,[6] 是一開始先建立 PKCS12 的檔案時
    就先把自己的憑證以及中繼憑證一起放進 Keystore 裡
    而不是事後透過 import 指令放入第二、第三個 Entry 到 Keystore 裡。
    總結來說,最後成功的指令如下:

    openssl pkcs12 -export -in fe461f1ba212ab7.crt -inkey my-private-key.key -out my-key-and-crt.p12 -certfile gd_bundle-g2-g1.crt
    keytool -importkeystore -alias 1 -destkeystore tomcat.keystore -srckeystore my-key-and-crt.p12 -srcstoretype pkcs12

    其中,上述的第一行指令,-in 是 Godaddy 發給我的憑證、-inkey 是我的金鑰、-certfile 則是 Godaddy 給的中繼憑證
    指令執行時會陸續問金鑰的密碼、以及產生的 PKCS12 檔要用的密碼。
    接著第二行指令,-alias 指的是在第一行指令產生的 PKCS12 檔內的 Entry 名稱
    因為第一行指令中沒有指定名稱,因此會自動給數字 1。
    -destkeystore 是最後要輸出的 Keystore 檔案名稱、-srckeystore 則是剛剛產生的 PKCS12 檔
    執行時同樣也會先問要產生的 Keystore 檔案的密碼,以及輸入的 PKCS12 檔的密碼。

    設定 Tomcat

    萬事具備之後,就只剩下設定 Tomcat 了!
    Tomcat 設定其實蠻簡單的,只要編輯 conf/server.xml 這個檔案即可。
    這裡假設要用的是 NIO,因此要先拿掉 org.apache.coyote.http11.Http11NioProtocol 這段 Connector 的註解
    同時我這裡也把 port 改為 443。

    <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
        maxThreads="150"
        scheme="https" secure="true" SSLEnabled="true"
        keystoreFile="/home/ubuntu/tomcat.keystore" keystorePass="mykeystorepass" sslProtocol="TLS"
        SSLProtocol="TLSv1+TLSv1.1+TLSv1.2">
    </Connector>
    

    然後就打開 Tomcat 吧!

    sudo /home/ubuntu/apache-tomcat-8.5.6/bin/catalina.sh start

    如果正常打開 Tomcat 了,可以利用 [7] 的工具去檢驗 SSL 的安裝狀況。

    參考資料
    1. How to Install OpenJDK 8 in Ubuntu 14.04 & 12.04 LTS
    2. Apache Tomcat 8 - SSL/TLS Configuration HOW-TO
    3. Tomcat: Generate CSRs and install certificates
    4. Importing the private-key/public-certificate pair in the Java KeyStore
    5. Tomcat SSL Installation Instructions
    6. tomcat doesn't deliver intermediate certificate (https)
    7. DigiCert® SSL Installation Diagnostics Tool

    沒有留言: