30/09/11

Ngoprek Microsoft Surface

Yang udah berhasil dilakukan disalahgunakan:

  • Boot ke USB CD/DVD. Password BIOS memang tidak dikasih, tapi ternyata kita bisa minta ke Customer Support Microsoft.

  • Windows 7 dan 8 preview dapat terpasang dengan baik

  • Ubuntu dan BlankOn juga bisa dijalankan (walau tidak nyoba memasangnya). Skrinsut:

  • Microsoft Surface 1.0 SDK (bukan versi Workstation Edition) ternyata sudah tersedia di partisi bawaan (Windows Vista). Awalnya saya kira Microsoft ngga ngasih installer apa2.

  • SDK tadi aslinya hanya bisa dipasang di Windows Vista Business 32bit yg dibawa oleh Microsoft Surface. Namun dengan sedikit utak-atik, SDK ini juga bisa dipasang di atas Windows 7, termasuk yg 64 bit. Seharusnya bisa juga dipasang di atas Windows 8 Preview, namun saya masih gagal memasangnya.

  • MultiTouchVista bisa dipakai untuk membuat windows 7 touch events. Sumber event bisa macem2 termasuk TUIO, multiple mouse, dan juga Surface Input! Saya belum berhasil melakukan kompilasi MultiTouchVista terbaru yg sudah berisi adapter Surface Input. Akhirnya terpaksa menggunakan TUIO dg didampingi konverter Surface Input ke TUIO.

  • Kalau touch events dari Surface Input sudah sampai ke Windows 7, maka kita udah bisa "megang2" si windows 7. IE sudah mendukung scroll dg menggeser halaman (bukan pada scroll bar) sedangkan Firefox 7 dan Chrome 13 (atau 14?) belum.

Sekian.

24/09/11

Irgsh: Pabrik Paket BlankOn

Slide presentasi jarak jauh di Konferensi BlankOn 2011 mengenai Irgsh, yaitu nama pabrik paket yang dipakai di BlankOn.

20/09/11

Port forwarding dg NAT

Ceritanya saya punya mesin, katakanlah bernama C, yang cuma bisa diakses dari dalam jaringan lokal. Saya juga punya mesin bernama M yang bisa diakses dari jaringan lokal DAN juga dari internet. Nah, berhubung si C bisa diakses oleh M, tentu saja saya bisa mengakses C dari internet dg menghubungi M terlebih dahulu.

Cara yang biasa saya lakukan adalah dg membuat koneksi ke M melalui SSH. Setelah di dalam M, saya buka lagi koneksi ke C, lagi-lagi melalui SSH. Intinya saya harus menyiapkan koneksi ke M via SSH terlebih dahulu sebelum saya bisa menghubungi si C. Caranya sendiri pernah saya tuliskan sebelumnya: port forwarding dengan SSH atau dengan membuat socks proxy.

Lama-lama saya malas juga membuat koneksi SSH ke M setiap saya ingin menghubungi C. Mengingat saya memiliki akses administrator di mesin M, akhirnya saya mencoba cara lain, yaitu port forwarding dg NAT alias Network Address Translation. Cara kerja NAT akan saya bahas di lain waktu (kalau ingat, kalau lagi gak malas, kalau mau :P) jadi skr lgs ke inti solusinya saja.

Pertama-tama, aktifkan dulu IP forwarding. (oh iya.. perintah2 ini dikerjakan di mesin M)

# echo 1 > /proc/sys/net/ipv4/ip_forward

Pastikan perintah di atas dijalankan oleh root.. atau versi dengan sudo nya adalah seperti berikut.

$ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

Kalau IP forwarding sudah diatur, mari kita buat NAT, atau lebih tepatnya DNAT alias Destination NAT berhubung yang akan dibelokkan itu adalah alamat tujuan koneksi.

$ sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --source 1.2.3.4 --dport 12345 -j DNAT --to 10.20.30.40:22

Saya ingin membuat NAT yg terbatas dari segi alamat sumber. Dalam contoh di atas, hanya koneksi dari alamat 1.2.3.4 yang akan dialihkan. Selain dari itu, koneksi akan berhenti sampai di sini saja. Selain itu hanya koneksi yg nyampe di eth0 dg protokol tcp di port 12345 yang akan dilayani.

Jika ada koneksi yg sesuai, koneksi ini lalu akan dibelokkan ke mesin dg IP 10.20.30.40, yaitu mesin C, pada port 22.

