إلغاء القيود المفروضة على ال applets
السلام عليكم
عند تشغيل applet ما داخل المتصفح، فإنه يشتغل داخل إطار أمني محدد، حيث يمكن لل applet القيام ببعض العمليات فقط، بينما لا يستطيع القيام بعمليات أخرى، مثل الوصول إلى ملفات المستخدم، أو فتح إتصال مع جهاز آخر مع الشبكة (ما عدا الجهاز الذي تم تحميل ال applet منه).
لتجاوز هذه القيود، يمكن إضافة signature للأرشيف jar الذي يحتوي عى الapplet.
توليد مفتاح خاص باستعمال الأداة keytool
هذه الأداة تقوم بتوليد المفتاح الخاص private key الذي سنستعمله عند عمل signing للأرشيف jar. يتم تخزين هذا المفتاح في ملف يسمى keystore.
الأداة keytool تمتلك عدة أوامر، لكننا سنستعمل أمرا واحدا، وهو الخاص بتوليد المفتاح : genkey-
هذا الأمر ينتظر العديد من الخيارات، من بينها:
-alias: إسم المفتاح
-validity: مدة اعتماد المفتاح
-keystore: مسار الملف الذي سيتم فيه تخزين المفتاح
مثلا، السطر التالي
keytool -genkey -alias herch -validity 365
يقوم بتوليد مفتاح بإسم "herch"، ومدة صلاحيته تمتد لسنة كاملة. بما أننا لم نحدد مكان ال keystore، فإن الأداة ستستخدم المسار الإفتراضي، أي ملف بإسم "keystore." داخل المجلد الخاص بالمستخدم.
عند تنفيد الأمر أعلاه، يقوم البرنامج أولا بطلب كلمة السر بالنسبة لل keystore (سيتم طلب كلمة السر هذه عند عمل ال signing)، ثم بطرح بعض الأسئلة، مثل الإسم والعنوان ...، كما يظهر في الصورة ( الأسئلة بالفرنسية لأن لغة النظام عندي هي الفرنسية)
الأداة jarsigner
بعد أن قمنا بتوليد المفتاح، سنقوم بإضافة إمضاء signature إلى الأرشيف jar الذي يحتوي على ال applet، وذلك باستعمال الأداة jarsigner.
هذه الأداة تقبل عدة خيارات، لكن هناك خياران إجباريان فقط، وهما إسم الأرشيف jar الذي سنطبق عليه الإمضاء، وإسم المفتاح الذي نريد استعماله.
jarsigner myAppletJar.jar herch
في الأمر السابق، نقوم بإضافة إمضاء إلى الأرشيف myAppletJar.jar باستعمال المفتاح "herch". إذا كنتم تتساءلون عن مصدر الإسم، فهو نفس الإسم الذي مررناه للأداة keytool بعد الخيار alias.
مثال
سنقوم بتشغيل applet بسيط يقوم بمحاولة فتح ملف عند المستعمل، ونرى تصرفه فيل إضافة الإمضاء وبعده.
ال applet
import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
* NewJApplet.java
*
* Created on 14 juin 2010, 20:17:24
*/
/**
*
* @author issam
*/
public class NewJApplet extends javax.swing.JApplet {
/** Initializes the applet NewJApplet */
public void init() {
try {
java.awt.EventQueue.invokeAndWait(new Runnable() {
public void run() {
initComponents();
}
});
} catch (Exception ex) {
JOptionPane.showMessageDialog(rootPane, ex.getMessage());
}
}
/** This method is called from within the init() method to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
btnOpenFile = new javax.swing.JButton();
btnOpenFile.setText("Open a file");
btnOpenFile.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnOpenFileActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(btnOpenFile, javax.swing.GroupLayout.PREFERRED_SIZE, 189, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(20, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(btnOpenFile)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
}// </editor-fold>
private void btnOpenFileActionPerformed(java.awt.event.ActionEvent evt) {
File file = null;
JFileChooser chooser = new JFileChooser();
int result = chooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
try {
file = chooser.getSelectedFile();
Desktop.getDesktop().open(file);
} catch (IOException ex) {
JOptionPane.showMessageDialog(rootPane, ex.getMessage());
}
}
}
// Variables declaration - do not modify
private javax.swing.JButton btnOpenFile;
// End of variables declaration
}أغلب الكود هو فقط لبناء الواجهة. الكود الذي يهمنا هو الموجود داخل btnOpenFileActionPerformed، حبث نريد الوصول إلى ملفات المستخدم.
الصفحة html
<html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <applet code="NewJApplet" archive="SigningApplet.jar"></applet> </body> </html>
عند تشغيل الصفحة، والضغط على الزر، لا شيء يحدث، أو بالأحرى ما يحدث هو أنه يتم رفع استثناء:
java.security.AccessControlException: access denied (java.util.PropertyPermission user.home read)
نقوم بعد ذلك بعمل signing للأرشيف، باستعمال الأمر التالي
jarsigner SigningApplet.jar herch
طبعا هنا استعملت المفتاح الذي أنشأته سابقا.
الأن، عند تشغيل ال applet، ستظهر لنا نافذة مثل التي في الصورة، تسأل المستخدم هل يريد تنفيد البرنامج أم لا.
وعند القبول، يصبح لل applet الحق في الوصول إلى الملفات الموجودة في الجهاز.
روابط مفيدة
Creating a Trusted Applet with Local File System Access Rights
Signing and Verifying JAR Files
المشروع (netbeans) في المرفقات
That's all folks ![]()



