Saturday, July 9, 2016

Untuk mengamankan koneksi HTTP pada Web Server, dapat digunakan SSL. SSL merupakan sertifikat security yang menjamin bahwa informasi yang diberikan dari server merupakan informasi yang berasal dari server itu sendiri. Mengapa begitu? Secara sederhana pada pertukaran data antara server dan user, orang lain dapat masuk diantara pertukaran data tersebut dan melakukan mata-mata atau bahkan memanipulasi proses pertukaran data tersebut. Untuk mengamankannya akan dilakukan proses enkripsi dan sertifikat security ini memastikan bahwa data tersebut diterima oleh web server yang tepat dan user yang tepat.

Mekanisme kerja Secure HTTPS dengan let'sencrypt
Let'sencrypt
Let’s Encrypt adalah Certificate Authority (CA) yang gratis dan terotomatisasi yang berjalan untuk kepentingan umum. Let’s Encrypt adalah sebuah layanan yang disediakan oleh Internet Security Research Group (ISRG). Prinsip-prinsip dasar dari Let’s Encrypt adalah gratis, otomatis, aman, transparan, terbuka, dan koperatif.
Instalasi Let'sencrypt

Untuk mendapatkan sertifikat let'sencrypt, kita dapat menggeneratenya pada server CentOS. Namun terlebih dahulu kita harus melakukan instalasi beberapa aplikasi pendukung sebagai berikut,

Install git dan bc dengan menggunakan perintah berikut,

# yum install git bc
Kemudian Clone directory let'sencrypt dari github dengan perintah berikut,

# git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
Lalu matikan service nginx denga menggunakan perintah berikut

# systemctl stop nginx 
Berpindahlah pada directory /opt/letsencrypt

cd /opt/letsencrypt
Lalu jalankan letsencrypt untuk mendapatk sertifikat ssl dengan menggunakan perintah berikut,

# ./letsencrypt-auto certonly --standalone -d example.com -d www.example.com -d mail.example.com 
Kemudian pada directory /etc/letsencrypt/live/example.com (sesuai dengan domain) akan dihasilkan beberapa file diantaranya,
  • cert.pem: Your domain's certificate 
  • chain.pem: The Let's Encrypt chain certificate 
  • fullchain.pem: cert.pem and chain.pem combined 
  • privkey.pem: Your certificate's private key
Bila ke empat file telah terdapat pada directory tersebut, maka ssl telah didapat untuk domain yang diinginkan. Bagian selanjutnya ialah menghasilkan Diffie-Hellman Group, jalankan perintah berikut,

# openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
Setelah itu, akan dilakukan konfigurasi TLS/SSL pada NGINX

Konfigurasi TSL/SSL pada NGINX

Buatlah sebuah file config pada directory /etc/nginx/conf.d/ dengan nama ssl.conf, dengan menjalankan perintah berikut,

# ee /etc/nginx/conf.d/ssl.conf
Kemudian ketikkan konfigurasi berikut,

server { listen 443 ssl; server_name example.com; root /usr/share/nginx/html; index index.php index.html index.htm; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_stapling on; ssl_stapling_verify on; add_header Strict-Transport-Security max-age=15768000; location ~ /.well-known { allow all; } location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; # Uncomment to enable naxsi on this location # include /etc/nginx/naxsi.rules } location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }  server { listen 443 ssl; server_name www.example.com; root /usr/share/nginx/html; index index.php index.html index.htm; ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_stapling on; ssl_stapling_verify on; add_header Strict-Transport-Security max-age=15768000; location ~ /.well-known { allow all; } location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; # Uncomment to enable naxsi on this location # include /etc/nginx/naxsi.rules } location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } 
Lalu restart NGINX dengan perintah berikut,

# systemctl start nginx

Automatic redirect all HTTP to HTTPS

Ketika user mengakses web, secara default mereka akang mengakses http. Oleh karena itu, konfigurasi berikut akan membuat redirect semua request http menjadi https.

Buka file /etc/nginx/nginx.conf dengan menggunakan perintah berikut,

# ee /etc/nginx/nginx.conf

Kemudian lakukan perubahan seperti berikut,

server { listen 80 default_server; listen [::]:80 default_server; server_name example.com; root /usr/share/nginx/html; return 301 https://$host$request_uri; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { }
Setelah itu buka web tersebut dengan alamat yang telah di set, contohnya www.example.com

Update otomatis sertifikat

Sertifika letsencrypt hanya berlaku selama 90 hari, jadi dalam kurang dari 90 hari harus dilakukan update sertifikat.Update sertifikat ini dapat dilakukan secara otomatis dengan menggunakan Crontab. Jalankan Crontab dengan perintah berikut,

# crontab -e
Lalu tambahkan bagian kode berikut,

30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log
35 2 * * 1 /usr/bin/systemctl reload nginx


Untuk melakukan update versi terbaru Letsencrypt jalankan perintah berikut,

# cd /opt/lestencrypt
# sudo git pull
Sekarang website anda telah terlindungi dengan ssl. Hasil yang didapat mungkin bervariasi. Dalam percobaan untuk menghasilkan ssl sertifikat ini, sempat beberapa kali mengalami kegagalan. Bagi yang mempunyai pengalam berbeda pada saat Instalasi silahkan tinggalkan komentar dibawah.

Pustaka
https://bjornjohansen.no/lets-encrypt-for-nginx
https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-centos-7
Newer Post Older Post

0 comments:

Post a Comment