/ BasicKnowledge

Secure your site

สวัสดีครับ วันนี้เราจะมาพูดคุยกันในเรื่องเกี่ยวกับการการติดตั้งใบรับรอง (SSL Certificate) ให้กับเว็บของเรากันนะครับ


SSL

SSL มาจากคำว่า Secure Socket Layer ซึ่งเป็นโปรโตคอลของการเข้ารหัสข้อมูลที่ส่งผ่านอินเทอร์เน็ต เรามักจะกล่าวถึงคู่กับ TLS(Transport Layer Security) ซึ่งเป็นโปรโตคอลที่ใหม่กว่าและปลอดภัยสูงกว่า ในตำรามีบอกไว้ว่า TLS/SSL นั้นจะทำงานบนชั้น Application Layer หากดูตามโมเดลของ Internet protocol suite แต่ถ้าคุ้นเคยกับโมเดลของ OSI ก็เทียบได้กับชั้น Session layer ถึง Presentation layer ทั้ง TLS/SSL นั้นมีการรองรับการเข้ารหัสด้วย Cipher ที่หลากหลายขึ้นอยู่กับ Spec ของแต่ละเวอร์ชั่น

SSL Certificate

SSL Certificate ก็คือใบรับรองดิจิทัล ที่ใช้ในการรับรอง Public Key ที่ได้จากกระบวนการเข้ารหัส TLS/SSL ซึ่งใบรับรองนี้จะสร้างขึ้นโดย Certificate authority (CA) หรือสร้างด้วยตนเองก็ได้ (self-signed certificate)

Certificate authority

certificate authority เป็นองค์กรที่มีหน้าที่ในการออก Digital Certificate เพื่อรับรองว่า Public Key นั้นๆ สามารถเชื่อถือได้

HTTPS

Hypertext Transfer Protocol Secure (HTTPS) คือโปรโตคอลของการสื่อสารซึ่งมีฟีเจอร์ด้านความปลอดภัยอย่าง TLS/SSL เพิ่มขึ้นมาจาก HTTP ปกติ โดย ทำให้สามารถป้องกับการโจมตีแบบ man-in-the-middle (การโจมตีผ่านสื่อกลางที่อยู่ระหว่าง ผู้ใช้บริการและผู้ให้บริการ)


The Example

การสร้างคีย์สำหรับใช้ใน TLS/SSL นั้นมีอยู่จำเป็นต้องใช้เครื่องมือ เช่น OpenSSL, GnuTLS, etc... ในบทความนี้เราจะเลือกใช้ OpenSSL ซึ่งเป็นที่นิยมมากในปัจจุบันและเพิ่งจะพบปัญหา HeartBleed ไปเมื่อไม่นานนี้

Tools

  1. Ubuntu 14.04 LTS Installed PC
  2. OpenSSL 1.0.1f ที่แก้ไขเรื่อง HeartBleed แล้ว
  3. Nginx - HTTP server

การนำ Certificate ที่ได้ไปใช้มีทางเลือกหลัักๆ อยู่ 2 ทาง คือ implement ที่ Application เลย หรืแ implement ที่ HTTP Server ก็ได้

ในบทความนี้เลือกที่จะใช้ Nginx ในการ control SSL Certificate เนื่องจากความง่ายต่อการเข้าใจ

The Method

  1. ติดตั้ง OpenSSl เวอร์ชั่นล่าสุด

    sudo apt-get install openssl
    
  2. ติดตั้ง Nginx

    2.1 ติดตั้ง Dependencies ของNginx

    sudo apt-get install python-software-properties
    sudo apt-get install software-properties-common
    

    2.2 เพิ่ม ppa ของ Nginx stable

    sudo add-apt-repository ppa:nginx/stable
    sudo apt-get update
    

    2.3 ติดตั้ง Nginx

    sudo apt-get install nginx
    
  3. สร้าง Private Key และใบรับรอง

    3.1 สร้าง Directory สำหรับเก็บ Key

     sudo mkdir /etc/nginx/ssl
    

    3.2 ไปที่ Directory ที่สร้างขึ้น

      cd /etc/nginx/ssl
    

    3.3 สร้าง Private Key ในกระบวนการนี้ผมใช้ Triple DES เป็น Cipher และสร้างคีย์ขนาด 2048 bytes (ระหว่างกระบวนการจะมีให้ใส่ passphase ที่ใช้ในการเข้ารหัส ใ้หตั้งอย่างระมัดระวังและต้องจำได้)

     sudo openssl genrsa -des3 -out server.key 2048
    

    3.4 สร้างไฟล์ certificate signing request สำหรับใช้่ในการร้องขอ Certificate ระหว่างกระบวนการจะมีการถาม Common Name ให้ใส่ URL ที่จะรับรอง เช่น furyform.com ก่อนจบจะมีถาม challenge password และ optional company ให้กด enter ข้ามไปได้เลย

     sudo openssl req -new -key server.key -out server.csr
    

    3.5 ลบ passphase ออกจาก key

     sudo openssl rsa -in server.key -out server.key
    

    3.6 ทำการสร้าง Certificate หากต้องการใช้ใบรังรองจาก CA ให้ส่งไฟล์ CSR จากกระบวนการที่ 2 ไปให้ผู้ให้บริการ (ข้ามไป 2.)

    // 1.ไม่ต้องทำถ้าจะใช้ Certificate จาก CA

     sudo openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
    

    // 2.ถ้าได้ไฟล์ตอบกลับจาก CA แล้วให้รวมทั้งหมดเป็นไฟล์เดียวกัน เช่น

     cat example_com.crt PositiveSSLCA2.crt AddTrustExternalCARoot.crt > server.crt
    

สรุปไฟล์ที่จำเป็นต้องนำไปใช้จะมี server.key (Private Key) และ server.crt (Certificate)

  1. นำใบรับของและคีย์ไปใช้จริง

    4.1 ไปที่ Directory sites-available ของ Nginx

    cd /etc/nginx/sites-available/
    

    4.2 เปิดไฟล์ ตั้งค่าของ เว็บที่จะใช้ใบรับรอง ในตัวอย่างนี้เป็น example แล้วแก้ไขตามข้อถัดไป

    vi example.conf
    

    4.3 บังคับให้ทุก request redirect ไปที่ httpsเสมอ ด้วยการ rewrite url ใหม่

    *server_name คือชื่อ domain

    *rewrite คือ การกำหนดรูปแบบที่จะเปลี่ยน request url

    server {
         listen      80;
         server_name furyform.com;
         rewrite   ^ https://$server_name$request_uri? permanent;
     }
    

    4.4 กำหนดค่า https ใน block ถัดไป

    เปลี่ยนให้ไปฟังที่ post 433 (ssl) โดยใส่เป็น listen 443 ssl;

    ตั้งให้ใช้ ssl โดยใส่ ssl on;

    ใส่ Certificate ที่ได้มา ssl_certificate /etc/nginx/ssl/server.crt

    ใส่ Private Key ที่ได้มา ssl_certificate_key /etc/nginx/ssl/server.key

    server {
        listen       443 ssl;
        server_name  furyform.com;
        ssl on;
        ssl_certificate      /etc/nginx/ssl/server.crt;
        ssl_certificate_key  /etc/nginx/ssl/server.key;
        /* your code here */
    }
    

    4.5 restart nginx แล้วของเข้าใช้เว็บดู

เพียงเท่านี้เว็บของคุณก็จะปลอดภัยขึ้นไปอีกขั้น แล้วพบกันใหม่ในตอนหน้าครับ


Ref: Wiki-Transport Layer Security, Wiki-Certificate authority, DigitalOcean, WenSheng