SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: فشل التحقق من الشهادة (عدم تطابق اسم المضيف)

لقد بدأت مساحة التخزين في Digital Ocean Droplet الخاصة بي تنفد، لذا أردت نقل الملفات التي تم تحميلها إلى مساحة Digital Ocean Space.

هذا ما قمت بإعداده…

  • معرف مفتاح الوصول s3 - تم نسخه من DO CP > API > Applications & API

  • مفتاح الوصول السري s3 - تم نسخه من DO CP > API > Applications & API

  • منطقة s3 - لست متأكدًا مما إذا كان الأمر مهمًا لمساحات DO، لكنني تركته افتراضيًا - شرق الولايات المتحدة (شمال فيرجينيا)

  • دلو تحميل s3 - لست متأكدًا مما إذا كان يجب علي إنشاء مجلد في Space أم لا. جربت كليهما…

    • uploads - والذي لا يحتوي على مجلد تم إنشاؤه في Space بالفعل
    • files - والذي يحتوي على مجلد تم إنشاؤه في Space بالفعل
  • نقطة نهاية s3 - هذا هو المكان الذي أعتقد أنني أخطأت فيه. جربت إصدارات https…

رأيت هذا…

… وهذا…

لكن إعداداتي لا تظهر في واجهة المسؤول، لذا أعتقد أن هذا قد لا يكون قديمًا، بل هو مجرد مسألة الحصول على مزيج الإعدادات الصحيح.

رأيت هذا…

… لكن منطقة المسؤول لا تسمح لي بترك “دلو تحميل s3” فارغًا، لذا لم أكن متأكدًا مما إذا كان ذلك ذا صلة. بدا ذلك أيضًا فقط إذا كنت تستخدم AWS S3 أيضًا. حاولت إنشاء مجلد في مساحة DO الخاصة بي واستخدام اسم هذا المجلد. حاولت استخدام اسم مختلف لمجلد لم يكن موجودًا، في حال احتاج إلى إنشائه بنفسه. لم ينجح أي من ذلك.

رأيت هذا…

… لكنني بعيد عن كوني خبيرًا، لذا تجنبت ذلك.

في هذه المرحلة، لقد نفدت أفكاري لمحاولة ولست متأكدًا مما إذا كنت قريبًا وأحتاج فقط إلى تكوين الإعداد الصحيح أو إذا كنت أفتقد شيئًا تمامًا ولست قريبًا على الإطلاق.

سيكون أي مساعدة موضع تقدير كبير. شكرًا لك.

أيضًا، لقد جربت بيانات اعتماد واجهة برمجة تطبيقات DO على النحو التالي…

لست متأكدًا مما يفترض أن يتطابق معه، لذلك أنا مرتبك بعض الشيء هناك أيضًا.

لا، ليست كذلك. بينما يمكنك تكوين نقاط نهاية S3 في واجهة المستخدم، فقد اختبرنا وصادقنا فقط باستخدام استنساخات S3، مثل العرض الذي تقدمه Digital Ocean، عند تكوينها في ملف app.yml.

لقد تطلب دليل تكوين موفر تخزين كائنات متوافق مع S3 للتحميلات الكثير من العمل من العديد من الأشخاص، لذا أوصي بالالتزام به.

4 إعجابات

حسنًا، لقد سبقني فالكو، ولكن إليك ما كنت أقوله…

لا. تحتاج إلى اتباع Configure an S3 compatible object storage provider for uploads ووضع الإعدادات في ملف app.yml الخاص بك.

أنت بحاجة إلى شبكة توصيل محتوى حقيقية مثل bunny.net. لا أعتقد أن cloudflare سيفي بالغرض.

إعجاب واحد (1)

شكرا لك.

لا أرى قسمًا في app.yml لإعدادات DISCOURSE_S3. هل أقوم فقط بإنشاء سطر لكل منها؟ أم أن هذا ما تفعله أوامر sudo؟