Singkatnya, jika ada mesin dg IP 1.2.3.4 membuat koneksi ke eth0 di mesin M dg protokol tcp dg 12345, maka koneksi akan dibelokkan ke mesin dg IP 10.20.30.40 pada port 22.

Nah kalau sudah begini, saya dari rumah (yg pake IP 1.2.3.4) bisa membuat koneksi ke mesin C melalui si M tanpa harus membuat koneksi SSH dulu ke M.

rumah$ ssh M -p 12345

Perintah SSH di atas akan langsung terhubung dg mesin C walau koneksi ditujukan ke M karena si M akan membelokkan koneksi ke C.

Selain tuk mengakses C dg SSH langsung dari komputer rumah, yg seperti ini saya pakai juga tuk keperluan lain.. misalnya..

Di mesin M ini saya juga punya sebuah instance virtual machine (VM) dengan VirtualBox. Saya mengaktifkan layanan virtual desktop (dengan RDP) di VirtualBox ini berhubung mesin M ini ada entah-di-mana sehingga saya tidak punya akses fisik langsung. Antara VM dengan host-nya (si M) sudah terjalin hubungan baik melalui jaringan host-only di VirtualBox. Kalau saya ingin mengakses si VM maka, seperti tadi, saya harus mengakses M terlebih dahulu. Dengan melakukan port forwarding, saya bisa mengakses si VM dari C scr langsung.

16/09/11

Pesan commit dari berkas

Saya sedang perlu melakukan banyak commit (seperti biasa, dengan git) berbeda dimana saya ingin memasukkan pesan commit dari sebuah berkas. Kalau saya baca manual dari git-commit, sayangnya Git tidak memiliki fasilitas ini. Git hanya mendukung pemasukkan pesan melalui parameter -m yang saya rasa sangat terbatas atau dengan membuat berkas yg dapat dijadikan sebagai template dari pesan commit. Pembuatan berkas template mungkin mendekati apa yg saya inginkan namun tetap saja saya harus berhadapan dengan teks editor lalu harus menyimpan dan menutupnya sebelum Git dapat melakukan commit. Saya menginginkan semuanya dapat berjalan secara otomatis.

Lalu saya ingat kalau pada dasarnya saya bisa mengganti editor yang akan digunakan oleh Git untuk meminta pengguna memasukkan pesan commit. Pada saat melakukan commit, Git akan memanggil sebuah teks editor dan menunggu sampai teks editor itu ditutup. Berkas yang tadi dibuka oleh teks editor akan dibaca oleh Git lalu isinya dijadikan sebagai pesan commit. Mengatahui alur kerja ini, saya jadi berpikir mengapa tidak membuat teks editor “palsu” saja :D

Teks editor yang digunakan oleh Git dapat diatur, antara lain, dengan mengatur nilai environment variabel EDITOR. Sebagai contoh, jika ingin menggunakan Gedit untuk menulis pesan commit, kita bisa melakukan hal berikut.

$ EDITOR=gedit git commit

Sebuah berkas bernama .git/COMMIT_EDITMSG akan dijadikan parameter saat teks editor tadi dipanggil sehingga berkas tersebut akan secara otomatis dibuka. Setelah teks editor ditutup, isi dari berkas tadi akan dibaca oleh Git dan dijadikan sebagai pesan commit. Kalau saya ingin membuat teks editor palsu, berarti yang saya harus lakukan adalah menulisi berkas yg diberikan oleh Git dengan pesan commit yang saya inginkan.

Sekitar 6 baris kemudian, akhirnya jadi juga sebuah skrip sederhana yang akan menjadi teks editor palsu. Berikut ini kodenya. Wait.. tunggu.. setelah dipikir2 lagi.. aplikasi sejenis itu sudah ada! aplikasi tersebut adalah.. jreng jreng jreng.. cp alias copy! hah?

Begini ceritanya.. saat git commit dipanggil, maka Git akan menjalankan hal berikut.

$EDITOR .git/COMMIT_EDITMSG

Jika nilai EDITOR adalah gedit, maka yang akan dijalankan oleh Git adalah gedit .git/COMMIT_EDITMSG yang akan meminta Gedit untuk membuka berkas .git/COMMIT_EDITMSG. Setelah aplikasi yg disebut di EDITOR dideteksi sudah ditutup, maka Git akan membaca berkas .git/COMMIT_EDITMSG dan menggunakannya (saya udah nulis yg seperti ini berapa kali ya?).

