Apache2 + SSL

  1. ติดตั้ง Apache2 + OpenSSL
    # aptitude install apache2 openssl
    

    ผ่านขั้นตอนนี้ เราก็ได้ web server ที่คอยบริการ HTML ได้แล้ว แต่จุดประสงค์เรายังไม่ลุล่วง ต้องไปต่อ

  2. ตรวจสอบให้แน่ใจว่า port 443 จะทำงานเมื่อเปิดใช้งานมอดูล SSL ใน Apache2
    # cat /etc/apache2/ports.conf
    Listen 80
    <IfModule mod_ssl.c>
        Listen 443
    </IfModule>
    

    ถ้ามีไม่เหมือนในตัวอย่าง ให้เพิ่มเข้าไป ใน Apache2 รุ่นหลัง ๆ ใน Debian ตั้งค่าดังกล่าวเป็นค่าเริ่มต้นอยู่แล้ว

    หลังจากนั้นก็เปิดใช้งานมอดูล

    # a2enmod ssl
    Module ssl installed; run /etc/init.d/apache2 force-reload to enable.
    

    หลังจากนี้ ก็สั่งตามที่เขาบอก

    # /etc/init.d/apache2 force-reload
    
  3. สร้าง self-signed SSL Certificate (เขาบอกว่าใช้ทดสอบ .. แต่ของเราเอาใช้งานจริง)
    # cd /etc/apache2
    # openssl req -new -x509 -days 365 -nodes -out server.crt \
    -keyout server.key
    

    หลังจากนั้น จะมีหน้าจอขึ้นมาให้กรอกข้อมูล และในส่วนของ CommonName ให้กรอกชื่อ Host อย่างเช่น

    www.examples.com
    
  4. ตั้งค่า VirtualHost เพื่อให้สามารถใช้ https ได้
    # vi /etc/apache2/sites-available/default
    

    เปลี่ยนจาก

    NameVirtualHost *
    <VirtualHost *>
    

    เป็น

    NameVirtualHost *:80
    NameVirtualHost *:443
    <VirtualHost *:80>
    

    คัดลอกข้อความตามตัวอย่างข้างล่างนี้ และแปะไว้ล่างสุด

    <VirtualHost *:80>
              ServerAdmin webmaster@localhost
              ...
              ...
    </VirtualHost>
    

    แล้วแก้ไขเพิ่มเติมดังนี้

    <VirtualHost *:443>
              ServerAdmin webmaster@localhost
              ...
              ...
              SSLEngine on
              SSLCertificateFile /etc/apache2/server.crt
              SSLCertificateKeyFile /etc/apache2/server.key
    </VirtualHost>
    
  5. สั่ง reload Apache2
    # /etc/init.d/apache2 reload
    Reloading web server config... XXXX
    
  6. เข้า web browser และทำการทดสอบ
    https://[hostname]
    

    ถ้าทดสอบแล้ว ขึ้นหน้าต่างให้เลือกตอบตกลง และจะขึ้นรูปแม่กุญแจ ก็เป็นอันจบ ....

    Apache2 + SSL พร้อมใช้งานแล้วครับผม

References:

Comments

ทำไมมันยุ่งยากยังงี้อะครับ.

apache1 ไม่เห็นต้องทำอะไรเลย, แค่ลง package apache-ssl ก็ใช้ได้เลย

ถ้าจำไม่ผิด ใน apache1 จะมี 2 solution คือใช้ apache-ssl และใช้ mod_ssl โดย apache-ssl จะสร้าง service ใหม่ต่างหากจาก apache ส่วน mod_ssl ก็อยู่ใน service ของ apache เดิม เพียงแต่ต้องจัดการ virtual host นิดหน่อย

ก็ปรากฏว่า apache-ssl เขาไม่ทำต่อใน apache2 มั้งครับ ก็เลยเหลือ mod_ssl อย่างเดียว

ปล. แต่ลง apache-ssl สมัย apache1 ก็ยังต้องทำ SSL certificate ในขั้นที่ 3 เพิ่มอีกอยู่ดีนะครับ ถ้าไม่ต้องการให้มี warning ที่ client เกี่ยวกับ certificate ที่ใช้ไม่ได้

อืมๆ, เราลองเข้าไปดูของ redhat enterprise แล้ว, มันมี package ชื่อ mod_ssl.
แล้ว package mod_ssl มันใส่ virtualhost ไว้ใน /etc/httpd/conf.d/ssl.conf ให้แล้ว.
แล้วก็ postinstall script ของมันก็ยัง gen ssl key ให้เลยด้วย.
RHEL ทำ server ง่ายกว่าจริงๆ ด้วย, มัน work out of the box เลย.

เราก็ไปดูใน ubuntu มันก็น่าจะ set virtual host ไว้ให้เลยนี่นา, เอ ทำไมไม่ทำไว้,

$ dpkg -L apache2-common | grep ssl
...
/etc/apache2/mods-available/ssl.conf
...
/usr/sbin/apache2-ssl-certificate
...
/usr/share/doc/apache2/examples/ssl.conf.gz
/usr/share/doc/apache2/examples/ssl-std.conf.gz

