التحقق من شهادات Java – التحقق من الشهادات الرقمية
المقدمة
هل استلمت مستندًا موقعًا رقمياً وتساءلت إذا كان حقيقيًا؟ لست وحدك. مع تزايد هجمات التصيد وتزوير المستندات، أصبح التحقق من شهادات Java نقطة فحص أمان حاسمة في التطبيقات الحديثة.
إليك المشكلة: التحقق اليدوي من الشهادات مرهق وعرضة للأخطاء. تحتاج إلى فحص أرقام السلسلة، والتحقق من سلاسل الشهادات، ومعالجة الحالات الخاصة — كل ذلك مع الحفاظ على قابلية صيانة الكود.
هنا يأتي GroupDocs.Signature for Java. فهو يبسط عملية التحقق من الشهادات إلى بضع أسطر من الكود فقط، مما يتيح لك التركيز على بناء تطبيقات آمنة بدلاً من التعامل مع واجهات برمجة تطبيقات التشفير.
في هذا الدليل، ستتعلم كيفية:
- إعداد وتكوين التحقق من الشهادات في Java
- التحقق من شهادات PFX مع أمثلة عملية للكود
- معالجة الأخطاء الشائعة في التحقق (مع حلول فعلية)
- تنفيذ أفضل ممارسات الأمان لبيئات الإنتاج
سواء كنت تبني منصة تجارة إلكترونية، نظام إدارة مستندات، أو تحتاج فقط إلى التحقق من ملفات PDF الموقعة، سيوفر لك هذا البرنامج التعليمي كل ما تحتاجه في أقل من 15 دقيقة.
إجابات سريعة
- ما المكتبة التي تبسط التحقق من شهادات Java؟ GroupDocs.Signature for Java.
- أي تنسيق شهادة يتم عرضه؟ ملفات PFX (PKCS#12).
- كم سطرًا من الكود يلزم للتحقق الأساسي؟ سطران بعد الإعداد.
- هل يمكن تشغيله على JDK 8؟ نعم، يدعم JDK 8 أو أعلى.
- هل أحتاج إلى ترخيص تجاري للإنتاج؟ نعم، يلزم ترخيص تجاري للاستخدام في بيئة الإنتاج.
ما هو التحقق من شهادات Java؟
التحقق من شهادات Java هو عملية تأكيد برمجية أن الشهادة الرقمية أصلية، غير منتهية الصلاحية، وموثوقة وفقًا للمعايير المحددة. يضمن ذلك أن هوية الموقع يمكن الوثوق بها وأن المستند لم يتعرض للتعديل.
لماذا نستخدم GroupDocs.Signature for Java؟
يدعم GroupDocs.Signature أكثر من 20 تنسيقًا للمستندات (PDF، DOCX، XLSX، PPTX، PNG، JPG، وغيرها) ويمكنه معالجة ملفات مئات الصفحات دون تحميل الملف بالكامل في الذاكرة. تقلل واجهته عالية المستوى من الكود المتكرر بنسبة تصل إلى 80 %، مما يتيح لك التركيز على منطق الأعمال بدلاً من التشفير منخفض المستوى. راجع الـوثائق الكاملة ومرجع API للمزيد من التفاصيل.
المتطلبات المسبقة
قبل الغوص في التفاصيل، تأكد من تغطية الأساسيات التالية:
المكتبات والاعتمادات المطلوبة
- GroupDocs.Signature for Java الإصدار 23.12 أو أحدث (سنوضح كيفية إضافته أدناه)
- مجموعة تطوير جافا (JDK) 8 أو أعلى
- Maven أو Gradle لإدارة الاعتمادات
متطلبات إعداد البيئة
- أي بيئة تطوير Java (IntelliJ IDEA، Eclipse، أو VS Code)
- معرفة أساسية بـ Java (إذا كنت تعرف كيفية إنشاء الكائنات واستدعاء الدوال فأنت جاهز)
- ملف شهادة رقمية للاختبار (سنستخدم تنسيق PFX في الأمثلة)
ليس لديك شهادة بعد؟ لا مشكلة — يمكنك إنشاء شهادة موقعة ذاتيًا للاختبار أو الحصول على واحدة من قسم تكنولوجيا المعلومات إذا كنت تعمل على مشروع مؤسسي.
إعداد GroupDocs.Signature for Java
إضافة GroupDocs.Signature إلى مشروعك أمر بسيط. اختر أداة البناء التي تفضلها:
Maven (أضف إلى pom.xml):
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-signature</artifactId>
<version>23.12</version>
</dependency>
Gradle (أضف إلى build.gradle):
implementation 'com.groupdocs:groupdocs-signature:23.12'
بعد إضافة الاعتماد، قم بمزامنة المشروع. سيقوم Maven/Gradle بتحميل المكتبة وستكون جاهزًا للبدء. يمكنك أيضًا تحميل المكتبة مباشرةً عبر Download Library إذا كنت تفضل التثبيت اليدوي.
خطوات الحصول على الترخيص
تقدم GroupDocs خيارات ترخيص مرنة:
- تجربة مجانية: مثالية للاختبار والمشاريع الصغيرة — لا تحتاج إلى بطاقة ائتمان. احصل عليها من صفحة Free Trial.
- ترخيص مؤقت: تحتاج وقتًا أطول للتقييم؟ احصل على ترخيص مؤقت لمدة 30 يومًا عبر صفحة Temporary License.
- ترخيص تجاري: للاستخدام في الإنتاج. راجع صفحة الأسعار أو مباشرةً Purchase License.
نصيحة احترافية: ابدأ بالتجربة المجانية أثناء التطوير، ثم انتقل إلى ترخيص مؤقت إذا احتجت إلى عرض المشروع على أصحاب المصلحة قبل الشراء.
التهيئة الأساسية والبدء
بمجرد إضافة المكتبة، يمكنك البدء في استخدامها فورًا. لا تحتاج إلى ملفات تكوين معقدة أو إعدادات XML — فقط استورد الفئات وابدأ بالبرمجة.
المكتبة مصممة لتكون بديهية. إذا كنت قد تعاملت مع أي واجهة برمجة أمان في Java من قبل، فستشعر بأنها مألوفة (ولكن أبسط بكثير).
فهم عملية التحقق
قبل أن ننتقل إلى الكود، دعنا نتحدث عن ما يفعله التحقق من الشهادة فعليًا (بلغة بسيطة).
عند التحقق من شهادة رقمية، أنت في الأساس تسأل: “هل هذه الشهادة شرعية، وهل تتطابق مع ما أتوقعه؟”
ما يحدث في الخلفية:
- تحميل الشهادة: تقوم المكتبة بقراءة ملف PFX وفك تشفيره باستخدام كلمة المرور الخاصة بك
- فحص رقم السلسلة: تقارن رقم السلسلة الفريد للشفرة مع القيمة المتوقعة لديك
- التحقق من السلسلة (اختياري): تتأكد من أن الشهادة صادرة عن سلطة موثوقة
- تقييم النتيجة: تحصل على نتيجة true/false بسيطة — صالحة أو غير صالحة
لماذا نستخدم مكتبة مثل GroupDocs؟ واجهات برمجة الشهادات المدمجة في Java (مثل KeyStore وX509Certificate) تعمل، لكنها تتطلب الكثير من الكود المتكرر. تقوم GroupDocs بلف كل هذه التعقيدات في طرق نظيفة وقابلة للقراءة تعمل مباشرة.
دليل التنفيذ
ميزة التحقق من الشهادة
لنُنشئ ذلك خطوة بخطوة. سأشرح “السبب” وراء كل خطوة حتى لا تقوم بنسخ الكود فقط دون فهم.
الخطوة 1: تحميل الشهادة
أولًا، عليك إخبار المكتبة بمكان وجود الشهادة وكيفية الوصول إليها.
LoadOptions هي فئة تحدد كيفية تحميل ملف الشهادة، بما في ذلك كلمة المرور.
String certificatePath = "YOUR_DOCUMENT_DIRECTORY/certificate.pfx";
LoadOptions loadOptions = new LoadOptions();
loadOptions.setPassword("1234567890"); // Set password if needed.
ما الذي يحدث هنا؟
certificatePathيشير إلى ملف PFX الخاص بك (استبدله بالمسار الفعلي)loadOptions.setPassword()يفتح الملف المحمي بكلمة مرور
خطأ شائع: نسيان كلمة المرور أو استخدام كلمة مرور خاطئة. ستحصل على خطأ “Cannot load signature” إذا حدث ذلك (سنتناول الحلول أدناه).
الخطوة 2: تهيئة كائن Signature
الآن أنشئ كائن Signature الرئيسي الذي يدير جميع عمليات التحقق.
Signature هو الفئة الأساسية في GroupDocs.Signature التي توفر طرقًا لتحميل المستندات والتحقق من التوقيعات.
final Signature signature = new Signature(certificatePath, loadOptions);
لماذا نستخدم final هنا؟ يضمن عدم إعادة تعيين كائن التوقيع لاحقًا، ويشير إلى أن هذا المرجع لا ينبغي تغييره.
ملاحظة حول إدارة الذاكرة: هذا الكائن يحتفظ بمقابض ملفات وموارد، لذا يجب تحريره عند الانتهاء (سنوضح ذلك في الخطوة 4).
الخطوة 3: تكوين خيارات التحقق
هنا تحدد ما يعنيه “صالح” في حالتك.
VerificationOptions تسمح لك بتعيين معلمات مثل التحقق من السلسلة، مطابقة رقم السلسلة، ونوع المطابقة.
CertificateVerifyOptions options = new CertificateVerifyOptions();
options.setPerformChainValidation(false); // Disable chain validation if not needed.
options.setMatchType(TextMatchType.Exact); // Use exact match for serial number verification.
options.setSerialNumber("00AAD0D15C628A13C7"); // Expected serial number of the certificate.
نشرح ذلك:
setPerformChainValidation(false)– إيقاف التحقق الكامل للسلسلة عندما تحتاج فقط إلى فحص شهادة داخلية محددة. فعّله عندما تكون الشهادات الخارجية وثوقية السلسلة مهمة.setMatchType(TextMatchType.Exact)– يفرض مطابقة حرفية لرقم السلسلة. استخدمContainsإذا كنت تهتم فقط بوجود جزء من السلسلة.setSerialNumber()– يزود النظام برقم السلسلة المتوقع (بصمة الشهادة).
متى تستخدم ماذا:
- المستندات الداخلية – إيقاف التحقق من السلسلة، مطابقة دقيقة للرقم.
- مستندات الموردين الخارجيين – تشغيل التحقق من السلسلة، مطابقة دقيقة.
- سيناريوهات متعددة الشهادات – تشغيل التحقق من السلسلة، واستخدام مطابقة
Contains.
الخطوة 4: تنفيذ التحقق
أخيرًا، شغّل عملية التحقق وتحقق من النتائج.
VerificationResult يحتوي على نتيجة عملية التحقق، بما في ذلك علم isValid() البولياني ومعلومات التوقيع التفصيلية.
try {
VerificationResult result = signature.verify(options);
boolean isValid = result.isValid(); // Check if the certificate is valid.
} finally {
if (signature != null) {
signature.dispose(); // Free resources by disposing of the Signature object.
}
}
لماذا نستخدم كتلة try‑finally؟ يضمن تحرير الموارد حتى لو أُثير استثناء أثناء التحقق، مما يمنع تسرب الذاكرة في التطبيقات طويلة التشغيل.
قراءة النتيجة: result.isValid() تُعيد قيمة بوليانية بسيطة. يمكنك أيضًا استدعاء result.getSignatures() للحصول على تفاصيل كل توقيع موجود في المستند.
ما الذي تفعله بالنتيجة:
if (isValid) {
System.out.println("Certificate is valid! Document can be trusted.");
// Proceed with document processing
} else {
System.out.println("Certificate validation failed!");
// Log the failure, reject document, or alert user
}
المشكلات الشائعة والحلول
إليك الأخطاء الفعلية التي قد تواجهها وكيفية إصلاحها (مستمدة من تجارب واقعية):
المشكلة 1: “Cannot load signature from certificate file”
رسالة الخطأ: GroupDocsSignatureException: Cannot load signature
الأسباب والحلول:
- كلمة مرور خاطئة – تحقق من كلمة مرور PFX (حساسة لحالة الأحرف).
- ملف تالف – افتح ملف PFX في مدير الشهادات الخاص بنظامك للتحقق من صلاحيته.
- مسار ملف غير صحيح – استخدم مسارات مطلقة أثناء التطوير، مثل
/home/user/certs/mycert.pfx.
المشكلة 2: عدم تطابق رقم السلسلة
رسالة الخطأ: التحقق يُعيد false رغم أن الشهادة تبدو صالحة
الأسباب والحلول:
- تنسيق رقم السلسلة غير صحيح – أرقام السلسلة هي سلاسل ست عشرية؛ احذف الفراغات والنقطتين (
00:AA:D0→00AAD0D15C628A13C7). - حساسية لحالة الأحرف – استخدم الأحرف الست عشرية الكبيرة باستمرار.
- الأصفار البادئة – بعض الأدوات تحذف الأصفار البادئة؛ أضفها إذا لزم الأمر.
كيفية العثور على رقم السلسلة لشهادتك:
# On Linux/Mac
openssl pkcs12 -info -in certificate.pfx -nokeys | grep "serial"
# On Windows (PowerShell)
Get-PfxCertificate -FilePath .\certificate.pfx | Select-Object -Property SerialNumber
المشكلة 3: فشل التحقق من السلسلة
رسالة الخطأ: التحقق يفشل عند setPerformChainValidation(true)
الأسباب والحلول:
- جذر CA مفقود – ثبت شهادة CA على النظام.
- شهادات وسيطة منتهية – حتى لو كانت شهادتك النهائية صالحة، فإن شهادة وسيطة منتهية تُفسد السلسلة.
- شهادات موقعة ذاتيًا – التحقق من السلسلة سيفشل دائمًا؛ عطل التحقق عند التعامل مع شهادات موقعة ذاتيًا.
المشكلة 4: تسرب الذاكرة في الإنتاج
العَرَض: بطء التطبيق مع مرور الوقت، OutOfMemoryError
الحل: حرّر دائمًا كائنات Signature داخل كتلة finally (كما هو موضح في الخطوة 4). فكر في استخدام try‑with‑resources إذا كان إصدار Java يدعم ذلك:
try (Signature signature = new Signature(certificatePath, loadOptions)) {
VerificationResult result = signature.verify(options);
// Process result
} // Automatic disposal
أفضل ممارسات الأمان
عند تنفيذ التحقق من الشهادات في بيئة الإنتاج، اتبع الإرشادات التالية:
1. لا تقم بتضمين كلمات المرور في الكود
String certPassword = System.getenv("CERT_PASSWORD"); // Retrieve from environment
احفظ كلمات المرور في متغيرات البيئة، أو مديري الأسرار (AWS Secrets Manager، Azure Key Vault)، أو ملفات تكوين مشفرة.
2. تحقق من انتهاء صلاحية الشهادة
تتحقق GroupDocs من انتهاء الصلاحية تلقائيًا، لكن يُستحسن تسجيل ذلك:
// After verification
if (!result.isValid()) {
for (BaseSignature sig : result.getSignatures()) {
if (sig instanceof DigitalSignature) {
Date expiryDate = ((DigitalSignature) sig).getExpiryDate();
if (expiryDate.before(new Date())) {
logger.warn("Certificate expired on: " + expiryDate);
}
}
}
}
3. تنفيذ تحديد معدل الطلبات
إذا كنت تتحقق من مستندات يرفعها المستخدمون، حدّ عدد عمليات التحقق لكل مستخدم في الساعة لتفادي هجمات حجب الخدمة.
4. سجل محاولات التحقق
سجّل كل من النجاحات والفشل لأغراض التدقيق الأمني:
if (isValid) {
logger.info("Certificate verified successfully for document: " + documentId);
} else {
logger.warn("Certificate verification failed for document: " + documentId +
" - Serial: " + options.getSerialNumber());
}
5. استخدم HTTPS لتنزيل الشهادات
عند جلب الشهادات من خوادم بعيدة، استخدم دائمًا HTTPS لتجنب هجمات الرجل في الوسط.
متى تستخدم هذا النهج
استخدم التحقق من الشهادات عبر GroupDocs.Signature عندما:
✅ تقوم بمعالجة PDFs موقعة، أو مستندات Word، أو ملفات Excel
✅ تحتاج إلى التحقق من تنسيقات مستندات متعددة بشكل موحد
✅ ترغب في كود أنظف من واجهات Java الأمنية الأصلية
✅ تبني نظام تدفق عمل للمستندات
✅ تحتاج إلى التحقق من الشهادات برمجيًا على نطاق واسع
فكر في بدائل عندما:
❌ تحتاج فقط إلى التحقق من شهادات SSL/TLS (استخدم مكتبات Java القياسية)
❌ تبني نظام سلطة شهادات (استخدم Bouncy Castle)
❌ تريد توقيع المستندات (GroupDocs يدعم التوقيع أيضًا، لكنه دليل منفصل)
❌ تتعامل مع بطاقات ذكية أو رموز مادية (تحتاج مكتبات مختلفة)
سيناريوهات واقعية يبرز فيها هذا الحل:
- أنظمة إدارة العقود – التحقق تلقائيًا من العقود الموقعة قبل حفظها.
- معالجة الفواتير – التحقق من فواتير الموردين الموقعة قبل الدفع.
- السجلات الطبية – التحقق من توقيعات الأطباء على الوصفات الرقمية.
- التقديمات الحكومية – التحقق من نماذج المواطنين الموقعة بالهوية الرقمية.
تطبيقات عملية
1. منصات التجارة الإلكترونية
تحقق من شهادات البائعين قبل معالجة الطلبات:
public boolean validateVendorDocument(String documentPath, String vendorSerialNumber) {
// Use the verification code from above
// Return true/false to allow/reject order processing
}
2. أنظمة إدارة المستندات
تحقق تلقائيًا من المستندات أثناء الرفع:
@PostMapping("/upload")
public ResponseEntity<?> uploadDocument(@RequestParam("file") MultipartFile file) {
// Save file temporarily
// Run verification
// If valid, move to permanent storage; if invalid, reject with error message
}
3. أمان البريد الإلكتروني
تحقق من رسائل البريد الموقعة بـ S/MIME:
public void processIncomingEmail(Email email) {
if (email.hasDigitalSignature()) {
boolean isValid = verifyCertificate(email.getSignatureCert());
if (!isValid) {
flagAsPhishing(email);
}
}
}
4. التكامل مع أنظمة التحقق من الهوية
ربط مع مصادقة المستخدم:
public boolean authenticateUser(UserCredentials creds) {
// First verify their certificate
// Then check credentials against database
// Return combined result
}
اعتبارات الأداء
التحقق من الشهادات ليس عملية مجانية من حيث استهلاك الموارد. إليك كيفية الحفاظ على السرعة:
نصائح إدارة الموارد
- تحرير الكائنات فورًا – كما هو موضح سابقًا؛ كل كائن
Signatureيحتفظ بمقابض ملفات. - المعالجة الدفعية – أعد استخدام
LoadOptionsعند التحقق من العديد من الشهادات:
LoadOptions loadOptions = new LoadOptions();
loadOptions.setPassword(certPassword);
for (String certPath : certificatePaths) {
try (Signature signature = new Signature(certPath, loadOptions)) {
// Verify
}
}
- تخزين نتائج التحقق مؤقتًا – احفظ النتيجة للشهادات المستخدمة بشكل متكرر:
Map<String, Boolean> verificationCache = new ConcurrentHashMap<>();
String cacheKey = certificateSerialNumber + "_" + documentHash;
if (!verificationCache.containsKey(cacheKey)) {
boolean result = performVerification();
verificationCache.put(cacheKey, result);
}
- تجنب التحقق غير الضروري من السلسلة – يضيف ما بين 50‑200 ms لكل تحقق حسب طول السلسلة.
أفضل ممارسات إدارة الذاكرة
- لا تحمل مستندات ضخمة بالكامل في الذاكرة – استخدم التدفق (streaming) عندما يكون ذلك ممكنًا.
- حدد مهلات زمنية معقولة – لا يجب أن يعلق التحقق إلى ما لا نهاية.
- راقب استهلاك الـ heap – في سيناريوهات عالية المرور، راقب ضغط الذاكرة.
- استخدم تجميع الاتصالات – إذا كنت تجلب الشهادات من خوادم بعيدة.
توقعات القياس (على عتاد متوسط):
- التحقق الأساسي: 50‑100 ms
- مع التحقق من السلسلة: 150‑300 ms
- المستندات الكبيرة (10 MB+): أضف 100‑500 ms للتحميل
الأسئلة المتكررة
س: ما هي الشهادة الرقمية، ولماذا يجب التحقق منها؟
ج: الشهادة الرقمية هي هوية تشفيرية تثبت هوية كيان ما وتضمن أن المستند لم يتعرض للتلاعب. التحقق منها يمنع الاحتيال، التصيد، والتزوير.
س: كيف أحصل على ترخيص مؤقت لـ GroupDocs.Signature؟
ج: زر صفحة Temporary License، املأ النموذج بتفاصيل مشروعك، وستستلم ترخيصًا لمدة 30 يومًا عبر البريد الإلكتروني (مجاني، لا بطاقة ائتمان مطلوبة).
س: هل يمكنني استخدام GroupDocs.Signature مجانًا في الإنتاج؟
ج: التجربة المجانية مخصصة للتطوير والاختبار فقط. يتطلب الاستخدام في الإنتاج ترخيصًا تجاريًا؛ راجع صفحة الأسعار للمزيد.
س: ما الفرق بين التحقق من السلسلة ومطابقة رقم السلسلة؟
ج: مطابقة رقم السلسلة تتحقق من هوية الشهادة عبر رقمها الفريد — سريعة وبسيطة. التحقق من السلسلة يتحقق من كامل سلسلة الثقة حتى الجذر — أبطأ لكنه أكثر شمولًا.
س: كيف يمكنني التحقق من الشهادات لكميات كبيرة من المستندات بكفاءة؟
ج: استخدم المعالجة الدفعية مع تجميع الاتصالات، خزن نتائج الشهادات المتكررة، ووازن التحقق عبر خيوط متعددة — كل كائن Signature آمن للقراءة المتعددة.
س: كم عدد تنسيقات المستندات التي يدعمها GroupDocs.Signature؟
ج: يدعم أكثر من 20 تنسيقًا، بما في ذلك PDF، DOCX، XLSX، PPTX، PNG، JPG، وغيرها. راجع الـوثائق الكاملة للقائمة الكاملة.
س: كيف يتعامل المكتبة مع الشهادات المنتهية الصلاحية؟
ج: يتم فحص تاريخ الانتهاء تلقائيًا؛ result.isValid() تُعيد false للشهادات المنتهية. يمكنك استخراج تاريخ الانتهاء من كائن DigitalSignature لعرض رسالة صديقة للمستخدم.
س: هل يمكنني التحقق من شهادات صادرة عن سلطات شهادة مختلفة؟
ج: نعم — بشرط أن يثق نظامك بالسلطة الجذرية. بالنسبة للشهادات الموقعة ذاتيًا أو CAs داخلية، عطل التحقق من السلسلة أو أضف الـ CA إلى مخزن الثقة الخاص بك.
الخلاصة
أصبحت الآن تمتلك مجموعة أدوات كاملة للـ التحقق من شهادات Java. غطينا كل شيء من الإعداد الأساسي إلى ممارسات الأمان الجاهزة للإنتاج — دون الحاجة لأن تكون خبيرًا في التشفير.
ملخص سريع:
- يقلل GroupDocs.Signature من التحقق إلى بضع أسطر من الكود.
- حرّر دائمًا كائنات
Signatureلتفادي تسرب الذاكرة. - اختر التحقق من السلسلة بناءً على متطلبات الثقة لديك.
- عالج الأخطاء الشائعة بذكاء، خاصةً عدم تطابق رقم السلسلة.
- لا تُضمّن كلمات المرور في الكود — استخدم متغيرات البيئة أو مديري الأسرار.
الخطوات التالية للتطوير:
- استكشف التحقق الدفعي لمعالجة مستندات متعددة في وقت واحد.
- أضف توقيع المستندات باستخدام واجهات توقيع GroupDocs.Signature.
- أنشئ سجلًا للشهادات لتخزين أرقام السلسلة الموثوقة في قاعدة بيانات.
- صمم لوحة تحكم للتحقق لمراقبة معدلات النجاح وتسجيل التدقيق.
هل تريد المزيد؟ اطلع على الميزات المتقدمة مثل توقيعات QR‑code، التحقق من الباركود، واستخراج البيانات الوصفية في وثائق GroupDocs.
ابدأ الآن وابدع شيئًا آمنًا! 🔒
آخر تحديث: 2026-07-06
تم الاختبار مع: GroupDocs.Signature 23.12 for Java
المؤلف: GroupDocs
موارد إضافية
- صفحة الترخيص المؤقت
- صفحة الأسعار
- الوثائق الكاملة
- مرجع API
- تحميل المكتبة
- التجربة المجانية
- الترخيص المؤقت
- منتدى الدعم
// ❌ Bad - password in source code
loadOptions.setPassword("1234567890");
// ✅ Good - password from secure config
loadOptions.setPassword(System.getenv("CERT_PASSWORD"));