يعمل ConnMan طوال فترة بعد الظهر ثم يرفض، ويذكر سطر السجل التحقق من الشهادة. ذلك السطر يدفع الناس إلى حزم CA التي لم تكن معطوبة قط. عطلان مختلفان ينتجان الشكل نفسه تقريبًا من الفشل: انتهاء صلاحية كوكي الجلسة، أو تغيّر شهادة الخادم فعليًا. يمكن الفصل بينهما في نحو دقيقة، وواحد منهما فقط يتعلق بالبصمة أصلًا.

عطلان وسطر سجل واحد مربك

ينفصلان عبر ملاحظتين، ولا تحتاج أي منهما إلى قراءة ثانية. الأولى هي وقت بدء الفشل: الكوكي منتهي الصلاحية يصل بعد ساعات أو أيام من العمل، والشهادة المستبدلة تصل مباشرة بعد تغيير البوابة.

SignalExpired cookieChanged certificate
When it startedafter hours or days of workingright after a gateway change
Fingerprint from a fresh authenticateunchangeddifferent value
Usual log tailHTTP CONNECT 401 / unauthorizedsigner not found / verify failed
Repairreplace the cookie, restartre-pin deliberately, then restart

اختبار الدقيقة الواحدة هو تشغيل authenticate الوارد أدناه. قارن بصمته FINGERPRINT بـOpenConnect.ServerCert في الملف. بصمة مماثلة مع كوكي COOKIE مختلف تعني استبدال الكوكي فقط. البصمة المختلفة تعني أن شهادة الخادم تغيّرت فعلًا، لذا أعد تثبيتها عن قصد وسجّل من وافق على ذلك.

ولّد المواد بدل كتابتها يدويًا

لا يملك ConnMan خطوة استيراد لملف OpenConnect، خلافًا لـNetworkManager. فهو يقرأ ملف تزويد يجب إنتاج قيمه مسبقًا، والطريقة المدعومة لإنتاجها هي وضع authenticate في OpenConnect.

sudo openconnect --csd-wrapper=/home/user/.cisco/csd-wrapper.sh \
  --authenticate --user myuser vpn.example.com

يطبع المخرج أربع قيم: POST وCOOKIE وHOST وFINGERPRINT. البصمة، المسبوقة بـsha256:، هي تثبيت الخادم. أما الكوكي فهو أثر الجلسة بعمر يقرره الخادم الوسيط. تعامل معهما كنوعين مختلفين من الأسرار: تنتهي صلاحيتهما وفق جداول مختلفة، ويُتوقع أن يتغير واحد فقط.

الملف يحمل الاثنين، وهما يتقادمان بشكل مختلف

يقع ملف التزويد تحت /var/lib/connman-vpn/ ويقرأه عفريت VPN لكل اتصال، لا تطبيق شريط النظام. أبقِ اسم الاتصال في القسم العام وتفاصيل البروتوكول في قسم المزوّد.

[global]
Name = Company VPN

[provider_openconnect]
Type = OpenConnect
Name = Company Cisco VPN
Host = vpn.example.com
Domain = corp.example
OpenConnect.ServerCert = sha256:...
OpenConnect.Cookie = ...

استخدم اسم المضيف الذي يخدمه البوابة فعليًا. عنوان IP المجرد قد يجتاز فحص الشهادة ويفشل مع ذلك، لأن الجهاز يوجّه حسب المضيف الافتراضي ويتوقع الاسم.

systemctl status connman-vpn --no-pager   # is the daemon even installed and running
sudo systemctl restart connman-vpn       # after the file edit
journalctl -u connman-vpn --since '1 hour ago'  # after the connection attempt

ما يعرضه السجل فعليًا

لن يخبرك تلميح شريط النظام أي عطل لديك. سيفعل السجل ذلك إن قرأت التسلسل بدل أول سطر مقلق. الكوكي القديم يُظهر عادة اكتمال تفاوض TLS ورفض طبقة HTTP بعده، ولهذا تأتي الكلمات عن الشهادات بجوار فشل في التخويل.

قارن تشغيل authenticate جديدًا بالقيم في الملف. إذا طابقت البصمة واختلف الكوكي فقط، فقد حصلت على جوابك دون المساس بإعدادات الثقة.

جدّد الحقل الذي انتهت صلاحيته

أعد أمر authenticate، واستبدل OpenConnect.Cookie، وأعد تشغيل العفريت. اترك البصمة كما هي ما لم تُظهر المخرجات الجديدة قيمة مختلفة؛ في هذه الحالة تكون شهادة الخادم قد استُبدلت فعلًا، وإعادة التثبيت قرار ينبغي أن يسجّله شخص ما بدل لصقه من رسالة خطأ.

أتمتة التجديد أمر معقول: نص برمجي صغير يقرأ كلمة المرور من الإدخال القياسي، ويشغّل وضع authenticate، ويعيد كتابة سطر الكوكي فقط. أبقِ بيانات الاعتماد خارج النص واجعلها مقروءة فقط للحساب الذي يشغّله، واجعل إعادة الكتابة ذرية حتى لا يترك تشغيل فاشل ملفًا نصف مكتوب.

إذا احتجت التجديد كل بضع ساعات، فاكتب الفاصل الزمني. إنه خاصية من سياسة جلسات البوابة، وهو يحدد ما إذا كان يجب أتمتة التجديد أو طلب جلسة أطول.

مقالات ذات صلة