Kalau diteliti lebih lanjut, nilai EDITOR itu juga bisa mengandung parameter lain. Sebagai contoh, Gedit memiliki opsi --new-window yang kalau dipakai, maka berkas yang disebutkan akan dibuka di jendela Gedit baru, bukan sekedar di tab baru dari window yg sudah ada (asumsinya sudah ada window Gedit yg terbuka). Jika Gedit ingin dijalankan dengan opsi ini pada saat melakukan commit, maka yang berikut ini bisa dilakukan.

$ EDITOR="gedit --new-window" git commit

Apakah hal tersebut berlaku untuk opsi (yg dimulai dengan - atau --) apakah bisa parameter lain termasuk nama berkas? Ternyata bisa! Coba saja yg berikut ini.

$ EDITOR="gedit a b c" git commit

Maka selain .git/COMMIT_EDITMSG, berkas a, b, dan c juga akan dibuka oleh Gedit.

Nah, kembali ke cp, bagaimana kita bisa memanfaatkan cp untuk melakukan commit dengan pesan yg dibaca dari sebuah berkas? Jawabannya adalah dengan menjadikan cp sebagai EDITOR dan berkas tadi sebagai parameter pertamanya. Saat commit dipanggil, Git akan memasukkan parameter kedua dan mengeksekusinya. Alhasil, perintah yang dipanggil adalah salin berkas yg disebut ke .git/COMMIT_EDITMSG :D

$ EDITOR="cp /tmp/berkas-berisi-pesan-commit.txt" git commit

Voila! git commit akan keluar seketika namun commit tetap sudah terjadi. Jika melihat log, isi berkas yg disebut akan menjadi pesan commit.

Lho? kok bisa? bisa karena teks editor akan dibuka oleh Git dengan melakukan perintah berikut.

cp /tmp/berkas-berisi-pesan-commit.txt .git/COMMIT_EDITMSG

Perintah tadi akan jalan sekejap dan Git akan otomatis mendeteksi kalau perintah cp sudah selesai dieksekusi. Isi .git/COMMIT_EDITMSG akan diasumsikan sudah berisi pesan commit sehingga bisa digunakan oleh Git :D

10/03/11

Komunikasi .NET dan Python melalui COM

Saat ini saya sedang membutuhkan akses ke sebuah pustaka yang hanya tersedia dalam platform Microsoft .NET. Berhubung apa yang saya buat semuanya tertulis dalam bahasa Python, tepatnya CPython, saya perlu mencari cara bagaimana agar saya bisa mengakses pustaka dalam .NET tersebut dari Python. Setelah ngubek sana sini, akhirnya ketemu juga (salah satu) caranya, yaitu melalui Component Object Model alias COM. Singkatnya, COM ini memungkinkan berbagai aplikasi dengan berbagai bahasa untuk berkomunikasi.

Membuat komponen COM dengan C#

Dalam kasus yang saya hadapi, saya perlu mengakses pustaka .NET dari Python. Oleh karena itu saya membutuhkan sebuah komponen COM yang tertulis dalam, misalnya, C# yang dapat mengakses pustaka tersebut. Komponen dalam C# ini lalu saya atur agar bisa diakses melalui COM sehingga pada akhirnya aplikasi Python saya bisa mengakesenya.

Kali ini saya akan mencontohkan cara membuat sebuah kelas dalam C# yang dapat diakses melalui COM. Kelas ini adalah sebuah kelas kalkulator yang berisi fungsi penjumlahan angka. Contoh ini saya adaptasi dari beberapa referensi bagus yang ada di [1,2,3].

Buat sebuah proyek C# baru bernama Matematika dan kemudian buat sebuah sebuah kelas dengan isi seperti berikut.

namespace Matematika {
    public interface IKalkulator {
        int tambah(int a, int b);
    }

    public class Kalkulator : IKalkulator {
        public int tambah(int a, int b) {
            return a + b;
        }
    }
}

Interface adalah bagian penting dalam pembuatan komponen COM karena dalam COM pengaksesan komponen akan mengacu kepada interface yang dibuat.

Untuk keperluan pendaftaran komponen, kita memerlukan sebuah kunci. Buka Visual Studio Command Prompt, pindah ke direktori proyek (direktori dimana kode sumber berada, bukan direktori Solution-nya visual studio) dan jalankan perintah berikut.

sn.exe -k Matematika.snk

