Rabu, 03 Desember 2008

Konfigurasi Apache HTTP server dengan certificate SSL/TLS

Tulisan ini mencoba menjelaskan sesederhana mungkin praktis bagaimana melakukan
konfigurasi SSL (enable secure socket layer) di Apache 2.0., namun bisa jadi sebagian Anda
merasa tulisan ini masih juga tetap komplek : ).


Asumsi:
-------------------------------------------------------------------------------
Server web Anda (Apache 2.0) berada pada mesin dengan nama (hostname/FQDN)
sotnec.contohaja.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.contohaja.com" dan "bumi.contohaja.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.contohaja.com/emailAddress=henry@contohaja.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.contohaja.com/emailAddress=henry@contohaja.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.contohaja.com/emailAddress=henry@contohaja.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.contohaja.com dan bumi.contohaja.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.contohaja.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.contohaja.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.contohaja.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.contohaja.com

dan

https://bumi.contohaja.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.contohaja.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.!

By Henry Saptono
-------------
Referensi
--------------
http://www.vanemery.com/Linux/Apache/apache-SSL.html
http://localhost/manual/mod/mod_ssl.html

Tidak ada komentar:

Posting Komentar