Konfigurasi Apache dengan certificate SSL/TLS ------------------------------------------------------------------------------- By Henry Saptono , Depok, April 2007 ------------------------------------------------------------------------------- Tulisan ini mencoba menjelaskan secara ringkas dan praktis bagaimana melakukan konfigurasi SSL (enable secure socket layer) di Apache 2.0. Asumsi: ------------------------------------------------------------------------------- Server web Anda (Apache 2.0) berada pada mesin dengan nama (hostname/FQDN) sotnec.nurulfikri.com, perlu diperhatikan bahwa hostname mesin Anda harus dapat dilookup (valid terdaftar di DNS). Sebelumnya web server Anda hanya menjalankan service http(port 80), sekarang Anda berkeinginan mengaktifkan service https(port 443) pada web server Anda. Pada web server Anda terdapat 2 virtualhost yang jalan dalam mode HTTPS yang masing masing virtual host memiliki hostname (FQDN) yaitu "mars.nurulfikri.com" dan "bumi.nurulfikri.com". Langkah-langkah step by step konfigurasi SSL (enable secure socket layer) di Apache 2.0: ------------------------------------------------------------------------------ Tahap 1: Setup your own CA (Certificate Authority) --------------------------------------------------- Agar apache web server Anda dapat menjalankan secure (SSL/TLS encrypted) web server, Anda harus memmiliki sebuah "private key" dan sebuah "certificate" untuk web server Anda. Untuk website commercial, Mungkin Anda dapat membeli certificate yang telah ditanda tangani oleh root CA yang terkenal. Untuk Intranet atau special-purpose , Anda dapat membuat CA sendiri. Ini dapat dilakukan dengan menggunakan tools OpenSSL . Disini, kita akan membuat sebuah private CA key dan sebuah certificate private CA X.509. Kita juga akan membuat direktori untuk menyimpan certs dan keys: # mkdir /root/CA # chmod 0770 /root/CA # cd /root/CA # openssl genrsa -des3 -out my-ca.key 2048 # openssl req -new -x509 -days 3650 -key my-ca.key -out my-ca.crt # openssl x509 -in my-ca.crt -text -noout Certificate: Data: Version: 3 (0x2) Serial Number: 0 (0x0) Signature Algorithm: md5WithRSAEncryption Issuer: C=ID, ST=Jawa Barat, L=Depok, O=PT NCI, OU=IT, CN=sotnec.nurulfikri.com/emailAddress=henry@nurulfikri.com Validity Not Before: Apr 3 02:10:25 2007 GMT Not After : Mar 31 02:10:25 2017 GMT Subject: C=ID, ST=Jawa Barat, L=Depok, O=PT NCI, OU=IT, CN=sotnec.nurulfikri.com/emailAddress=henry@nurulfikri.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (2048 bit) Modulus (2048 bit): 00:d2:55:bb:2c:54:17:11:8e:15:9d:5f:58:c5:a2: ae:f2:a6:c2:a7:c3:9d:bd:7c:f7:2a:b0:ac:1a:25: 3e:4c:4c:ee:c7:27:ed:68:79:85:22:77:7f:46:9a: e3:48:2a:b4:c7:87:f9:03:6f:47:54:c7:31:4f:35: b7:57:b0:02:d0:0e:9c:5a:87:52:58:09:3c:c6:cd: 1b:a5:53:b7:4f:97:9f:52:e7:c8:22:3b:fa:0d:3a: 6c:98:1b:ae:87:9e:7b:78:b3:c1:d1:87:97:b8:8f: 88:29:a7:2d:18:60:30:4a:fb:84:3f:c8:e8:8c:bd: 86:1f:9c:b9:45:a0:1f:be:04:66:37:60:e8:c4:0a: e1:fd:04:84:f8:cd:4a:4a:95:5f:c4:6e:20:d7:e0: c8:c4:a0:1f:3b:e7:01:7c:16:06:11:b8:b3:1a:65: ed:f1:da:7d:76:80:5a:3e:7c:05:4a:4c:da:cf:8a: 6f:8f:e4:6c:65:ed:ec:4c:61:4f:8e:0b:3c:28:9b: fd:47:7c:40:68:c0:7b:74:cc:03:87:7d:ed:29:e0: 18:b9:01:64:e7:4b:f6:cb:a0:bc:3c:85:e7:4a:4d: 14:80:16:ea:54:80:a7:00:40:f9:fc:21:4a:c9:45: e5:32:c3:f1:3f:d9:bd:ce:e6:86:f5:c9:c4:4a:ea: 9a:bb Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Key Identifier: 43:F7:93:F4:F5:7A:D1:24:F5:A8:F1:4E:CF:F9:9C:3C:83:73:25:34 X509v3 Authority Key Identifier: keyid:43:F7:93:F4:F5:7A:D1:24:F5:A8:F1:4E:CF:F9:9C:3C:83:73:25:34 DirName:/C=ID/ST=Jawa Barat/L=Depok/O=PT NCI/OU=IT/CN=sotnec.nurulfikri.com/emailAddress=henry@nurulfikri.com serial:00 X509v3 Basic Constraints: CA:TRUE Signature Algorithm: md5WithRSAEncryption 8f:75:79:48:6b:d0:7e:02:9f:1c:f8:9d:39:e5:5b:6e:c7:1e: e9:6e:a3:e4:d1:d3:9b:db:33:62:f6:67:aa:54:90:38:78:61: 4a:fb:b8:fd:0c:74:d5:ac:08:ff:00:a2:fb:98:b3:56:44:6e: 7f:8d:77:d9:5d:0f:ee:40:06:62:46:aa:bc:8b:ff:c7:a3:e6: 83:b9:63:f8:c7:ef:1a:ed:6e:eb:57:e9:d1:2c:f0:12:50:4b: 7d:5b:c5:22:b0:a0:12:65:93:81:e3:54:f8:85:10:8d:5b:d3: 9b:56:59:b8:3d:01:07:6e:33:d6:52:c5:8e:b3:c9:48:95:7b: 26:c2:74:ab:d3:b0:3a:ad:52:bb:69:86:dc:83:40:b6:9a:f0: b3:f7:46:5d:ca:99:61:c6:7e:ac:92:c5:a9:3b:80:c1:05:e7: 5f:7b:24:8d:1e:eb:dc:85:fe:77:c5:99:4b:10:d3:d5:3c:fa: 24:f2:f5:a4:e6:7d:dd:c7:e2:25:8a:c1:18:59:92:f7:42:77: 27:1e:3d:36:c3:6a:65:ab:1d:c5:34:a8:ab:66:9e:1f:d6:9c: 50:46:76:94:bc:67:27:29:60:55:b3:88:65:58:63:85:c5:f2: d9:dc:f9:06:d4:27:a2:18:22:65:36:72:80:44:cf:b6:d2:d5: 28:e4:25:35 Catatan: Perintah openssl yang pertama akan membuat CA key . Perintah yang kedua akan membuat X.509 certificate dengan waktu hidup 10 tahun (10-year lifetime). Perintah ketiga akan menampilkan certificate kita secara lengkap. Tahap 2: Membuat key dan certificate untuk web server: --------------------------------------------------------- Sekarang, kita membuat X.509 certificate dan private key nya untuk web server. Karena kita membuat certificate secara langsung, kita akan membuat key dan certificate, kemudian certificate yang diminta akan di"tandatangani" dengan CA key yang telah kita buat pada tahap 1. Kita juga dapat membuat multiple keys untuk multiple web servers (virtual host) dengan cara yang sama. Satu hal yang perlu dicatat bahwa SSL/TLS private keys untuk web server memerlukan 512 atau 1024 bits. Ukuran key yang lain bisa jadi tidak kompatibel dengan browser-browser tertentu. Dalam contoh kasus disini kita akan membuat key dan certificate untuk virtualhost mars.nurulfikri.com dan bumi.nurulfikri.com. # openssl genrsa -des3 -out mars-server.key 1024 # openssl req -new -key mars-server.key -out mars-server.csr # openssl x509 -req -in mars-server.csr -out mars-server.crt -sha1 -CA my-ca.crt -CAkey my-ca.key -CAcreateserial -days 3650 # openssl x509 -in mars-server.crt -text -noout # openssl genrsa -des3 -out bumi-server.key 1024 # openssl req -new -key bumi-server.key -out bumi-server.csr # openssl x509 -req -in bumi-server.csr -out bumi-server.crt -sha1 -CA my-ca.crt -CAkey my-ca.key -CAcreateserial -days 3650 # openssl x509 -in bumi-server.crt -text -noout Sebaiknya semua file key yang ada di /root/CA dirubah ijin aksesnya menjadi 0400 sbb: # chmod 0400 *.key # ls /root/CA/ Tahap 3: Mengexport/Menyalin keys dan certificate, ke dalam direktori konfigurasi apache --------------------------------------------------------------------------------------- # mkdir /etc/httpd/conf/ssl.crt # mkdir /etc/httpd/conf/ssl.key # cp my-ca.crt /etc/httpd/conf/ssl.crt # cp mars-server.crt /etc/httpd/conf/ssl.crt # cp mars-server.key /etc/httpd/conf/ssl.key # cp bumi-server.key /etc/httpd/conf/ssl.key # cp bumi-server.crt /etc/httpd/conf/ssl.crt Tahap 4: Membuat directory documentroot & index.html utk masing-masing virtualhost ----------------------------------------------------------------------------------- # mkdir /var/www/mars # chmod 0775 /var/www/mars # cd /var/www/mars # echo "Hello mars" > index.html # mkdir /var/www/bumi # cd /var/www/bumi # chmod 0775 /var/www/bumi # echo "Hello bumi" > index.html Tahap 5: Mengkonfigurasi Apache, agar mensuport SSL/TLS -------------------------------------------------------- # vi /etc/httpd/conf.d/ssl.conf ------------------------------------------------------------------------------------ # This is the Apache server configuration file providing SSL support. # It contains the configuration directives to instruct the server how to # serve pages over an https connection. For detailing information about these # directives see # # Do NOT simply read the instructions in here without understanding # what they do. They're here only as hints or reminders. If you are unsure # consult the online docs. You have been warned. # LoadModule ssl_module modules/mod_ssl.so # # When we also provide SSL we have to listen to the # standard HTTP port (see above) and to the HTTPS port # Listen 443 AddType application/x-x509-ca-cert .crt AddType application/x-pkcs7-crl .crl SSLPassPhraseDialog builtin SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000) SSLSessionCacheTimeout 300 # Semaphore: # Configure the path to the mutual exclusion semaphore the # SSL engine uses internally for inter-process synchronization. SSLMutex default SSLRandomSeed startup file:/dev/urandom 256 SSLRandomSeed connect builtin SSLCryptoDevice builtin ## ## SSL Virtual Host Context ## NameVirtualHost 192.168.1.33:443 # General setup for the virtual host, inherited from global configuration DocumentRoot "/var/www/mars" ServerName mars.nurulfikri.com:443 ErrorLog logs/mars-ssl_error_log TransferLog logs/mars-ssl_access_log LogLevel warn SSLEngine on SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP SSLCertificateFile /etc/httpd/conf/ssl.crt/mars-server.crt SSLCertificateKeyFile /etc/httpd/conf/ssl.key/mars-server.key SSLOptions +StdEnvVars SSLOptions +StdEnvVars SetEnvIf User-Agent ".*MSIE.*" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 CustomLog logs/ssl_request_log \ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" # General setup for the virtual host, inherited from global configuration DocumentRoot "/var/www/bumi" ServerName bumi.nurulfikri.com:443 ErrorLog logs/bumi-ssl_error_log TransferLog logs/bumi-ssl_access_log LogLevel warn SSLEngine on SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP SSLCertificateFile /etc/httpd/conf/ssl.crt/bumi-server.crt SSLCertificateKeyFile /etc/httpd/conf/ssl.key/bumi-server.key SSLOptions +StdEnvVars SSLOptions +StdEnvVars SetEnvIf User-Agent ".*MSIE.*" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 CustomLog logs/ssl_request_log \ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" ---------------------------------------------------------------------------------------------------- Setelah menkonfigurasi apache . kemudian restart service apache: [root@sotnec ~]# service httpd restart Stopping httpd: [ OK ] Starting httpd: Apache/2.0.52 mod_ssl/2.0.52 (Pass Phrase Dialog) Some of your private key files are encrypted for security reasons. In order to read them you have to provide the pass phrases. Server bumi.nurulfikri.com:443 (RSA) Enter pass phrase: OK: Pass Phrase Dialog successful. [ OK ] Catatan: pada saat Anda restart service apache maka anda akan ditanyakan pass phrase untuk keys yang telah anda buat sbb, maka berikanlah pass phrase tersebut sesuai dengan pass phrase yang telah anda buat. Lalu coba Anda akses web server dengan URL sbb: https://mars.nurulfikri.com dan https://bumi.nurulfikri.com ------------------------ WEB server key password: ------------------------ Setelah Anda melakukan tahap-tahap diatas maka web server Anda sudah mensupport SSL, namun perlu diingat setiap kali Anda restart atau start service apache Anda maka Anda harus memasukkan pass pharse(password) dari key masing-masing virtual host, nah ini terkadang kurang simple atau fleksibel menurut sebagian orang tetapi sebenarnya itu lebih safe/secure. Jika Anda tidak ingin setiap kali me-restart apache harus memasukkan pass phrase(password) dari key masing-masing virtualhost maka Anda harus melakukan beberapa tahap sbb: [root@sotnec ~]# cd /etc/httpd/conf/ssl.key [root@sotnec ssl.key]# cp bumi-server.key bumi-server.key.org [root@sotnec ssl.key]# openssl rsa -in bumi-server.key.org -out bumi-server.key Enter pass phrase for bumi-server.key.org: writing RSA key [root@sotnec ssl.key]# less bumi-server.key [root@sotnec ssl.key]# service httpd restart Stopping httpd: [ OK ] Starting httpd: Apache/2.0.52 mod_ssl/2.0.52 (Pass Phrase Dialog) Some of your private key files are encrypted for security reasons. In order to read them you have to provide the pass phrases. Server mars.nurulfikri.com:443 (RSA) Enter pass phrase: OK: Pass Phrase Dialog successful. [ OK ] [root@sotnec ssl.key]# cp mars-server.key mars-server.key.org [root@sotnec ssl.key]# openssl rsa -in mars-server.key.org -out mars-server.key Enter pass phrase for mars-server.key.org: writing RSA key [root@sotnec ssl.key]# service httpd restart Stopping httpd: [ OK ] Starting httpd: [ OK ] [root@sotnec ssl.key]# Selamat mencoba.! --------------------- Daftar pustaka: ---------------------- http://www.vanemery.com/Linux/Apache/apache-SSL.html http://localhost/manual/mod/mod_ssl.html http://www.google.co.id