سؤال

أنا أبحث حولي عن جافا توقيع الرمز الشهادة حتى لا تقوم تطبيقات Java الخاصة بي بإصدار مثل هذه التحذيرات الأمنية المخيفة.ومع ذلك، فإن جميع الأماكن التي وجدتها تعرض عليهم رسومًا كبيرة (في رأيي) أكثر من اللازم، مثل أكثر من 200 دولار أمريكي سنويًا.أثناء إجراء البحث، تبدو شهادة توقيع الرمز تقريبًا مماثلة تمامًا لشهادة طبقة المقابس الآمنة شهادة.

السؤال الرئيسي عندي:هل من الممكن شراء شهادة SSL، مع استخدامها للتوقيع على تطبيقات Java؟

هل كانت مفيدة؟

المحلول

اجابة قصيرة:لا، إنهم مختلفون.

اجابة طويلة:إنها نفس نوع الشهادة وتستخدم نفس برنامج التشفير، لكن الشهادة تحتوي على علامات تشير إلى ما يُسمح باستخدامها من أجله.يعد توقيع التعليمات البرمجية وخادم الويب استخدامات مختلفة.

نصائح أخرى

عندما أقوم باستيراد شهادة CA جديدة في Firefox (إلخ.) لدي خيار اختيار الشهادة التي أثق بها:

  • خوادم التوقيع
  • رمز التوقيع (مثل التطبيق الصغير الخاص بك)
  • التوقيع على شهادات البريد الإلكتروني

إذن الجواب بالنسبة لي هو:نعم، إنهم نفس الشيء.علاوة على ذلك، لماذا لا تنشئ ملفك الخاص باستخدام OpenSSL (man opensl، man x509، man req، إلخ.على يونكس)؟هل تريد فقط تهدئة التحذيرات أو هل تريد آخر الأشخاص الذين لم تقابلهم أبدًا ليثقوا في الكود الخاص بك؟إذا لم تكن بحاجة إلى قيام مستخدمين آخرين بربط الثقة مع المرجع المصدق (CA) المضمن مع المتصفح ونظام التشغيل الخاص بهم وما إلى ذلك، فاستخدم OpenSSL لإنشاء الثقة الخاصة بك.

واسأل "كيف يمكنني استخدام OpenSSL لإنشاء شهاداتاتي الخاصة؟" إذا كان الأخير هو اختيارك.

تقدم Thawte شهادات توقيع التعليمات البرمجية هنا.أتصور أن المراجع المصدقة الأخرى تقدم هذه الخدمة أيضًا.يمكنك أيضًا إنشاء شهادات موقعة ذاتيًا باستخدام أداة جافا الرئيسية.

قد تتضمن شهادات X.509 مجالات الاستخدام الرئيسية (KU) و مجالات الاستخدام الرئيسية الموسعة (EKU).ال مذكرة فنية من Oracle تصف كيفية إنشاء علامة RIA الخاصة بك إنشاء شهادة بدون أي علامات استخدام للمفاتيح، والتي تعمل بشكل جيد (إذا كان بإمكانك الحصول على مرجع مصدق موثوق به للتوقيع عليها)

ولكن المزيد والمزيد من شهادات إصدار CA مع حقول الاستخدام الرئيسية هذه.عندما تكون هذه الحقول موجودة يقيد استخدام الشهادة.يتحقق مكون Java الإضافي من وجود هذه الحقول في الملف EndEntityChecker:

/**
 * Check whether this certificate can be used for code signing.
 * @throws CertificateException if not.
 */
private void checkCodeSigning(X509Certificate cert)
        throws CertificateException {
    Set<String> exts = getCriticalExtensions(cert);

    if (checkKeyUsage(cert, KU_SIGNATURE) == false) {
        throw new ValidatorException
           ("KeyUsage does not allow digital signatures",
            ValidatorException.T_EE_EXTENSIONS, cert);
    }

    if (checkEKU(cert, exts, OID_EKU_CODE_SIGNING) == false) {
        throw new ValidatorException
            ("Extended key usage does not permit use for code signing",
            ValidatorException.T_EE_EXTENSIONS, cert);
    }

    if (!SimpleValidator.getNetscapeCertTypeBit(cert, NSCT_SSL_CLIENT)) {
        throw new ValidatorException
            ("Netscape cert type does not permit use for SSL client",
            ValidatorException.T_EE_EXTENSIONS, cert);
    }

    // do not check Netscape cert type for JCE code signing checks
    // (some certs were issued with incorrect extensions)
    if (variant.equals(Validator.VAR_JCE_SIGNING) == false) {
        if (!SimpleValidator.getNetscapeCertTypeBit(cert, NSCT_CODE_SIGNING)) {
            throw new ValidatorException
                ("Netscape cert type does not permit use for code signing",
                ValidatorException.T_EE_EXTENSIONS, cert);
        }
        exts.remove(SimpleValidator.OID_NETSCAPE_CERT_TYPE);
    }

    // remove extensions we checked
    exts.remove(SimpleValidator.OID_KEY_USAGE);
    exts.remove(SimpleValidator.OID_EXTENDED_KEY_USAGE);

    checkRemainingExtensions(exts);
}

تبدو طرق التحقق كما يلي:

/**
 * Utility method checking if the extended key usage extension in
 * certificate cert allows use for expectedEKU.
 */
private boolean checkEKU(X509Certificate cert, Set<String> exts,
        String expectedEKU) throws CertificateException {
    List<String> eku = cert.getExtendedKeyUsage();
    if (eku == null) {
        return true;
    }
    return eku.contains(expectedEKU) || eku.contains(OID_EKU_ANY_USAGE);
}

لذا، إذا لم يتم تحديد KU أو EKU، فسيقوم مدقق KU أو EKU بإرجاع صحيح بكل سرور.

لكن

  • إذا تم تحديد KU، فإن توقيع إلكتروني يجب أن تكون جامعة الكويت واحدة منهم.
  • إذا تم تحديد أي وحدات EKU، إما EKU توقيع الرمز (المحدد بواسطة الرقم التعريفي 1.3.6.1.5.5.7.3.3) أو EKU أي استخدام (المحدد بواسطة oid 2.5.29.37.0) يجب تحديده أيضًا.

وأخيرا، فإن checkRemainingExtensions تتحقق الطريقة من وحدات EKU المهمة المتبقية.وحدات EKU الهامة الأخرى الوحيدة المسموح لها بالتواجد هي

  • القيود الأساسية (المعرف "2.5.29.19") و
  • الاسم البديل للموضوع (الرقم التعريفي 2.5.29.17)

إذا عثر على أي وحدة EKU هامة أخرى، فسيتم إرجاع خطأ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top