Perjalananku mengenal "kulitnya" tanda tangan digital bermula sebelum dipopulerkan oleh kominfo sivion.id, yaitu ketika mempelajari protokol EDIINT AS2 yang digunakan oleh domain "web" as2.amazonsedi.com, x2.edi-indonesia.co.id, dan gem.wal-mart.com:5080. Protokol tersebut menurut IETF dirancang oleh Pak Dale Moberg yang selesai tahun 2005 silam, beliau seorang arsiteknya axway, ketika acara BCA Finhacks 24 april 2016 Pak Axel Grosse sebagai API Lead dari Axway juga diundang. Namun bila dilihat berdasarkan draft-nya AS1, sudah bermula sejak 19 Oktober 1996, berikut draft pertama AS1 MIME-based Secure EDI, dalam daftar penyusun draft tersebut terdapat nama Chuck Shih, pegawai Actra, perusahaan gabungan General Electric Information Services dan Netscape pada April 1996. Tanda tangan digital dalam protokol EDIINT AS2 digunakan untuk menandatangani tubuh permintaan serta tanggapan HTTP, sehingga baik di tubuh permintaan dan tanggapan HTTP selain berisi data, juga berisi tanda tangan digital. Pengetahuan saya tentang tanda tangan digital sementara hanya itu, selebihnya baru mencoba belajar melalui praktek.

Menurut Pak Phillip Helger, EDIINT AS2 pada dasarnya "hanyalah" pesan S/MIME melalui HTTP. Sedangkan S/MIME sendiri menurut dokumentasi RESTEasyCrypto buah karya Pak Bill Burke, arsitek Red Hat JBoss, adalah standar enkripsi dan tanda tangan kunci publik untuk data MIME. Data MIME merupakan sehimpunan header dan tubuh pesan. Umumnya anda akan menemukannya dalam dunia surel ketika seseorang ingin mengenkripsi dan/atau menandatangani tubuh surel yang mereka kirim melalui jaringan Internet. S/MIME juga bisa digunakan untuk mengenkripsi tubuh permintaan HTTP, dan bukti nyata ya keberadaan "web" as2.amazonsedi.com, x2.edi-indonesia.co.id, dan gem.wal-mart.com:5080 di atas. RESTEasy Crypto mempermudah anda mengenkripsi dan/atau menandatangani tubuh permintaan atau tanggapan HTTP menggunakan standar S/MIME. Berikut tampilan konfigurasi AS2 Server di Amazon Vendor Central:

Menandatangani Tubuh Pesan HTTP

S/MIME yang umumnya digunakan untuk menandatangani pesan surel, juga bisa digunakan untuk menandatangani tubuh pesan permintaan HTTP. S/MIME menggunakan tipe media multipart/signed yang merupakan pesan multipart yang mengandung entitas dan tanda tangan digital, jadi S/MIME merupakan tipe media tersendiri. Pendekatan semacam ini memaksa client untuk mengetahui bagaimana cara membaca pesan multipart.

RESTEasy menyediakan dua antarmuka untuk membuat pesan multipart/signed. Jika client atau server ingin mengirim permintaan atau tanggapan HTTP dengan tubuh bertipe multipart/signed, anda bisa menggunakan tipe org.jboss.resteasy.security.smime.SignedOutput. Tipe tersebut memerlukan java.security.PrivateKey dan java.security.cert.X509Certificate milik pengirim untuk membuat tanda tangan digital. Anda bisa mendapatkan java.security.cert.X509Certificate dari CA root seperti Kominfo CA, dengan bantuan alat openssl yang tersedia untuk sembarang sistem operasi, atau bisa juga menggunakan alat keytool bawaan JDK.

Enkripsi Tubuh Pesan HTTP

Kalau HTTPS digunakan untuk mengenkripsi seluruh pesan HTTP, enkripsi S/MIME digunakan hanya untuk tubuhnya permintaan atau balasan HTTP. Hal ini berguna jika anda mempunyai representasi yang mungkin diperantarai oleh banyak pihak dan anda ingin melindungi pesan dari mata-mata ketika melewati berbagai perantara di dalam jaringan. RESTEasy Crypto menyediakan dua antarmuka untuk mengenkripsi tubuh permintaan HTTP, satu untuk luaran satu untuk masukan. Jika client atau server ingin mengirim permintaan atau balasan HTTP dengan tubuh terenkripsi, anda bisa menggunakan tipe org.jboss.resteasy.security.smime.EnvelopedOutput. Untuk mengenkripsi diperlukan sertifikat X509 milik penerima.

Berikut adalah contoh penggunaan antarmuka SignedOutput dan EnvelopedOutput :