Setelah itu, buka berkas AssemblyInfo.cs (ada di bawah Solution -> Matematika -> Properties) dan tambahkan 3 baris berikut.

[assembly: ComVisible(true)]
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("Matematika.snk")]

Lakukan kompilasi proyek untuk membuat berkas pustaka Matematika.dll. Berkas pustaka ini akan berada di bawah direktori bin\Release yang ada di bawah direktori proyek.

Agar pustaka atau komponen COM ini dapat diakses dari aplikasi lain, kita harus mendaftarkan pustaka ini terlebih dahulu. Untuk ini, kita perlu menggunakan akses sebagai Administrator. Buka Visual Studio Command Prompt lagi namun kali ini sebagai Administrator (Klik kanan di shortcut dan pilih Run as Administrator). Masuk ke direktori tempat pustaka Matematika.dll tadi berada (direktori bin\Release di bawah direktori kerja) lalu jalankan perintah pendaftaran berikut.

regasm.exe Matematika.dll /tlb:Matematika.tlb /codebase

Setelah perintah di atas dijalankan, Anda akan mendapatkan pesan kalau pustaka sudah didaftarkan dan juga sebuah berkas baru bernama Matematika.tlb yang berisi deskripsi mengenai seluruh interface dan struktur data yang ada.

Sebelum lanjut ke cara mengakses komponen tadi, buka lagi berkas AssemblyInfo.cs dan dapatkan tanda pengenal aplikasi yang barusan dibuat. Tanda pengenal ini adalah sebuah GUID yang didefinisikan seperti berikut.

[assembly: Guid("9808bb58-40fe-4373-acc3-f577b55a2a99")]

Deretan angka dan huruf di atas, yaitu 9808bb58-40fe-4373-acc3-f577b55a2a9, akan menjadi (salah satu) tanda pengenal yang dibutuhkan saat mengakses komponen COM tadi.

Mengakses COM dari Python

Python tidak menyediakan dukungan terhadap COM secara langsung sehingga kita perlu memasang modul tambahan yang dapat membantu kita untuk mengakses COM. Saya menemukan ada dua modul yang bisa digunakan, yaitu PyWin32 dan comtypes. Dalam petualangan beberapa hari terakhir ini, saya belum berhasil mengakses COM yang saya buat di .NET dengan bantuan PyWin32 namun comtypes dapat melakukannya dengan cukup mudah. Oleh karena itu, saya akan mencontohkan penggunaan comtypes untuk mengakses komponen COM yang tadi dibuat. Berhubung comtypes itu bukan bawaan asli dari Python, unduh dan pasang dulu modul ini dari http://pypi.python.org/pypi/comtypes.

Kalau sudah, buat sebuah berkas matematika.py yang berisi kode berikut.

import comtypes
import comtypes.client as cc

guid = comtypes.GUID("{9808bb58-40fe-4373-acc3-f577b55a2a99}")
cc.GetModule((guid, 1, 0))

from comtypes.gen import Matematika

obj = cc.CreateObject("Matematika.Kalkulator", None, None,
                      Matematika.IKalkulator)

a = 10
b = 200
hasil = obj.tambah(a, b)

print a, '+', b, '=', hasil

Setelah itu, jalankan dengan python.exe

C:\tmp>c:\Python26\python.exe matematika.py
# Generating comtypes.gen._9808BB58_40FE_4373_ACC3_F577B55A2A99_0_1_0
# Generating comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0
# Generating comtypes.gen.stdole
# Generating comtypes.gen._BED7F4EA_1A96_11D2_8F08_00A0C9A6186D_0_2_0
# Generating comtypes.gen.mscorlib
# Generating comtypes.gen.Matematika
10 + 200 = 210

Dalam eksekusinya, comtypes akan membuat beberapa modul tambahan (yang berfungsi kode penghubung dengan komponen COM) secara otomatis seperti yang diperlihatkan dalam hasil di atas. Modul dan pesan ini hanya akan dibuat satu kali sehingga pada eksekusi selanjutnya pesan di atas tidak akan tampil lagi.

Jika ada perubahan dalam kode C# yang kita buat, selama kita tidak mengubah interface, kita cukup melakukan kompilasi ulang dan pustaka baru akan langsung dipakai. Jika interface berubah, pustaka perlu didaftarkan ulang (dan berkas .tlb-nya juga perlu dibuat ulang) agar perubahan dapat diketahui. Berdasarkan berkas .tlb yang berubah, comtypes akan melakukan pembuatan ulang modul penghubung secara otomatis juga.

