Ubuntu 設定 Apache + Tomcat + SSL 憑證

因為開發的網站牽涉到金流問題,因此必須使用https安全通道來傳送資料,原本主機上就有Apache Web Server走80 port,以及Apacha Tomcat走8080 port,但是當一遇到要走https後狀況就變複雜了,因為在Apache Web Server是443 port,而Tomcat是8443 port,原本使用ProxyPass將http 80 port轉到Tomcat 8080 port的方法似乎不能同理用在https上。解決方式是必須透過Apache VirtualHost的SSL設定,並使用ajp的方式轉換到Tomcat上。

1.安裝 OpenSSL
sudo apt-get install openssl

2.啟用SSL
sudo a2enmod ssl
(如果要停用 sudo a2dismod ssl)

3.安裝憑證
這一步驟先教大家產生自己的私人憑證,壞處是當你用https連線時,瀏覽器會出現警告訊息,這是因為憑證沒有經過第三方公司認證過,最好的作法就是去購買一個已經認證過的憑證或是使用StartSSL的免費憑證服務(https://www.startssl.com/),這部份可以參考(http://blog.mowd.tw/index.php?pl=950)
3.1.建立憑證目錄
sudo mkdir /etc/apache2/ssl
3.2.產生憑證
openssl req -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.key
(-days 後面的參數365是憑證的有效日期,可以依需要自行調整,-out 和 –keyout 是憑證和金鑰產出後要存放的路徑。)

4.修改虛擬主機設定
這一段是原本80 port透過ajp轉到tomcat的設定
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
ServerName 127.0.0.1
</VirtualHost>


這一段則是將https轉到tomcat的https且不用轉到tomcat:8443的port
<VirtualHost *:443>
SSLEngine on
#使用自己產生的憑證
SSLCertificateFile /etc/apache2/ssl/apache.pem
SSLCertificateKeyFile /etc/apache2/ssl/apache.key
#以下設定是使用StartSSL產生的檔案用
#SSLCertificateFile /etc/apache2/ssl/ssl.crt
#SSLCertificateKeyFile /etc/apache2/ssl/ssl.key
#SSLCertificateChainFile /etc/apache2/ssl/sub.class1.server.ca.pem
#SSLCACertificateFile /etc/apache2/ssl/ca.pem

ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
ServerName 127.0.0.1

</VirtualHost>

如此一來就可以同時使用http與https透過apache來轉址到tomcat上
5.重新啟動apache

[Grails]在Tomcat環境下使用ssl憑證配置

為了網站的訊息傳輸安全性,尤其是當涉及金流、線上刷卡的服務時,一般網站會使用加密的HTTP(也就是HTTPS)來傳輸資料,如此一來就可以防止中間人竊取資料,這篇文章簡單的介紹一下在Grails+Tomcat+Linux環境下,如何建立設定HTTPS的環境。

主要步驟如下:
1.產生憑證金鑰(.keystore)
2.複製金鑰到Tomcat目錄
3.設定Tomcat的server.xml
4.修改Grails應用程式的web.xml設定

以下詳細描述各步驟

1.產生憑證金鑰(.keystore)

因為是要給Tomcat使用的金鑰,所以這裡就使用Java內建的keytool工具
在命令列下輸入以下指令keytool -genkey”
然後跟著指示依序輸入以下資料:
輸入 keystore 密碼:
重新輸入新密碼:
您的名字與姓氏為何?
  [Unknown]:
您的編制單位名稱為何?
  [Unknown]:  
您的組織名稱為何?
  [Unknown]:
您所在的城市或地區名稱為何?
  [Unknown]: 
您所在的州及省份名稱為何?
  [Unknown]:  
該單位的二字國碼為何
  [Unknown]:
CN=Test, OU=Unknown , O=Unknown , L=Hsinchu, ST=Taiwan, C=Unknown 正確嗎?
  [否]:  Y

輸入 <mykey> 的主密碼
        (RETURN 如果和 keystore 密碼相同):
重新輸入新密碼:

其中比較重要的是密碼部分,這個密碼會在後面Tomcat設定時用到

2.複製金鑰到Tomcat目錄

完成上述步驟後,會產生.keystore檔案,將該檔案複製到tomcat/webapps目錄下

3.設定Tomcat的server.xml

開啟tomcatconfigserver.xml,將以下這段程式碼打開,並且加上keystoreFile與keystorePass兩個屬性後儲存即可,需要重新啟動tomcat才可以讓設定生效

<Connector port="8443″ protocol="HTTP/1.1″ SSLEnabled="true"
 maxThreads="150″  scheme="https" secure="true"
 clientAuth="false" sslProtocol="TLS" keystoreFile="webapps/.keystore"
 keystorePass="[密碼]" />

4.修改Grails應用程式的web.xml設定

要在Grails專案裡面設定web.xml,需先要執行grails install-templates指令,將web.xml取出後,手動設定安全連線的部份,執行指令後會在/src/templates/war/目錄下產生web.xml檔案,開啟該檔案後,新增以下設定資料:

<security-constraint>
<web-resource-collection>
<http-method>GET</http-method>
<http-method>POST</http-method>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>

之後產生war檔後deploy到tomcat就算完成了。

可以輸入以下網址驗證https是否成功
https://localhost:8443/PROJECT 或是輸入 http://localhost:8080/PROJECT

不過因為憑證是自己建立,所以第一次進到網站的使用者,都會出現以下畫面,必須要按同意繼續,才可以瀏覽網站,為了解決這問題可以透過購買憑證的方式來解決,這部份等試出在在與大家分享。

有興趣者,可以先考慮以下文章

[筆記] SSL 憑證購買記
添加 GoDaddy SSL 证书到你的网站