مكتبة DuoKey PKCS#11
مزوّد Cryptoki 2.40 قياسي يربط تطبيقات PKCS#11 بـ DuoKey Cockpit — لا تعمل أي مفاتيح ولا أي تشفير أبداً على مضيف العميل.
مقدمة
مكتبة DuoKey PKCS#11 هي مكتبة مشتركة أصلية تنفّذ معيار PKCS#11 (Cryptoki) 2.40. تحمّلها تطبيقات مثل Oracle Database TDE وOracle Key Vault كأي مزوّد HSM وتستدعي وظائف C_* القياسية. لا تنفّذ المكتبة أي تشفير محلياً — تُرسَل كل عملية عبر HTTPS إلى DuoKey Cockpit، الذي ينفّذها مقابل خزنة المستأجر أو HSM الداعم. لا تقيم مادة المفتاح أبداً على مضيف التطبيق.
التغليف
| الخاصية | القيمة |
|---|---|
| الأداة | Linux libdke_pkcs11.so · Windows dke_pkcs11.dll |
| المعيار | PKCS#11 (Cryptoki) 2.40 |
| الرمز المصدَّر | C_GetFunctionList — الرمز الوحيد الذي يجب أن يصدّره مزوّد PKCS#11؛ يُعيد جدول الوظائف الكامل |
| التشفير المحلي | لا يوجد — تُنقَل كل العمليات إلى DuoKey Cockpit |
| معرّف الصانع | DuoKey |
البنية
لا يتحدث تطبيق مع Cockpit مباشرة أبداً. فهو يحمّل المكتبة، التي تحوّل كل استدعاء Cryptoki إلى طلب واحد إلى نقطة نهاية وكيل في Cockpit؛ ويؤدي Cockpit العملية ويعيد النتيجة.
نقاط التصميم
لا تشفير محلي
لا تحتفظ المكتبة بأي مفاتيح ولا تشغّل أي تشفير. تكتفي بترميز الحمولات وإعادة توجيهها؛ والخلفية هي من تؤدي العمل.
رمز تصدير واحد
لا يُصدَّر إلا C_GetFunctionList؛ وتُستدعى كل وظيفة أخرى عبر الجدول المُعاد.
جلسات تسلسلية
تُسلسَل حالة المكتبة بأكملها خلف قفل واحد، ولا تُدعَم إلا الجلسات التسلسلية؛ تُرفَض الجلسات المتوازية بـ CKR_SESSION_PARALLEL_NOT_SUPPORTED.
ربط مقابض الكائنات
تُربَط مقابض PKCS#11 الصحيحة بمعرّفات كائنات على جانب الخادم؛ تُخزَّن الواصفات مؤقتاً وتُزال تكراراتها بحيث يُعيد الكائن نفسه دائماً المقبض نفسه.
مصادقة بالرمز، لا PIN
لا يُرسِل C_Login أي PIN — فهو ينقل الجلسة فقط إلى حالة المستخدم. المصادقة هي رمز حامل لكل طلب من التكوين.
تغطية الوظائف
تنفّذ المكتبة المجموعة الفرعية من Cryptoki اللازمة لإدارة المفاتيح واستخدامها عبر Cockpit — عمليات أحادية الجزء فقط. الجدول الكامل لكل وظيفة موجود في صفحة تغطية الوظائف؛ والملخص:
| الفئة | الوظائف المُنفَّذة |
|---|---|
| أغراض عامة | C_GetFunctionList, C_Initialize, C_Finalize, C_GetInfo |
| الفتحة والرمز | C_GetSlotList, C_GetSlotInfo, C_GetTokenInfo, C_GetMechanismList, C_GetMechanismInfo |
| الجلسة | C_OpenSession, C_CloseSession, C_CloseAllSessions, C_GetSessionInfo, C_Login, C_Logout |
| الكائنات | C_FindObjectsInit / C_FindObjects / C_FindObjectsFinal, C_GetAttributeValue, C_DestroyObject |
| التشفير / فك التشفير | C_EncryptInit / C_Encrypt, C_DecryptInit / C_Decrypt (أحادي الجزء) |
| التوقيع / التحقق / التلخيص | C_Sign, C_Verify, C_Digest (أحادي الجزء) |
| إدارة المفاتيح | C_GenerateKey, C_GenerateKeyPair, C_WrapKey, C_UnwrapKey |
| العشوائية | C_GenerateRandom (يُقبَل C_SeedRandom ويُتجاهَل) |
تُعيد العمليات متعددة الأجزاء / التدفقية (*_Update / *_Final)، والتشفير ثنائي الوظيفة، وC_DeriveKey، وإنشاء/نسخ/ضبط سمات الكائن (C_CreateObject، وC_CopyObject، وC_SetAttributeValue)، وإدارة الرمز/PIN (C_InitToken، وC_InitPIN، وC_SetPIN) القيمة CKR_FUNCTION_NOT_SUPPORTED. تُعيد C_GetFunctionStatus وC_CancelFunction القيمة CKR_FUNCTION_NOT_PARALLEL. عمليات المفتاح الرئيسي أحادية الجزء بحكم البناء، لذا حُذفت هذه عمداً.
الآليات
يُعلِن C_GetMechanismList عن العائلات التالية (تضبط C_GetMechanismInfo أيضاً CKF_HW). راجع تغطية الوظائف للقائمة الدقيقة ونطاقات حجم المفتاح.
| العائلة | الآليات | العمليات |
|---|---|---|
| AES | CKM_AES_KEY_GEN, CKM_AES_ECB/CBC/CBC_PAD, CKM_AES_GCM, CKM_AES_KEY_WRAP(_PAD) | التوليد، التشفير/فك التشفير، التغليف/فك التغليف |
| RSA | CKM_RSA_PKCS_KEY_PAIR_GEN, CKM_RSA_PKCS, CKM_RSA_PKCS_OAEP, CKM_RSA_PKCS_PSS, CKM_SHAn_RSA_PKCS | التوليد، التشفير/فك التشفير، التوقيع/التحقق، التغليف/فك التغليف |
| EC | CKM_EC_KEY_PAIR_GEN, CKM_ECDSA, CKM_ECDSA_SHA256/384 | التوليد، التوقيع/التحقق |
| التلخيص | CKM_SHA_1, CKM_SHA256/384/512 | التلخيص (SHA-256/384/512 في الخلفية) |
| HMAC | CKM_SHA256/384/512_HMAC | التوقيع/التحقق |
هذا مزوّد Cryptoki عام الغرض، لذا يُعلِن عن AES وRSA وEC وSHA وHMAC. يستخدم كل تطبيق ما يحتاجه فقط. على سبيل المثال، يستخدم Oracle TDE AES فقط — مفتاحه الرئيسي هو AES256 ولا يستخدم أبداً RSA أو EC (راجع Oracle TDE ← Cockpit v2). قد تستخدم تكاملات أخرى RSA أو EC.
الكائنات والسمات
- فئات الكائنات:
CKO_DATA,CKO_CERTIFICATE,CKO_PUBLIC_KEY,CKO_PRIVATE_KEY,CKO_SECRET_KEY,CKO_DOMAIN_PARAMETERS. - أنواع المفاتيح:
CKK_AES,CKK_RSA,CKK_EC,CKK_GENERIC_SECRET,CKK_DSA,CKK_DH,CKK_SHA256/384/512_HMAC. - تُعنوَن المفاتيح بـ
CKA_LABELوCKA_ID؛ يجيبC_GetAttributeValueمن واصف مخزَّن مؤقتاً. - لا تُعاد
CKA_VALUEأبداً — فهي تعيدCKR_ATTRIBUTE_SENSITIVE، لأن مادة المفتاح الخام لا تقيم إلا في الخلفية. تُوسَم المفاتيح المُعادة بأنها غير قابلة للاستخراج وحساسة.
التكوين
تقرأ المكتبة ملف TOML يُحدَّد مساره عبر DKE_PKCS11_CONF (يضبطه Oracle / OKV في بيئة المحفظة). تتجاوز متغيرات البيئة الملف.
[http_config]
server_url = "https://<cockpit-host>/api/apps/<app_id>/tde/pkcs11/<access_guid>"
access_token = "<access_guid>" # sent as the bearer token
timeout_secs = 30
verify_tls = true
[pkcs11]
slot_id = 0
logging_level = "info"
logging_folder = "/var/log/dke-pkcs11"| متغيّر البيئة | يتجاوز |
|---|---|
DKE_PKCS11_CONF | مسار ملف TOML (إذا لم يُضبَط، يُبنى التكوين من المتغيرات أدناه) |
DKE_PKCS11_SERVER_URL | http_config.server_url |
DKE_PKCS11_ACCESS_TOKEN | http_config.access_token |
DKE_PKCS11_VERIFY_TLS | http_config.verify_tls |
DKE_PKCS11_SLOT_ID | pkcs11.slot_id |
DKE_PKCS11_LOGGING_LEVEL | pkcs11.logging_level |
DKE_PKCS11_LOGGING_FOLDER | pkcs11.logging_folder |
تكون verify_tls بقيمة true افتراضياً. لا تضبطها على false إلا للاختبار مقابل شهادات موقَّعة ذاتياً — فهي تعطّل التحقق من شهادة TLS.
المستهلكون
Oracle Database TDE
يحمّل المكتبة من /opt/oracle/extapi/64/pkcs11/ لتخزين مفتاح TDE الرئيسي في DuoKey.
Oracle Key Vault (OKV)
وضع HSM — يُشار إلى المكتبة من okv_hsm.conf بوصفها مزوّد PKCS#11 عاماً.
يستخدم Microsoft SQL Server EKM مزوّداً منفصلاً (ملف DLL من نوع CNG Key Storage Provider)، وليس مكتبة DuoKey PKCS#11. راجع دليل SQL EKM.