Referensi

  1. http://msdn.microsoft.com/en-us/library/aa645738(v=vs.71).aspx
  2. http://support.microsoft.com/kb/828736
  3. http://cppkid.wordpress.com/2009/01/02/how-to-call-a-managed-dll-from-unmanaged-code/
24/02/11

Membuat Certificate Authority bertingkat

Mari langsung ke tutorial saja :D

Membuat Certificate Authority (CA) utama.

  1. Buat direktori kerja.

    $ mkdir ca-utama
    $ cd ca-utama
    
  2. Salin skrip pembantu dari /usr/lib/ssl/misc/CA.pl

    $ cp /usr/lib/ssl/misc/CA.pl .
    
  3. Buat CA baru

    $ ./CA.pl -newca
    CA certificate filename (or enter to create)
    
    
    Making CA certificate ...
    Generating a 1024 bit RSA private key
    ..........++++++
    ..........++++++
    writing new private key to './demoCA/private/cakey.pem'
    Enter PEM pass phrase:
    Verifying - Enter PEM pass phrase:
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:ID
    State or Province Name (full name) [Some-State]:Jakarta
    Locality Name (eg, city) []:Jakarta
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:BlankOn   
    Organizational Unit Name (eg, section) []:Infrastruktur
    Common Name (eg, YOUR name) []:CA
    Email Address []:
    
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
    Using configuration from /usr/lib/ssl/openssl.cnf
    Enter pass phrase for ./demoCA/private/cakey.pem:
    Check that the request matches the signature
    Signature ok
    Certificate Details:
            Serial Number:
                f7:4a:da:34:c1:89:6d:f9
            Validity
                Not Before: Feb 24 15:48:30 2011 GMT
                Not After : Feb 23 15:48:30 2014 GMT
            Subject:
                countryName               = ID
                stateOrProvinceName       = Jakarta
                organizationName          = BlankOn
                organizationalUnitName    = Infrastruktur
                commonName                = CA
            X509v3 extensions:
                X509v3 Subject Key Identifier: 
                    78:DE:57:D2:4D:3E:8A:F8:FD:B6:51:CD:A7:DB:29:B6:C8:EB:4B:42
                X509v3 Authority Key Identifier: 
                    keyid:78:DE:57:D2:4D:3E:8A:F8:FD:B6:51:CD:A7:DB:29:B6:C8:EB:4B:42
                    DirName:/C=ID/ST=Jakarta/O=BlankOn/OU=Infrastruktur/CN=CA
                    serial:F7:4A:DA:34:C1:89:6D:F9
    
    
    
            X509v3 Basic Constraints: 
                CA:TRUE
    
    Certificate is to be certified until Feb 23 15:48:30 2014 GMT (1095 days) Write out database with 1 new entries Data Base Updated

Sertifikat CA akan disimpan di demoCA/cacert.pem. Untuk melihat informasi detil mengenai sebuah sertifikat, kita bisa menggunakan openssl seperti berikut.

 $ openssl x509 -in demoCA/cacert.pem -text

Salah satu karakteristik sertifikat CA adalah sertifikat ini dipakai untuk menandatangani dirinya sendiri. Dalam informasi sertifikat, hal ini bisa dilihat pada bagian Subject dan Issuer.

 $ openssl x509 -in demoCA/cacert.pem -text |grep 'Subject:\|Issuer'
         Issuer: C=ID, ST=Jakarta, O=BlankOn, OU=Infrastruktur, CN=CA
         Subject: C=ID, ST=Jakarta, O=BlankOn, OU=Infrastruktur, CN=CA

Bisa dilihat isi keduanya sama, hal ini menunjukkan self-signed certificate atau sertifikat yang ditandatangani sendiri.