لست متأكدًا تمامًا من مكان تشغيل أو وضع أوامر sudo هذه. لست متأكدًا مما إذا كان هذا عنصرًا لمرة واحدة في سطر الأوامر لإضافته أو ما إذا كان شيئًا يجب وضعه في app.yml بحيث يتم حسابه دائمًا.

هل تذهب أوامر sudo إلى منطقة app.yml أم فقط أسطر إعداد DISCOURSE_S3؟


هل أترك هذا فارغًا مع DO Spaces؟ DISCOURSE_S3_REGION:


هل يجب أن يكون لدي شبكة توصيل محتوى (CDN)؟ لدينا حركة مرور منخفضة جدًا. مجموعة صغيرة. أحاول حقًا الحد من الأجزاء المتحركة إن أمكن.

هذا…

…يذهب أدناه # plugins to here في…

hooks:

…area, بعد…

after_code: section?

إعجاب واحد (1)

حسنًا. لقد أضفت after_assets_precompile

لقد قمت بإعادة بنائه وما زلت لا أرى قسم S3.

هل أقوم بإنشاء واحد؟
هل يهم أين أضع الإعدادات؟

كما هو مذكور في الدليل، يجب أن تذهب تحت قسم env:، مع إعدادات DISCOURSE_ الأخرى:

إعجابَين (2)

هل هناك أي حل لهذه المشكلة؟ لقد واجهت نفس الخطأ عند محاولة استخدام Oracle Cloud Storage.

لقد اتبعت الويكي عن طريق التعيين في app.yml. لقد حاولت استخدام s3cmd يدويًا للتأكد من صحة الاتصال. ولكن عند تحميل صورة في منشور، واجهت نفس رسالة الخطأ.

