Introduction

Dear all , Thank You for coming to my blogspot



Jan 20, 2011

Merancang Transport Layer Security (TLS) untuk koneksi jabber protocol

Apakabar teman2 :) pada kesempatan kali ini aku akan coba publish teknikal specifikasi pembuatan TLS. TLS dan SASL adalah 2 bagian berbeda dimana TLS ibarat mobil truck dan SASL adalah  isinya yg sudah dienkripsi dengan method SHA64 dan MD5. TLS adalah bentuk transport yg dienkripsi dan dapat berjalan di mode port normal mirip dengan SSL.
Untuk lebih mudahnya kalian memahami pembahasan kali ini ikuti pemaparan aku dibawah ini :
TLS pada jabber akan aktif bilamana tertera tag seperti ini
<stream:features>starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'><required/></starttls><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'> <mechanism>DIGEST-MD5</mechanism><mechanism>PLAIN</mechanism></mechanisms>
</stream:features>
Tag required bisa ada bisa juga tidak, sejak required maka koneksi wajib menggunakan TLS namun bila tidak tercantum tag required maka kamu boleh saja terus melakukan konkesi tanpa TLS. Untuk dapat mempergunakannya maka kita perlu mengaktifkan ssl Stream dan X509Certificate.
ok kita mulai saja algoritmanya, diharapkan kalian sudah paham bagaimana cara membuat pemrograman client server menggunakan socket bahasa C# dan dotnet framework

bahan-bahan :
===========
1. Socket (untuk advance programming) bila kesulitan cukup pake TCPCLientSocket class
2. NetworkStream (bila menggunakan Socket class)
3. Stream adalah basic dari socket dan networkstream dan tcpclient
4. SSLStream,dalam hal ini aku berasumsi menggunakan Socket bukan menggunakan TCPClient

cara merancang :
=============
1. Aktifkan socket dan arahkan pada endpoint salah satu hostip sebuah server jabber dan tentukan port sesuai port yang telah ditetapkan server jabber tersebut (catatan nimbuzz sampai saat ini menggunakan protocol jabber)
2. lakukan koneksi secara Asynchronous. bila done maka aktifikan 1 NetworkStream menyambung dari socket yg sudah terkoneksi tadi
3. kemudian casting networkstrem ke IO stream.
4. untuk selanjutnya kita melakukan receive sending data tidak menggunakan socket dan networkstream. melainkan menggunakan Stream IO, fungsi2 yg dipakai adalah write stream dan read stream.
5. merujuk point 2 ketika koneksi terbentuk dan point 3 dan 4 sudah di panggil
6. Selanjutnya kita laukan inisiasi awal ke server jabber tujuan dengan mengirim XML scirpt :
<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' from='example.com' version='1.0'>
example.com diatas isi dengan nama domain jabber dimana kamu lakukan koneksi. Bila proses lancar maka dari server akan mendapatkan balasan script :
<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' from='example.com' version='1.0'>
dan
<stream:features><starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'><required/></starttls><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>DIGEST-MD5</mechanism><mechanism>PLAIN</mechanism></mechanisms></stream:features>
Sekarang kalian simak pada script balasan ke 2, tertera required, artinya server target koneksi kamu menentapkan wajib menggunakan TLS, bila tidak ada reguired maka kalian boleh by pass pengaktifan TLS mode sehingga akan berjalan pada mode normal.dikarenakan pembahasan kali ini tentang TLS maka kita harus terus jalan kan mode TLS ini.

Ciri dari penawaran TLS dari server terdapat tag starttls dst, maka dari sini kita coba request ke server untuk mengaktifkan mode TLS caranya kirim script ini :
<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
kemudian server akan membalas dengan script dibawah ini :
<proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
Sebelum lanjut ke point berikutnya kemungkinan server juga menolak atau terjadi hal2 yg menyebabkan proses response server terganggu sehingga server merespon dengan tag seperti ini :
<failure xmlns='urn:ietf:params:xml:ns:xmpp-tls'/></stream:stream>
Sejak server menjawab dengan tag tersebut diatas maka proses TLS dibatalkan dan koneksi menggunakan SSLStream tidak dapat dilanjutkan, kemudian process deadlock, solusinya koneksi refrash dari awal atau kembali ke mode normal itupun bila tag required tidak tercantum pada saat pertama request koneksi ke server jabber tujuan.