Membuat sertifikat baru

  1. Buat permintaan sertifikat baru

    $ ./CA.pl -newreq
    Generating a 1024 bit RSA private key
    ..................++++++
    ..................++++++
    writing new private key to 'newkey.pem'
    Enter PEM pass phrase:
    Verifying - Enter PEM pass phrase:
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:ID
    State or Province Name (full name) [Some-State]:Jakarta
    Locality Name (eg, city) []:Jakarta
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:BlankOn
    Organizational Unit Name (eg, section) []:Irgsh
    Common Name (eg, YOUR name) []:CA Pabrik
    Email Address []:
    
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
    Request is in newreq.pem, private key is in newkey.pem
    
  2. Tanda tangani permintaan sertifikat tersebut dengan CA yang ada

    $ ./CA.pl -sign
    Using configuration from /usr/lib/ssl/openssl.cnf
    Enter pass phrase for ./demoCA/private/cakey.pem:
    Check that the request matches the signature
    Signature ok
    Certificate Details:
            Serial Number:
                f7:4a:da:34:c1:89:6d:fa
            Validity
                Not Before: Feb 24 15:56:26 2011 GMT
                Not After : Feb 24 15:56:26 2012 GMT
            Subject:
                countryName               = ID
                stateOrProvinceName       = Jakarta
                localityName              = Jakarta
                organizationName          = BlankOn
                organizationalUnitName    = Irgsh
                commonName                = CA Pabrik
            X509v3 extensions:
                X509v3 Basic Constraints: 
                    CA:FALSE
                Netscape Comment: 
                    OpenSSL Generated Certificate
                X509v3 Subject Key Identifier: 
                    05:B3:34:C6:A8:64:A8:C1:E1:5B:B6:03:93:5C:38:19:CA:41:DF:48
                X509v3 Authority Key Identifier: 
                    keyid:78:DE:57:D2:4D:3E:8A:F8:FD:B6:51:CD:A7:DB:29:B6:C8:EB:4B:42
    
    
    Certificate is to be certified until Feb 24 15:56:26 2012 GMT (365 days)
    Sign the certificate? [y/n]:y
    
    
    1 out of 1 certificate requests certified, commit? [y/n]y
    Write out database with 1 new entries
    Data Base Updated
    Signed certificate is in newcert.pem
    

Setelah ditandatangani, akan ada 3 buah berkas yaitu newcert.pem, newkey.pem, dan newreq.pem. Berkas newreq.pem bisa dihapus karena sudah tidak dipakai lagi. Berkas ini hanya berisi permintaan pembuatan sertifikat, bukan sertifikat akhir. Berkas newcert.pem dan newkey.pem adalah dua berkas yang harus diamankan karena berkas ini adalah berkas sertifikat dan kuncinya.

Mari kita cek judul dan penerbit sertifikat baru ini.

    $ openssl x509 -in newcert.pem -text | grep 'Subject:\|Issuer:'
            Issuer: C=ID, ST=Jakarta, O=BlankOn, OU=Infrastruktur, CN=CA
            Subject: C=ID, ST=Jakarta, L=Jakarta, O=BlankOn, OU=Irgsh, CN=CA Pabrik

Sekarang kita punya sebuah sertifikat baru yang telah ditandatangani oleh CA yang kita buat di awal.

Menjadikan sertifikat baru sebagai CA kedua

  1. Siapkan direktori kerja baru

    $ cd ..
    $ mkdir ca-kedua
    $ cd ca-kedua
    $ cp /usr/lib/ssl/misc/CA.pl .
    
  2. Agar skrip CA.pl dapat bekerja, kita harus mempersiapkan lingkungan kerjanya dengan opsi -newca. Namun alih-alih menyuruh skrip tersebut untuk membuat sertifikat CA baru, kita bisa menggunakan sertifikat yang sudah ada.

    $ ./CA.pl -newca
    CA certificate filename (or enter to create)
    ../ca-utama/newcert.pem
    
  3. Salin berkas kunci sertifikat

    $ cp ../ca-utama/newkey.pem demoCA/private/cakey.pem
    
  4. Siapkan nomor seri baru.

    $ echo 00 > demoCA/serial
    

Sama seperti sebelumnya, sertifikat CA ada di demoCA/cacert.pem. Mari kita cek isinya.

$ openssl x509 -in demoCA/cacert.pem -text | grep 'Subject:\|Issuer:'
        Issuer: C=ID, ST=Jakarta, O=BlankOn, OU=Infrastruktur, CN=CA
        Subject: C=ID, ST=Jakarta, L=Jakarta, O=BlankOn, OU=Irgsh, CN=CA Pabrik

Persis sama dengan sertifikat yang dibuat sebelumnya kan? Memang sertifikat itu yang akan dipakai menjadi CA baru ini.

