การคอนฟิก SSL บน Ubuntu

อ้างอิง 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

จบครับ