سؤال

أنا فقط أحاول الحصول على رأسي حول SSL.

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

الآن عندما أذهب إلى https: // localhost: 8443/ لا يمكنني الوثوق بهذا الخطأ في الشهادة.

أنا أستعمل

keytool -esport -alias pongus -Keystore keystore -file certfile.cer

لإنشاء الشهادة التي أعتقد أنها ما يحتاج العميل للمصادقة مع الخادم. (هذا هو المكان الذي يمكن أن أكون مخطئًا فيه جدًا!)

لدي رمز الياقوت التالي:

require 'net/https'
require 'openssl'

require 'open-uri'

puts 'yay' if File.exists?('certfile.cer')

uri = URI.parse("https://localhost:8443/")
http_session = Net::HTTP.new(uri.host, uri.port)
http_session.use_ssl = true
http_session.verify_mode = OpenSSL::SSL::VERIFY_PEER
http_session.ca_file = 'certfile.cer'
res = http_session.start do |http|
  # do some requests here
  http.get('/')
end

هذا يطبع "yay" ، وبالتالي فإن ملف certfile.cer موجود.

لكني أحصل على الأخطاء

/Applications/NetBeans/NetBeans 6.8.app/Contents/Resources/NetBeans/ruby2/jruby-1.4.0/lib/ruby/1.8/net/http.rb:586 warning: can't set verify locations
/Applications/NetBeans/NetBeans 6.8.app/Contents/Resources/NetBeans/ruby2/jruby-1.4.0/lib/ruby/1.8/net/http.rb:586:in `connect': certificate verify failed (OpenSSL::SSL::SSLError)

أي أفكار ما أفعله خطأ؟

تعديل

أريد أن أحصل عليه ، لذا أضمن أنني أتصل بالخادم الصحيح ، ويمكن أن يضمن الخادم أن أتصل به ، دون أي عبث بينهما. أقوم بتطوير كل من الخادم والعميل.

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

المحلول

يحتاج عميلك إلى الوصول إلى مفتاحه الخاص.

لا تحتاج إلى المفتاح الخاص للتحقق من شهادة الخادم. كل ما تحتاجه هو الشهادة نفسها التي تحتوي على المفتاح العام. فقط الخادم لديه المفتاح الخاص. موصوفة بشكل جيد هنا http://www.helpbytes.co.uk/https.php و هنا http://www.verisign.com/ssl/ssl-information-center/how-ssl-security-works/

توصيتي بسيطة. تحقق من شهادتك صحيحة.

openssl x509 -text -in mycert.crt

أيضًا إذا كان لديك إمكانية الوصول إلى الخادم ، يمكنك التحقق بشكل واضح إذا كانت الشهادة والمفتاح (المستخدمة في تكوين HTTPD) صحيحة (مطابقات): http://kb.wisc.edu/middleware/page.php؟id=4064 يرجى ملاحظة أن هذا هو التحقق الصريح الذي تم تشغيله على الخادم. لا تعطي المفتاح الخاص أبدًا. لا يمكن إجراء هذا الشيك إلا من قبل المسؤول للتحقق مما إذا لم يتم تكوين HTTPD.

(openssl x509 -noout -modulus -in server.pem | openssl md5 ;\
   openssl rsa -noout -modulus -in server.key | openssl md5) | uniq

يمكنك أيضًا تصحيح اتصال شهادة SSL باستخدام أمر OpenSSL القياسي. إصدار هذا الأمر ثم انتظر بضع ثوان ثم اكتب الإقلاع واضغط على Enter. سترى الشهادة التي يرسلها الخادم.

openssl s_client -connect your.server.com:443

حاول أيضًا استيراد الشهادة إلى متصفحك والوصول إلى مورد URL. المتصفح قادر على التحقق من صحة ذلك من خلال النقر على HTTPS (Firefox و Chrome). ثم سترى الشهادة نفسها ومعلومات الصلاحية.

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

File.open( "client_certificate.pem", 'rb' ) { |f| cert = f.read }
File.open( "client_key.pem", 'rb' ) { |f| key = f.read }
http_session.cert = OpenSSL::X509::Certificate.new(cert)
http_session.key = OpenSSL::PKey::RSA.new(key, nil)

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

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

أتمنى أن يساعدك هذا.

نصائح أخرى

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

يتغيرون

http_session.verify_mode = OpenSSL::SSL::VERIFY_PEER

ل

http_session.verify_mode = OpenSSL::SSL::VERIFY_NONE

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

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