Buat sertifikat dengan CA tingkat kedua tadi

  1. Buat permintaan sertifikat seperti biasa

    $ ./CA.pl -newreq
    Generating a 1024 bit RSA private key
    ............++++++
    ............++++++
    writing new private key to 'newkey.pem'
    Enter PEM pass phrase:
    Verifying - Enter PEM pass phrase:
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:ID
    State or Province Name (full name) [Some-State]:Jakarta
    Locality Name (eg, city) []:Jakarta
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:BlankOn
    Organizational Unit Name (eg, section) []:Pabrik
    Common Name (eg, YOUR name) []:Pekerja64
    Email Address []:
    
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
    Request is in newreq.pem, private key is in newkey.pem
    
  2. Tandatangani

    $ ./CA.pl -sign
    Using configuration from /usr/lib/ssl/openssl.cnf
    Enter pass phrase for ./demoCA/private/cakey.pem:
    Check that the request matches the signature
    Signature ok
    Certificate Details:
            Serial Number: 0 (0x0)
            Validity
                Not Before: Feb 24 16:05:13 2011 GMT
                Not After : Feb 24 16:05:13 2012 GMT
            Subject:
                countryName               = ID
                stateOrProvinceName       = Jakarta
                localityName              = Jakarta
                organizationName          = BlankOn
                organizationalUnitName    = Pabrik
                commonName                = Pekerja64
            X509v3 extensions:
                X509v3 Basic Constraints: 
                    CA:FALSE
                Netscape Comment: 
                    OpenSSL Generated Certificate
                X509v3 Subject Key Identifier: 
                    15:0E:2E:71:C3:AF:4A:A4:99:01:D5:C8:3E:CF:EB:9F:08:3D:85:1D
                X509v3 Authority Key Identifier: 
                    keyid:05:B3:34:C6:A8:64:A8:C1:E1:5B:B6:03:93:5C:38:19:CA:41:DF:48
    
    
    Certificate is to be certified until Feb 24 16:05:13 2012 GMT (365 days)
    Sign the certificate? [y/n]:y
    

1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated Signed certificate is in newcert.pem

Seperti biasa, kita akan menjumpai 3 berkas baru. Mari cek informasi sertifikat baru ini.

    $ openssl x509 -in newcert.pem -text | grep 'Subject:\|Issuer:'
            Issuer: C=ID, ST=Jakarta, L=Jakarta, O=BlankOn, OU=Irgsh, CN=CA Pabrik
            Subject: C=ID, ST=Jakarta, L=Jakarta, O=BlankOn, OU=Pabrik, CN=Pekerja64

Dapat dilihat sertifikat baru ini ditandatangani oleh CA kedua yang kita buat.

Bertingkat

Mari kita lihat informasi 3 sertifikat yang telah kita buat.

  1. CA utama

    $ openssl x509 -in ../ca-utama/demoCA/cacert.pem -text | grep 'Subject:\|Issuer:'
            Issuer: C=ID, ST=Jakarta, O=BlankOn, OU=Infrastruktur, CN=CA
            Subject: C=ID, ST=Jakarta, O=BlankOn, OU=Infrastruktur, CN=CA
    
  2. CA kedua

    $ openssl x509 -in demoCA/cacert.pem -text | grep 'Subject:\|Issuer:'
            Issuer: C=ID, ST=Jakarta, O=BlankOn, OU=Infrastruktur, CN=CA
            Subject: C=ID, ST=Jakarta, L=Jakarta, O=BlankOn, OU=Irgsh, CN=CA Pabrik
    
  3. Sertifikat biasa

    $ openssl x509 -in newcert.pem -text | grep 'Subject:\|Issuer:'
            Issuer: C=ID, ST=Jakarta, L=Jakarta, O=BlankOn, OU=Irgsh, CN=CA Pabrik
            Subject: C=ID, ST=Jakarta, L=Jakarta, O=BlankOn, OU=Pabrik, CN=Pekerja64
    

Apakah terlihat hubungan antara ketiga sertifikat di atas?

10/02/11

apt-web

Sudah tersedia melalui Chrome Web Store :D

07/02/11

Metaclass di Python

Ternyata metaclass di Python itu sangat menarik karena kita bisa melakukan ilmu hitam :D Salah satu ilmu hitam yang sedang/akan saya pakai adalah membuat deklarasi kelas yang baru saja dibuat menjadi lenyap secara tiba2 dan alih-alih kita mendapatkan sebuah objek/instance dari kelas tersebut.

Mengapa saya memerlukan sesuatu yang "aneh" seperti ini? Singkatnya saya sedang membuat semacam domain specific language yang berbasiskan Python. Dengan menggunakan trik sulap di atas, saya bisa membuat bahasa yang saya buat tadi menjadi lebih mudah dipakai. Maaf kalo saya blom bisa menjelaskan dg lebih detail.