7. baiklah kita asumsikan server merespon dengan tag ini

     <proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>

maka pembahasan inti kita kali ini berlanjut dibawah ini setelah tag

     <proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>

dari server maka langkah selanjutnya kita aktifkan SSLstream, set Protocol pada mode SslProtocol.TLSkemudian aktifkan 1 SSLStream dan inisiasi validateservercertificate dan balikannya set selalu true. contoh fungsi seperti dibawah ini :
public void RunningTLS()
{
       try
       {
            SslProtocols protocol = SslProtocols.Tls;
            m_SSLStream = null;
            m_SSLStream = new SslStream(m_Stream, false,
            new RemoteCertificateValidationCallback(
            ValidateServerCertificate), null);

            m_SSLStream.AuthenticateAsClient(set_account.Hostip, null,
            protocol, true);m_NetworkStream = m_SSLStream;
            m_SSL = true;
      }
}

catch (AuthenticationException e)
{
      return;
}
catch (Exception ex)
{
     string s = ex.Message;
}


private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
     return true;
}
perhatikan cukup mudah bukan :D dotnet is powerfull perlu diingat m_NetworkStream yang tadinya adalah stream normal maka sejak SSLStream connection terjadi kamu perlu passing m_NetworkStream diatas menjadi mode SSLStream (catatan kedua duanya adalah object stream yang 1 stream yg 1 nya sslstream) sooo jadi deh TLSnya.
catatan bagian ini

m_SSLStream.AuthenticateAsClient (set_account.Hostip, null, protocol, true);

letakkan hostip sesuai dengan hostip yg kalian set ketikan akan koneksi dari proses awal jangan sampe salah :)
kalian bisa gunakan fungsi diatas dan itu standard. selanjutnya bila koneksi SSL sudah terbentuk maka sejak itu session SSL bisa dipakai dan kalian perlu inisiasi keserver memberitahukan tranpsortmu siap untuk mode TLS, send lagi script ini kedua kali


    <stream:stream
    xmlns='jabber:client'
    xmlns:stream='http://etherx.jabber.org/streams'
    to='example.com'
    version='1.0'>

ingat ea example.com harus dirubah sesuai domain chating kamu, bila done maka server akan meresponse dengan script xmpp sebagai berikut
    <stream:stream
    xmlns='jabber:client'
    xmlns:stream='http://etherx.jabber.org/streams'
    from='example.com'
    id='c2s_234'
    version='1.0'>
    <stream:features>
    <mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
    <mechanism>DIGEST-MD5</mechanism>
    <mechanism>PLAIN</mechanism>
    <mechanism>EXTERNAL</mechanism>
    </mechanisms>
    </stream:features>

dst ............................
perhatikan, tag diatas dst dapat lanjut ke mode login SASL atau tidak :D baca note aku yang lain di RMD NFC.
sekian pembahasanku kali ini bila ada pertanyaan ajukan dalam comment. perlu kalian ketahui bawah note ini bukan untuk orang yg baru mau akan belajar programming :) tetapi diperuntukkan bagi orang yg memang hobi socket programming atau advance programmer. So, walau pun kalian tidak paham minimal dapat wawasan dari sini.
mode TLS sudah aku terapkan didalam Chating Warrior pro versi 1.1.7. Niat aku membuat 1 App chating utuh yang berbeda dari app chating yang lain :) dan menjadi ciri khas Chating warrior :)


See you


romeo_must_die

2 comments :

P3!N_52 said...

;) tq buat penjelasannya kang........

:D walaupun msh susah ku cerna tpi bgus lah buat nmbah pngetahuan

Anonymous said...

Bagusnya share cara buat zombie......

About Me

I am a Man