Creating A Self-Signed SSL Cert For Mac OS X Mavericks & Apache

สร้าง host key

ขั้นแรกสร้างที่เก็บไฟล์ SSL ก่อน ค่า default ของ Apache บน Mevericks จะเก็บไฟล์ SSL ไว้ที่ /private/etc/apache2/ แต่เราจะเอาไว้ไหนก็ได้ตามใจ แต่ให้จำที่อยู่ไว้ เพราะจะเอาไปใช้ในการ config VirtualHost

$ sudo mkdir  /etc/apache2/ssl
$ cd  /etc/apache2/ssl
$ sudo ssh-keygen -f host.key

สร้าง CSR (certificate request file)

$ sudo openssl req -new -key host.key -out request.csr 

สร้าง SSL certificate

สร้าง SSL certificate โดยอ้างอิงจาก CSR ในขั้นตอนก่อนหน้า

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

สร้าง ‘nopass’ key

$ sudo openssl rsa -in host.key -out host.nopass.key

จะได้ไฟล์ที่จำเป็นต้องใช้ 2 ไฟล์คือ server.crt กับ host.nopass.key

Configure Apache

เปิดโมดูล SSL โดยไปที่ไฟล์ /etc/apache2/httpd.conf แล้วเอา comment ที่หน้าบรรทัดพวกนี้ออก

LoadModule ssl_module libexec/apache2/mod_ssl.so  
...
Include /private/etc/apache2/extra/httpd-ssl.conf

จากนั้นเข้าไปแก้ใขไฟล์ /etc/apache2/extra/httpd-ssl.conf

เพิ่ม 2 บรรทัดนี้ไว้ที่ด้านบน

Listen 443  
NameVirtualHost *:443  

จากนั้นก็สร้าง VirtualHost ตามปกติ แต่เพิ่ม SSL config เข้าไปพร้อมระบุที่อยู่ของ Certificate ที่เราสร้างไว้ก่อนหน้านี้ด้วยตามนี้

    SSLEngine on
    SSLCertificateFile "/etc/apache2/ssl/server.crt"
    SSLCertificateKeyFile "/etc/apache2/ssl/host.nopass.key"

    SSLProtocol all -SSLv2
    SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5

ตัวอย่างของ VirtualHost SSL

<VirtualHost *:443>  
    ServerAdmin webmaster@dummy-host2.example.com
    DocumentRoot "/Users/pangpond/Sites/Project/www/"
    ServerName Project

    <Directory "/Users/pangpond/Sites/Project/www/">
       Options -Indexes +FollowSymLinks
       Allow From All
       AllowOverride All
    </Directory>
    ErrorLog "/private/var/log/apache2/Project-error_log"
    CustomLog "/private/var/log/apache2/Project-access_log" common

    SSLEngine on
    SSLCertificateFile "/etc/apache2/ssl/server.crt"
    SSLCertificateKeyFile "/etc/apache2/ssl/host.nopass.key"

    SSLProtocol all -SSLv2
    SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5

</VirtualHost>  

จากนั้นลองตรวจสอบว่าไม่ได้พิมพ์อะไรผิดระหว่าง config VirtualHost ด้วยคำสั่ง configtest ถ้าผ่านก็ Restart Apache เป็นอันเสร็จ

$ sudo apachectl configtest
$ sudo apachectl restart