Di Python, metaclass bisa digambarkan sebagai sebuah kode yang dijalankan saat sebuah kelas dideklarasikan. Dengan demikian kita bisa mengutak atik wujud sebuah kelas sebelum kelas teresebut siap dipakai. Contoh penggunaan dasarnya adalah sebagai berikut.

class MetaProvinsi(type):
    def __new__(cls, name, bases, attrs):
        return type.__new__(cls, name, bases, attrs)

class Provinsi(object):
    __metaclass__ = MetaProvinsi

Pada contoh di atas, ada sebuah kelas bernama Provinsi yang memiliki metaclass MetaProvinsi. Kode pada fungsi __new__ di atas adalah bagian kode yang dapat diisi untuk mengubah wujud kelas Provinsi. Fungsi ini menerima 4 buah parameter yaitu:

  1. cls yang menunjuk ke diri sendiri (yaitu MetaProvinsi),
  2. name yang berisi nama kelas yang dibuat (dalam contoh di atas, name berisi Provinsi),
  3. bases yang berisi daftar kelas yang diturunkan oleh si Provinsi (yaitu object), dan
  4. attrs yang berupa sebuah dictionary berisi daftar atribut (instance variables dan/atau methods) dari Provinsi.

Metaclass pada contoh di atas masih tidak melakukan hal apa-apa sehingga kelas Provinsi tsb sebenarnya tidak mengalami perubahan apa-apa. Sekarang mari kita ubah sedikit contoh di atas.

class MetaKabupaten(type):
    def __new__(cls, name, bases, attrs):
        attrs['nama_kelas'] = name
        return type.__new__(cls, name, bases, attrs)

class Kabupaten(object):
    __metaclass__ = MetaKabupaten

Kali ini kita mengubah dict attrs dengan menambahkan sebuah isian dengan kunci nama_kelas yang berisi nilai dari variabel name, yaitu nama kelas yang baru saja dibuat yaitu Kabupaten.

Apa bedanya contoh pertama dengan kedua? mari kita buat objek dari kelas Provinsi dan Kabupaten yang sudah dideklarasikan di atas.

p = Provinsi()
print p.nama_kelas

Andai kode di atas dijalankan, maka Python akan mengatakan bahwa atribut nama_kelas tidak ditemukan pada objek dari kelas Provinsi

AttributeError: 'Provinsi' object has no attribute 'nama_kelas'

Alasannya sudah jelas karena pada saat mendeklarasikan kelas Provinsi (maupun saat menginisialisasi kelas tersebut), kita tidak pernah membuat sebuah instance variable bernama nama_kelas. Sekarang kita coba dengan kelas Kabupaten

k = Kabupaten()
print k.nama_kelas

Bukan sulap bukan sihir, Python dapat dijalankan sampai selesai dan kita mendapat sebuah keluaran di layar seperti berikut.

Kabupaten

Keluaran tersebut dihasilkan dari k.nama_kelas yaitu nilai sebuah instance variable bernama nama_kelas dari objek k yang dibangun dari kelas Kabupaten. Kapan instance variable nama_kelas tersebut hadir? Jawabannya adalah pada saat kelas Kabupaten tersebut dibuat, lebih tepatnya dilakukan oleh metaclass MetaKabupaten.

Sekian dulu pengantar penggunaan Metaclass dari saya. Lain kali saya contohkan ilmu hitam yg sedang saya pakai maupun contoh pe(nyalah)gunaan lainnya. Contoh kode bisa dilihat di https://gist.github.com/814525

06/02/11

IPv6

Website yang saya pelihara berikut sudah bisa diakses via IPv6, terima kasih tuk Dreamhost. Selamat menikmati..

fajran.web.id blog.fajran.web.id dahsy.at apt-web.dahsy.at csui02.net planet.csui02.net

04/02/11

Slide tutorial Git

Bulan Desember kemarin saya sempat membuat dua buah slide mengenai Git. Slide ini sempat dipakai tuk tutorial di kanal IRC #debian-l10n-indonesian di irc.debian.org. Sebenernya masih ada (minimal) 1 slide lagi yg pengen saya buat, yaitu mengenai percabangan di Git.. namun.. belom sempet lagi xD Ya sudah lah nikmati saja apa yg ada dulu. Semoga bermanfaat :)

Pengenalan Git

Berkolaborasi dengan Git