kilabit.info
Simple | Small | Stable | Secure

Mari enkripsi dengan Letsencrypt

Letsencrypt.org adalah organisasi non-profit yang menyediakan otoritas sertifikat (Certificate Authority, CA) untuk domain web secara gratis. Lama berlaku sertifikat dari Letsencrypt yaitu 90 hari, setelah itu harus diperbarui kembali.

Ini adalah catatan dari pemasangan aplikasi kliennya, permintaan sertifikat secara manual, dan penggunaannya. Untuk dokumentasi lebih lanjut bisa dilihat di https://letsencrypt.readthedocs.org/.

Lingkungan

Instalasi dilakukan di sistem operasi Arch Linux, dengan kebutuhan paket yaitu git, python, dan openssl.

Pemasangan Letsencrypt

Arch Linux sebenarnya telah menyediakan paket untuk letsencrypt, namun dalam tulisan ini dibahas cara menggunakan dari sumber kode langsung.

$ mkdir ~/git
$ cd ~/git
$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrpyt

Lakukan inisialisasi awal,

$ ./letsencrypt-auto --debug
Bootstrapping dependencies for Archlinux...
[sudo] password for ms:
menyelesaikan ketergantungan...
mencari paket paket yang tidak berkecocokan...

Paket (2)                Versi baru  Perubahan Bersih  Ukuran Unduhan

community/augeas         1.4.0-1             1,82 MiB        0,44 MiB
extra/python-virtualenv  13.1.2-2            1,78 MiB        1,52 MiB

Ukuran Unduhan Total:     1,95 MiB
Total Ukuran Terpasang :  3,61 MiB
...
Creating virtual environment...
Updating letsencrypt and virtual environment dependencies.....
Requesting root privileges to run with virtualenv: sudo /home/ms/.local/share/letsencrypt/bin/letsencrypt --debug
[sudo] password for ms:
No installers are available on your OS yet; try running "letsencrypt-auto certonly" to get a cert you can install manually

Letsencrypt telah terpasang, selanjutnya adalah pembuatan sertifikat.

Pembuatan CSR

Langkah ini mengasumsikan kita sudah memiliki private key sendiri yang digunakan untuk menandai permintaan sertifikat, untuk memastikan bahwa sertifikat yang dibuat nantinya adalah benar dari yang mengajukannya.

Letsencrypt mengharuskan format CSR dalam format DER (binary), dengan tambahan subject alternative names (SAN).

Buat berkas konfigurasi "openssl.cnf" yang dibutuhkan untuk pembuatan CSR yang isinya seperti berikut,

RANDFILE               = $ENV::HOME/.rnd

[ req ]
default_bits           = 4096
distinguished_name     = req_distinguished_name
prompt                 = no
req_extensions         = v3_req
default_md             = sha256

[ req_distinguished_name ]
C                      = NamaNegaraAnda
ST                     = NamaProvinsiAnda
L                      = NamaKotaAnda
O                      = NamaPerusahaaanAnda
OU                     = NamaUnitdiPerusahaanAnda
CN                     = NamaDomainAnada
emailAddress           = EmailAnda

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints       = CA:FALSE
keyUsage               = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName         = @alt_names

[ alt_names ]
DNS.1 = NamaAlternativeDariDomainAnda

Ganti nilai "Nama*" sesuai dengan informasi anda.

Buat CSR dengan perintah berikut

openssl req -out domain.der \
    -key id_rsa.nopass \
    -new \
    -outform DER \
    -nodes \
    -config openssl.cnf

Perintah diatas membuat berkas CSR dengan nama "domain.der", dengan menggunakan private key "id_rsa.nopass", dengan format DER, dan membaca konfigurasi dari berkas "openssl.cnf".

Permintaan Sertifikat

Untuk mendapatkan sertifikat anda harus memiliki akses ke mesin di mana domain yang akan anda registrasi berada, karena nanti aplikasi server letsencrypt akan melakukan verifikasi pada path tertentu dari webserver anda.

Sekarang lakukan permintaan sertifikat dengan perintah berikut,