Message (4 copies reported)
Job exception: SSL_connect returned=1 errno=0 peeraddr=134.70.128.1:443 state=error: certificate verify failed (Hostname mismatch)
Backtrace
/usr/local/lib/ruby/3.2.0/net/protocol.rb:46:in `connect_nonblock'
/usr/local/lib/ruby/3.2.0/net/protocol.rb:46:in `ssl_socket_connect'
/usr/local/lib/ruby/3.2.0/net/http.rb:1342:in `connect'
/usr/local/lib/ruby/3.2.0/net/http.rb:1248:in `do_start'
/usr/local/lib/ruby/3.2.0/net/http.rb:1243:in `start'
/usr/local/lib/ruby/3.2.0/delegate.rb:87:in `method_missing'
aws-sdk-core-3.130.2/lib/seahorse/client/net_http/connection_pool.rb:307:in `start_session'
aws-sdk-core-3.130.2/lib/seahorse/client/net_http/connection_pool.rb:100:in `session_for'
aws-sdk-core-3.130.2/lib/seahorse/client/net_http/handler.rb:128:in `session'
aws-sdk-core-3.130.2/lib/seahorse/client/net_http/handler.rb:76:in `transmit'
aws-sdk-core-3.130.2/lib/seahorse/client/net_http/handler.rb:50:in `call'
aws-sdk-core-3.130.2/lib/seahorse/client/plugins/content_length.rb:24:in `call'
aws-sdk-core-3.130.2/lib/seahorse/client/plugins/request_callback.rb:85:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/s3_signer.rb:132:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/s3_signer.rb:63:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/s3_host_id.rb:17:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/xml/error_handler.rb:10:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/transfer_encoding.rb:26:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/helpful_socket_errors.rb:12:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/s3_signer.rb:110:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/redirects.rb:20:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:360:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:394:in `retry_request'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:382:in `retry_if_possible'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:371:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:394:in `retry_request'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:382:in `retry_if_possible'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:371:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:394:in `retry_request'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:382:in `retry_if_possible'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:371:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/http_checksum.rb:19:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/endpoint_pattern.rb:30:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/accelerate.rb:67:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/checksum_algorithm.rb:136:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/bucket_dns.rb:35:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/dualstack.rb:41:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/expect_100_continue.rb:22:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/bucket_name_restrictions.rb:26:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/arn.rb:62:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/rest/handler.rb:10:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/recursion_detection.rb:18:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/user_agent.rb:13:in `call'
aws-sdk-core-3.130.2/lib/seahorse/client/plugins/endpoint.rb:47:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/param_validator.rb:26:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/arn.rb:88:in `call'
aws-sdk-core-3.130.2/lib/seahorse/client/plugins/raise_response_errors.rb:16:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/sse_cpk.rb:24:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/dualstack.rb:27:in `call'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/accelerate.rb:56:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/checksum_algorithm.rb:111:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:22:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/idempotency_token.rb:19:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/param_converter.rb:26:in `call'
aws-sdk-core-3.130.2/lib/seahorse/client/plugins/request_callback.rb:71:in `call'
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/response_paging.rb:12:in `call'
aws-sdk-core-3.130.2/lib/seahorse/client/plugins/response_target.rb:24:in `call'
aws-sdk-core-3.130.2/lib/seahorse/client/request.rb:72:in `send_request'
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/client.rb:10921:in `put_bucket_policy'
/var/www/discourse/lib/s3_inventory.rb:183:in `update_bucket_policy'
/var/www/discourse/app/jobs/regular/update_s3_inventory.rb:16:in `block in execute'
/var/www/discourse/app/jobs/regular/update_s3_inventory.rb:14:in `each'
/var/www/discourse/app/jobs/regular/update_s3_inventory.rb:14:in `execute'
/var/www/discourse/app/jobs/base.rb:292:in `block (2 levels) in perform'
rails_multisite-5.0.0/lib/rails_multisite/connection_management.rb:82:in `with_connection'
/var/www/discourse/app/jobs/base.rb:279:in `block in perform'
/var/www/discourse/app/jobs/base.rb:275:in `each'
/var/www/discourse/app/jobs/base.rb:275:in `perform'
sidekiq-6.5.12/lib/sidekiq/processor.rb:202:in `execute_job'
sidekiq-6.5.12/lib/sidekiq/processor.rb:170:in `block (2 levels) in process'
sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:177:in `block in invoke'
/var/www/discourse/lib/sidekiq/pausable.rb:134:in `call'
sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:179:in `block in invoke'
sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:182:in `invoke'
sidekiq-6.5.12/lib/sidekiq/processor.rb:169:in `block in process'
sidekiq-6.5.12/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'
sidekiq-6.5.12/lib/sidekiq/job_retry.rb:113:in `local'
sidekiq-6.5.12/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'
sidekiq-6.5.12/lib/sidekiq.rb:44:in `block in <module:Sidekiq>'
sidekiq-6.5.12/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch'
sidekiq-6.5.12/lib/sidekiq/processor.rb:263:in `stats'
sidekiq-6.5.12/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch'
sidekiq-6.5.12/lib/sidekiq/job_logger.rb:13:in `call'
sidekiq-6.5.12/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch'
sidekiq-6.5.12/lib/sidekiq/job_retry.rb:80:in `global'
sidekiq-6.5.12/lib/sidekiq/processor.rb:124:in `block in dispatch'
sidekiq-6.5.12/lib/sidekiq/job_logger.rb:39:in `prepare'
sidekiq-6.5.12/lib/sidekiq/processor.rb:123:in `dispatch'
sidekiq-6.5.12/lib/sidekiq/processor.rb:168:in `process'
sidekiq-6.5.12/lib/sidekiq/processor.rb:78:in `process_one'
sidekiq-6.5.12/lib/sidekiq/processor.rb:68:in `run'
sidekiq-6.5.12/lib/sidekiq/component.rb:8:in `watchdog'
sidekiq-6.5.12/lib/sidekiq/component.rb:17:in `block in safe_thread'

شكرا مقدما!

ملاحظة: ليس فقط خدمة Oracle Cloud، ولكن أيضًا مزود خدمة محلي آخر.

إذًا ربما كنت تصل إلى الحاوية بالاسم الخطأ؟
ما هو مزود الحاوية الذي تستخدمه؟

كما ذكرت أعلاه: أنا أحاول باستخدام Oracle Cloud Storage. وتحققت يدويًا باستخدام أداة s3cmd بنفس الحساب.

