อ้างอิง http://articles.slicehost.com/2007/9/27/ubuntu-feisty-apache-ssl-and-vhosts
บทนำ
การเชื่อมต่อไปยังเว็บไซต์ของคุณให้มีความปลอดภัยเป็นสิ่งที่จำเป็น โดยเฉพาะเมื่อมีการป้อนรหัสผ่านหรือเมื่อเป็นการเข้าสู่ส่วนบริหารจัดการ (administration areas)
บทความนี้จะช่วยคุณในการสร้าง self-signed certificate และการคอนฟิก virtual host ด้วยการใช้ https connection (พอร์ต 443)
Non commercial
ก่อนอื่นเราจะมาดูในส่วนของ self-singed certificates ซึ่งจะสร้างคำเตือนเมื่อมีการแอกเซสผ่าน https link
Self-singed certificates ไม่เหมาะสมสำหรับ commercial site หรือ public facing site ใด ๆ แต่จะดีมากสำหรับส่วนบริหารจัดการส่วนบุคคล (Personal admistration areas)
There are many sites that specialise in issuing recognised and guaranteed certificates. A search for 'ssl certificates' in your favourite search engine will provide many links.
SSL Directory
เราสามารถที่จะวาง certificate ที่ถูกสร้างขึ้นไว้ที่ใดก็ได ้แต่ผมมักชอบเก็บไว้ในโฟลเดอร์ที่ชื่อ /etc/apache2/ssl ซึ่งต้องสร้างก่อนดังนี้ :
sudo mkdir /etc/apche2/ssl
Certificate
การสร้าง self-signed certificates มีสองวิธี สำหรับวิธีที่จะถูกใช้ในที่นี้เป็นการสร้าง single file และไม่ต้องการ passphase ในตอน reboot หรือ apache restart
เริ่มต้นให้ป้อนคำสั่งต่อไปนี้ :
sudo openssl req -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
แล้วจะได้ initial output ดังนี้ :
Generating a 1024 bit RSA private key
..........++++++
.............................................................................................++++++
writing new private key to '/etc/apache2/ssl/apache.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
ดังที่แสดง คุณจะถูกถามด้วยลำดับของคำถามดังต่อไปนี้ :
Country
Country Name (2 letter code) [AU]:
ในกรณีของผมป้อนเป็นประเทศไทย (TH)
State
State or Province Name (full name) [Some-State]:
คุณสามารถปล่อยว่างได้ แต่ในมี่นี้ผมใช้เป็นจังหวัด Songkhla
City
Locality Name (eg, city) []:
เช่นกัน คุณสามารถปล่อยว่างถ้าคุณไม่ต้องการ แต่สำหรับผมป้อนชื่อเมืองเป็น Hatyai
Organization
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
ผมใช้ชื่อบริษัทหลอก ๆ ว่า ITWizard Co Ltd.
Unit
Organizational Unit Name (eg, section) []:
ป้อนตามความเป็นจริงนะครับ แต่ผมใช้ IT
Name
Common Name (eg, YOUR name) []:
ป้อน domain address ของคุณ ซึ่งอาจจะเป็น admin.domain.com โดยให้ใช้เฉพาะค่าที่เป็น URL หรือ IP Address สำหรับผมใช้ www.itwizard.info เป็นตัวอย่าง
Email
Email Address []:
ถ้าคุณต้องการให้ email address ถูกแสดงผลบน certificate ก็ให้ป้อนเข้าไป ถ้าคุณจะใช้ self-signed certificate สำหรับ public facing site ก็ขอแนะนำให้ป้อน address ที่สมบูรณ์ของบุคคลที่ใช้สำหรับการติดต่อ (person to contact)
ในที่นี้ผมใช้ [email protected]
Done
You will be placed back at the command prompt and the certificate has been placed, as directed, in /etc/apache2/ssl/apache.pem.
mod_ssl
มาถึงตอนนี้ เราก็มี certificate ที่จำเป็นต้อง enable Apache mod_ssl ด้วยคำสั่ง :
sudo a2enmod ssl
แล้วทำการ reload apache ด้วยคำสั่ง :
sudo /etc/init.d/apache2 force-reload
ports.conf
ถัดไป ให้ทำการคอนฟิก apache ทำการเปิดรับ (listen) การทำงานที่พอร์ต 443 (the default https port) ด้วยคำสั่ง :
sudo nano /etc/apache2/ports.conf
ให้มีค่าดังนี้ :
Listen 80
Listen 443
หรือ
Listen 80
<IfModule mod_ssl.c>
Listen 443
</IfModule>
Virtual Hosts
ต่อไปเราจะต้องทำการคอนฟิก Virtual Host เพื่อ enable secure connection
จงจำไว้ว่า คุณสามารถมี cerfiticate อันเดียวเท่านั้นต่อ IP Address ซึ่งหมายความว่าถ้าคุณ enable SSL connection มากกว่า 1 virtual host จะเป็นการ แชร์ cerfiticate อันเดียวกัน
ถ้าคุณมี IP Address หลาย IP สำหรับ Site ของคุณ คุณก็ควรจะคอนฟิก virtual host เป็นแบบ IP-base โดยไม่จำเป็นต้องใช้ named-base
เริ่มต้นด้วยการ enable port 443 บน default virtual host
sudo nano /etc/apache2/sites-available/default
โดยส่วนบนของไฟล์จะเป็นดังนี้ :
NameVirtualHost *
<VirtualHost *>
...
ให้ทำการเปลี่ยนแปลงค่าให้มีการ listen พอร์ตที่เป็น default http port (80) ดังนี้ :
NameVirtualHost *:80
<VirtualHost *:80>
...
และเพื่อให้สนับพอร์ต 443 ให้เพิ่มข้อความ 'NameVirtualHost *:443' เป็นดังนี้ :
NameVirtualHost *:80
NameVirtualHost *:443
<VirtualHost *:80>
...
มาถึงตอนนี้ default virtual host จะมีการ listen ทั้งพอร์ต 80 และ 443 แต่ตอนนี้เราได้เซ็ตเฉพาะพอร์ต 80 เท่านั้น ซึ่งหมายถึงมันยังไม่สามารถเชื่อมต่อกับพอร์ต 443 ได้
ให้เราปรับแก้ให้ถูกต้องด้วยการสำเนาการเซ็ตค่าของ <VirtualHost *:80> ต่อไปนี้ :
<VirtualHost *:80>
...
...
</VirtualHost>
แล้วไป paste ที่ส่วนล่างของไฟล์ด้วยการเปลี่ยนพอร์ตเป็น *:443 ดังนี้ :
<VirtualHost *:443>
...
...
</VirtualHost>
และให้เพิ่มสองบรรทัดต่อไปนี้ เอาไว้ภายในบล็อกดังกล่าว
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.pem
Other virtual hosts
จำไว้ว่าการเปลี่ยนค่า <VirtualHost *> ไปเป็น <VirtualHost *:80> ใน default virtual host file จำเป็นต้องเหมือนกับ virtual host file อื่น ๆ
และการเพิ่ม SSL support สำหรับ virtual host อื่น ๆ ทำได้ด้วยการทำซ้ำขั้นตอนที่ผ่านมา และจะมีสองคอนฟิกในแต่ละไฟล์ นั่นคืออันหนึ่งเป็นของพอร์ต 80 และอีกอันเป็นของพอร์ต 443 และจงจำไว้ว่าคอนฟิกของ virtual host ใดๆ จะแช์ certificate อันเดียวกัน
คุณไม่จำเป็นต้องเซ็ต NameVirtualHost ในแต่ละไฟล์ ให้เซ็ตเฉพาะใน default file เท่านั้น
Reload
มาถึงตอนนี้ก็ให้ reload apache ด้วยคำสั่ง :
sudo /etc/init.d/apache2 force-reload
การใช้งาน
ให้เรียกเป็น https เช่น https://mail.itwizard.info
จบครับ
