Tomcat: setting SSL

การ setting SSL บน Tomcat สามารถทำได้ 2 แบบ คือ โดย JSSE กับ APR ซึ่ง APR จะใช้ OpenSSL เป็น engine ซึ่งมีความเป็น standard มากกว่า ไม่ติดว่าจะต้องเป็น Java เท่านั้น แต่ทั้งนี้การใช้ APR จะต้องใช้คู่กับ certificate file หรือ CA (certification authority) และไฟล์นี้ได้จากการขอผ่านทาง VeriSign หรือเวปอื่นๆ ที่ทำหน้าที่นี้โดยเฉพาะ เพื่อแสดงตัวตนของ server

ในที่นี้เราจึงขอข้ามไปไม่กล่าวถึง (เนื่องจากก็ยังไม่เคยลองทำจริงๆ เหมือนกันฮับ) ดังนั้นเรามาลอง set สำหรับใช้กันเล่นๆ ดูก่อนละกันนะค่ะ โดยใช้ JSSE ซึ่งทำได้ไม่ยากเลย สำหรับ JSSE เราก็ใช้คู่กับไฟล์เหมือนกัน แต่เป็นไฟล์ที่เรียกกันว่า keystore ซึ่งสำหรับคนที่ใช้ java อยู่แล้วจะมี tool ที่มากับ java ที่ใช้ในการสร้างไฟล์นี้ โดยใช้คำสั่ง

%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA
จากนั้นใส่ password เป็น changeit (ซึ่งเป็น password default ที่ใช้กับ tomcat)

C:\Program Files\Java\jdk1.6.0_10\bin>keytool -genkey -alias tomcat -keyalg RSA
Enter keystore password:
Re-enter new password:
What is your first and last name?
[Unknown]:
What is the name of your organizational unit?
[Unknown]:
What is the name of your organization?
[Unknown]:
What is the name of your City or Locality?
[Unknown]:
What is the name of your State or Province?
[Unknown]:
What is the two-letter country code for this unit?
[Unknown]:
Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?
[no]: y

Enter key password for
(RETURN if same as keystore password):

ซึ่ง keytool จะทำการสร้างไฟล์ที่ชื่อ .keystore ไว้ที่ home directory ของเรา ในกรณีของ Windows มันก็จะสร้างไว้ที่ C:\Documents and Settings\username ซึ่ง Tomcat จะไปหาไฟล์ .keystore ที่ home directory โดย default ซึ่งเราไม่จำเป็นต้องกำหนดอะไรเพิ่มเติมอีก

หลังจากที่ได้ keystore มาแล้ว เราก็มาแก้ configuration ของ Tomcat เพื่อให้สามารถใช้ SSL ได้ โดยเพิ่ม config ในส่วนด้านล่างในไฟล์ conf\server.xml ซึ่งอยู่ใน Tomcat directory อีกที

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />

สำหรับกรณีที่เราต้องการวาง .keystore ไว้ที่อื่นที่ไม่ใช่ home directory จะต้องมีการกำหนดเพิ่ม keystoreFile และ keystorePass attribute เ้ข้าไป เช่น

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
keystoreFile=" E:\Program Files\Apache Software Foundation\Tomcat6.0\conf\.keystore"
keystorePass="changeit"
clientAuth="false" sslProtocol="TLS" />

*แต่เท่าที่ได้ลองทำดู ดูเหมือนใช้ไม่ได้ เหมือนกับ Tomcat ไม่ได้สนใจ keystoreFile กับ keystorePass เลย ไม่แน่ใจเหมือนกันว่าทำอะไรผิดหรือเปล่า ก็ลองทำดูนะค่ะ แล้วมาบอกกันบ้างก็จะดี อิอิ

เท่านี้ก็เป็นอันเสร็จในส่วนของ Tomcat แต่สำหรับ ตัว web application ซึ่งถ้่าเราอยากให้ web เราใช้ SSL จะต้องกำหนดไว้ใน web.xml ด้วย โดยกำหนด tag ไว้ (สำหรับใครที่ยังไม่่เข้าใจในการ set security constraint ของ web application แนะนำให้ลองหาหนังสือมาอ่านเอานะฮับ เพราะว่าเรื่องนี้เราต้องการเน้นเรื่องการ set บน Tomcat เท่านั้น)

</security-constraint>
...
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>



Reference:
Apache Tomcat 6.0 - SSL Configuration HOW-TO
Configuring Tomcat 6 For https (SSL) Page
Setting Up SSL on Tomcat In 3 Easy Steps