ولا توجد طريقة لخطأ في الاسم، لأنني أقوم بالنسخ واللصق فقط.

لقد تحققت من نظام أسماء النطاقات (DNS) لنقطة نهاية S3:

dig axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com

;; <<>> DiG 9.18.18-0ubuntu0.22.04.1-Ubuntu <<>> axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63008
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com. IN A

;; ANSWER SECTION:
axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com. 258 IN CNAME compat.objectstorage.ap-singapore-1.oci.oraclecloud.com.
compat.objectstorage.ap-singapore-1.oci.oraclecloud.com. 258 IN	CNAME objectstorage.ap-singapore-1.oci.oraclecloud.com.
objectstorage.ap-singapore-1.oci.oraclecloud.com. 174 IN A 134.70.128.1

;; AUTHORITY SECTION:
ap-singapore-1.oci.oraclecloud.com. 258	IN SOA	ns1.p200.dns.oraclecloud.net. hostmaster.ap-singapore-1.oci.oraclecloud.com. 682052 3600 900 31536000 1800

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Sat Nov 04 18:58:03 +07 2023
;; MSG SIZE  rcvd: 252

واستخدام العنوان المستهدف: objectstorage.ap-singapore-1.oci.oraclecloud.com بدلاً من الاسم الأصلي: axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com

ثم حصلت على رسالة الخطأ بالضبط في أداة s3cmd كما يظهر في Discourse:

Please wait, attempting to list all buckets...
ERROR: Test failed: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'objectstorage.ap-singapore-1.oci.oraclecloud.com'. (_ssl.c:1007)

ليس لدي أي خبرة حول هذه المشكلة. :disappointed_face:

إذًا، ربما تكون المشكلة من هذا:\n\n- شهادة SSL مُصدرة إلى: *.compat.objectstorage.ap-singapore-1.oraclecloud.com\n- النطاق الأخير مختلف عن شهادة SSL: objectstorage.ap-singapore-1.oci.oraclecloud.com\n\nهل هناك أي طريقة لحل هذه المشكلة؟ شكرًا لك!

استخدم اسمًا يطابق الشهادة.

بعد عدة محاولات، ما زلت أتلقى نفس رسالة الخطأ. لقد تحققت يدويًا من الشهادة واسم المضيف، واستخدمت التنسيق الصحيح للحصول على الشهادة الصحيحة بالعين، ولكن لم يحالفني الحظ.

نقطة النهاية الخاصة بي: ..compat.objectstorage.oraclecloud.com
الاسم الشائع للشهادة: *.compat.objectstorage..oraclecloud.com

يمكنني الاتصال بأداة s3cmd. ولكن لا يمكنني إعداد تحميل S3 لـ discourse بنفس التكوين.

رسالة الخطأ: SSL_connect returned=1 errno=0 peeraddr=134.70.128.1:443 state=error: certificate verify failed (Hostname mismatch)

أريد أن أجرب طريقة أخرى عن طريق التعيين في بيئة ruby (بالبحث في كل مكان):

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

ولكن كيف يمكنني تعيين هذا في discourse؟ من فضلك!

هذه فكرة سيئة لأنها ستقوض العديد من الحمايات التي توفرها شهادات X509.

هل يمكنك إظهار ما هي إعداداتك غير السرية هنا؟ يرجى ملاحظة أن Oracle Cloud غير مدعوم، ولكننا سنلقي نظرة سريعة لمعرفة ما إذا كان هناك أي شيء خاطئ بشكل واضح.

نعم، أنت على حق عند إيقافه. أريد فقط معرفة السبب لتقديم طلب سحب (PR) إذا كان هذا خطأ في مكتبة Ruby.

إعداداتي بسيطة جدًا، أحاول فقط تحميل الصور إلى تخزين متوافق مع S3.

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: <region>
  DISCOURSE_S3_ENDPOINT: https://<namespace>.compat.objectstorage.<region>.oraclecloud.com
  DISCOURSE_S3_ACCESS_KEY_ID: <access_key_id>
  DISCOURSE_S3_SECRET_ACCESS_KEY: <access_key>
  DISCOURSE_S3_BUCKET: <bucket_name>