LineItem produks[] = new LineItem[]{
    new LineItem("SlimFast"),
    new LineItem("Gillette Venus Razors (P&G)"),
    new LineItem("Listerine (Warner-Lambert)"),
    new LineItem("Oil of Olay ColorMoist Hazelnut No. 650 (P&G)")
};
SignedOutput signed = new SignedOutput(produks, MediaType.APPLICATION_JSON);
    signed.setPrivateKey(this.buyerPrivateKey);//java.security.PrivateKey
    signed.setCertificate(this.buyerPublicKey);//java.security.cert.X509Certificate
EnvelopedOutput output = new EnvelopedOutput(signed, "multipart/signed");
    output.setCertificate(this.sellerPublicKey);//java.security.cert.X509Certificate
    return this.mWebTarget.path("0e753acc-296d-425a-80f9-c67c1e0095c8")
        .request()
        .header("AS2-From", this.username)
        .post(Entity.entity(output, "*/*"));

Untuk menggunakan SignedOutput, anda perlu memberikan data entah berupa objek tunggal atau larik beserta tipe medianya yang diberikan kepada konstruktor milik SignedOutput. Jadi dalam contoh ini, kita mengambil larik LineItem dan mengubahnya ke JSON sebelum menandatanganinya. RESTEasy lalu akan menandatangani SignedOutput menggunakan kerangkakerja SpongyCastle. Hasil luarannya akan menjadi seperti berikut:

Untuk mendapatkan pesan larik json di bagian _Part_1_59761619.1482132402426 diatas kita bisa menggunakan fungsi bawaan php openssl_pkcs7_verify. Anda juga perlu X509Certificate milik pengirim. Berikut contohnya:

openssl_pkcs7_verify($signedMessage, PKCS7_NOVERIFY | PKCS7_NOINTERN | PKCS7_NOCHAIN, $tempcert, array(), $public_key_pengirim, $kontenku);, fungsi tersebut akan mengembalikan nilai TRUE jika tanda tangan terverifikasi.

Sama seperti SignedOutput, argumen untuk konstruktor EnvelopedOutput antara lain objek yang ingin anda kirim serta tipe media yang ingin digunakan nantinya. Jadi misal dalam kasus protokol EDIINT AS2, objeknya bertipe SignedOutput dan dengan tipe media "multipart/signed". RESTEasy akan mengenkripsi EnvelopedOutput menggunakan SMIME milik kerangka kerja SpongyCastle. Di bawah ini adalah wujud tubuh permintaan HTTP multipart/signed seperti di atas yang telah terenkripsi dengan algoritma 1.2.840.113549.3.7, saya mengirim pesan tersebut dari aplikasi android EDIINT AS2, meskipun namanya EDIINT (edi over internet) yang mana memiliki tipe media application/EDIFACT atau application/EDI-X12, tapi protokolnya tidak membatasi tipe media yang boleh digunakan.

Content-Disposition: attachment; filename="smime.p7m"
Content-Type: application/pkcs7-mime; smime-type=enveloped-data; name="smime.p7m"
Content-Transfer-Encoding: base64

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

Untuk mendekripsi pesan yang terenkripsi SMIME, anda bisa menggunakan fungsi bawaan php openssl_pkcs7_decrypt. Anda juga perlu PrivateKey dan X509Certificate milik penerima. Berikut contohnya:

openssl_pkcs7_decrypt($infile, $outfile, $receiver_public_key, $receiver_private_key);, fungsi tersebut cukup memberikan alamat berkas yang terenkripsi, alamat berkas hasil dekripsi, String berkas kunci publik berwujud pem, dan string kunci privat berwujud pem.

Nah projek ini dikatakan sukses, bila as2 client bisa terhubung dengan as2 server milik mendelson berikut http://testas2.mendelson-e-c.com:8080/as2/HttpReceiver, karena menurut blog di sap (Easy-to-use AS2 software – part I) dan projek milik pak Phillip Helger (MainSendToMendelsonTest.java) juga melakukan pengujiannya kesana, tapi saya sendiri menyerah untuk membuat implementasi sendiri, lha saya cuman individu je. Tapi, kalau pembaca ada yang tertarik, silahkan fork dan clone repo github saya berikut ini https://github.com/dawud-tan/SpongyCastleSmimeTestApp, lalu jalankan server yang ethake as2 dengan slim framework berikut https://github.com/dawud-tan/Slim-smime-skeleton tinggal dijalankan dengan cara php composer.phar start.

  1. Channel9.msdn.com. (2007). Tony Bernard on BizTalk. [online] Available at: https://channel9.msdn.com/Blogs/Rory/Tony-Bernard-on-BizTalk [Accessed 2 Dec. 2016].
  2. Michelle, "Supply chain management practices in Wal mart and Ikea", S.E., UNIVERSITAS INDONESIA, 2014.

Reaksi:

You Might Also Like:

Add your comment Hide comment

Hello, how may we help you? Just send us a message now to get assistance.

Facebook Messenger ×