เข้าไปดูไฟล์ /usr/share/doc/apache2/examples/ssl.conf.gz, อ้าว ไฟล์ตัวอย่างนี้ก็ทำ virtual host สำหรับ ssl ไว้ให้แล้วนี่นา, แล้วทำไมมันถึงไม่เอาในไฟล์ตัวอย่างนั้นมาใส่ใน /etc/apache2/mods-available/ssl.conf เลยนะ.

อืมๆ, เข้าไปดูไฟล์ /usr/sbin/apache2-ssl-certificate, อ้าว นี้มัน script สำหรับ gen ssl key นี่นา, งี้ก็น่าจะใช้ script นี้ได้เลยดิ.

แล้วทำไม debian ถึงไม่แยก mod_ssl ออกมาเป็น อีก package นึงหละเนี่ย, จะได้ gen key ใน post install script เลย.

apache2-ssl-certificate นี่ ไม่มีใน debian ครับ สงสัยว่าเป็น ubuntu change ที่ยังไม่เข้า debian

เรื่อง example ssl.conf.. บางที นี่อาจเป็นข้อมูลสำหรับปรับบทความไหมครับ? แล้วแต่นิวตรอนละกัน แต่ที่ debian ไม่เอามาใส่ใน /etc เลยนี่ ผมยังไม่รู้เหตุผลของเขาเหมือนกัน แต่เดาเอาว่าเป็นเพราะ web server สามารถโฮสต์ virtual host ได้หลายโฮสต์ ซึ่งอาจไม่จำเป็นต้องเปิด ssl ทุกโฮสต์ละมัง

เรื่องแยก mod_ssl ออกมาต่างหาก.. น่าสนใจครับ ไม่รู้มีใคร file bug เรื่องนี้ไปหรือยัง อีกทางหนึ่งที่เป็นไปได้คือ เพิ่มคำถามใน debconf ของ apache2 เอง ว่าจะเซ็ต SSL หรือเปล่า

ลองเอา virtualhost ใน examples/ssl.conf.gz มาใส่ใน mods-available/ssl.conf แล้ว ก็ยังไม่เวิร์คซะทีเดียวครับ.

$ sudo /etc/init.d/apache2 restart
* Forcing reload of web server (Apache2)...
[Thu Oct 11 11:32:31 2007] [error] VirtualHost _default_:443 -- mixing * ports and non-* ports with a NameVirtualHost address is not supported, proceeding with undefined results
[Thu Oct 11 11:32:32 2007] [error] VirtualHost _default_:443 -- mixing * ports and non-* ports with a NameVirtualHost address is not supported, proceeding with undefined results [ ok ]

ลองไป comment NameVirtualHost ใน sites-available/default ออก ก็ใช้ได้.

#NameVirtualHost *
<VirtualHost *>
   ServerAdmin webmaster@localhost

   DocumentRoot /var/www/
   ...

ไม่เข้าใจเหมือนกันว่า NameVirtualHost ใช้ทำอะไร.
(ใน examples/ssl.conf.gz ไม่ได้ใส่ NameVirtualHost ไว้.)

อืม, กลับไปดู postinst ของ apache-ssl (ubuntu), มันก็มี script ช่วย gen key อยู่ในนั้นอยู่แล้ว, ไม่ต้องมาสั่งเอง.

file bug เลยครับ :)

/etc/init.d/apache2 reload
Syntax error on line 87 of /etc/apache2/sites-enabled/000-default:
SSLEngine not allowed here
failed!
สั่งแล้วขึ้นอย่างนี้แสดงว่าเกิดจากอะไรอ่ะครับ

ดู changelog.Debian พบว่าเขาเคยใส่ไว้ใน postinst แล้ว, แต่เอาออก เพราะมี bug #231726

# Make self-signed certificate
#if [ ! -f /etc/apache2/ssl/apache.pem ]
#then
#        /usr/sbin/make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/apache.pem
#fi

อยากจะ reopen bug ตัวนี้ และบอกให้เค้าแก้ปัญหาด้วยการแยก package mod_ssl ออกมา (พร้อมด้วยแก้ postinst script นิดหน่อย),

# Make self-signed certificate
if [ ! -f /etc/apache2/ssl/apache.pem ]
then
        /usr/sbin/make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/apache.pem || (rm -f /etc/apache2/ssl/apache.pem; false)
fi

ว่าแต่ reopen bug นี่ทำไงครับ?

ปล. นั่งอ่าน bug report ย้อนหลัง, เหมือนว่าแต่ก่อน debian มันเคยใช้ apache2-ssl-certificate, แล้วตอนหลังเปลี่ยนมาใช้ make-ssl-cert ของ package ssl-cert แทน.

วิธี reopen bug คือส่งเมลไปที่ control at bugs dot debian dot org น่ะครับ ใส่เนื้อหาในเมลว่า

reopen 231726
thanks

รายละเอียด: http://debianclub.org/node/86

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=168109#31 <-- มา reopen ตัวนี้แทนละ.

Creative Commons License ลิขสิทธิ์ของบทความเป็นของเจ้าของบทความแต่ละชิ้น
ผลงานนี้ ใช้สัญญาอนุญาตของครีเอทีฟคอมมอนส์แบบ แสดงที่มา-อนุญาตแบบเดียวกัน 3.0 ที่ยังไม่ได้ปรับแก้