يحتوي Oracle Cloud Storage على تنسيق لعنوان نقطة النهاية. ولكن مهما كان التنسيق الذي جربته، فإن نفس رسالة الخطأ التي أظهرتها أعلاه.

SSL_connect returned=1 errno=0 peeraddr=134.70.128.1:443 state=error: certificate verify failed (Hostname mismatch)

التنسيق أعلاه، لقد تحققت من الشهادة وهي صحيحة في نظري:

كما تحدثت من قبل، استخدمت هذا الإعداد للاتصال بأداة s3cmd بشكل طبيعي. شكرًا جزيلاً!

حسنًا، لقد أضفت binding.pry إلى بداية ssl_socket_connect وما أراه عند محاولة استخدام هذه الإعدادات هو:

→ DISCOURSE_USE_S3=true DISCOURSE_S3_REGION=ap-singapore-1 DISCOURSE_S3_ENDPOINT=https://axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com DISCOURSE_S3_ACCESS_KEY_ID=foo DISCOURSE_S3_SECRET_ACCESS_KEY=bar DISCOURSE_S3_BUCKET=bucketname bin/rails c
Loading development environment (Rails 7.0.7)
[1] pry(main)> s3 = S3Helper.build_from_config; s3.list

From: /home/michael/.rvm/gems/ruby-3.2.2@discourse/gems/net-protocol-0.2.2/lib/net/protocol.rb:42 Net::Protocol#ssl_socket_connect:

    40: def ssl_socket_connect(s, timeout)
    41:   binding.pry
 => 42:   if timeout
    43:     while true
    44:       raise Net::OpenTimeout if timeout <= 0
    45:       start = Process.clock_gettime Process::CLOCK_MONOTONIC
    46:       # to_io is required because SSLSocket doesn't have wait_readable yet
    47:       case s.connect_nonblock(exception: false)
    48:       when :wait_readable; s.to_io.wait_readable(timeout)
    49:       when :wait_writable; s.to_io.wait_writable(timeout)
    50:       else; break
    51:       end
    52:       timeout -= Process.clock_gettime(Process::CLOCK_MONOTONIC) - start
    53:     end
    54:   else
    55:     s.connect
    56:   end
    57: end

[1] pry(#<Net::HTTP>> s.hostname
=> "bucketname.axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com"

إذًا، اسم المضيف الفعلي الذي يتم الاتصال به هو bucketname.axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com، والذي لا يتطابق مع *.compat.objectstorage.ap-singapore-1.oraclecloud.com، لذا فإن الخطأ صحيح.

للأسف، لا تدعم OCI هذا النمط من الوصول:

استخدم الوصول المستند إلى المسار في تطبيقك. لا يتم دعم الوصول بنمط المضيف الافتراضي (الوصول إلى حاوية كـ {bucketnamespace}.compat.objectstorage.{region}.oraclecloud.com [sic]).

على العكس من ذلك، يدعم Discourse فقط الوصول بنمط المضيف الافتراضي ({bucketname}.{namespace}.compat.objectstorage.{region}.oraclecloud.com).

لقد أزلنا الإعداد الذي ربما كان سيجعله يعمل منذ فترة لأنه لم يكن مدعومًا بشكل جيد (انظر رسالة الالتزام).

جعل هذا يعمل لن يكون بسيطًا وسيتطلب تطويرًا واختبارًا معقدًا لإضافة هذا الدعم.

هنا تنين.

(xref: S3 Path Style Access)

4 إعجابات

يشرح بوضوح شديد. شكرا جزيلا لك!

إعجاب واحد (1)

شكرًا لك، لكنني لم أتمكن من حل المشكلة أبدًا.

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

كنت آمل أن يتمكن شخص ما من حل المشكلة في هذه الأثناء وتوثيق الإعداد بشكل أفضل ليتناسب مع خططي.

شكرًا على أي حال.

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