. ~/git/letsencrypt/letsencrypt-auto -vvv -t \
    certonly --csr domain.der \
    --manual \
    --email NamaEmailAnda

Jika perintah di atas berjalan dengan sukses, anda akan diminta untuk menambah sebuah file di webserver anda, contoh keluaran dari perintah di atas.

NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running letsencrypt in manual mode on a machine that is
not your server, please ensure you're okay with that.

Are you OK with your IP being logged?
(Y)es/(N)o: y
Make sure your web server displays the following content at
http://[domain]/.well-known/acme-challenge/NtGxEz0bdA-0Y0zIrIUsn4DkTkRcL-t71OGga1Swhnc before continuing:

NtGxEz0bdA-0Y0zIrIUsn4DkTkRcL-t71OGga1Swhnc.fSeSxLp1jVFtH988RyKbq8xHgkYrP_P-OSobmio_3u8

If you don't have HTTP server configured, you can run the following
command on the target server (as root):

mkdir -p /tmp/letsencrypt/public_html/.well-known/acme-challenge
cd /tmp/letsencrypt/public_html
printf "%s" NtGxEz0bdA-0Y0zIrIUsn4DkTkRcL-t71OGga1Swhnc.fSeSxLp1jVFtH988RyKbq8xHgkYrP_P-OSobmio_3u8 > .well-known/acme-challenge/NtGxEz0bdA-0Y0zIrIUsn4DkTkRcL-t71OGga1Swhnc
# run only once per server:
$(command -v python2 || command -v python2.7 || command -v python2.6) -c \
"import BaseHTTPServer, SimpleHTTPServer; \
s = BaseHTTPServer.HTTPServer(('', 80), SimpleHTTPServer.SimpleHTTPRequestHandler); \
s.serve_forever()"
Press ENTER to continue

Sekarang lakukan SSH ke webserver anda.

Jika tidak menggunakan webserver (apache, nginx, dll) tapi menggunakan proxy (seperti HAProxy), atau ingin melakukan verifikasi dengan manual, berhentikan semua aplikasi yang menggunakan port 80 dan 443 kemudian buat berkas dengan nama "verifikasi.sh" yang isinya seperti informasi di atas.

#!/bin/sh

mkdir -p /tmp/letsencrypt/public_html/.well-known/acme-challenge
cd /tmp/letsencrypt/public_html
printf "%s" NtGxEz0bdA-0Y0zIrIUsn4DkTkRcL-t71OGga1Swhnc.fSeSxLp1jVFtH988RyKbq8xHgkYrP_P-OSobmio_3u8 > .well-known/acme-challenge/NtGxEz0bdA-0Y0zIrIUsn4DkTkRcL-t71OGga1Swhnc
# run only once per server:
$(command -v python2 || command -v python2.7 || command -v python2.6) -c \
"import BaseHTTPServer, SimpleHTTPServer; \
s = BaseHTTPServer.HTTPServer(('', 80), SimpleHTTPServer.SimpleHTTPRequestHandler); \
s.serve_forever()"

Jalankan skrip tersebut dengan akses root,

$ chmod +x verifikasi.sh
$ sudo ./verifikasi.sh

Kembali ke klien di komputer, tekan Enter untuk melanjutkan verifikasi.

Aplikasi letsencrypt akan melakukan verifikasi dengan melakukan request ke:

http://domain/.well-known/acme-challenge/NtGxEz0bdA-0Y0zIrIUsn4DkTkRcL-t71OGga1Swhnc

Jika sukses akan terlihat keluaran seperti berikut,

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   [dipotong]/0001_chain.pem.
   Your cert will expire on 2016-04-04. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.
 - If you like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Di direktori sekarang akan ada tiga berkas baru `0000_cert.pem` yaitu berkas sertifikat, `0000_chain.pem` yaitu CA dari letsencrypt, dan `0001_chain.pem` yaitu berkas gabungan dari keduanya.

Untuk dapat menggunakan sertifikat anda harus menggabungkan berkas private key anda dengan sertifikat,

$ cat id_rsa.nopass 0001_chain.pem > domain.pem

Sekian, sertifikat anda sekarang sudah dapat dipasang di webserver anda.