ما الذي أحتاجه لتوزيع (مفاتيح ، certs) لاتصال مقبس Python W/ SSL؟

StackOverflow https://stackoverflow.com/questions/4609859

  •  25-09-2019
  •  | 
  •  

سؤال

أحاول أن أكتب تطبيقًا عامًا للخادم العميل الذي سيكون قادرًا على تبادل البيانات بين الخوادم. لقد قرأت عدد قليل من مستندات OpenSSL ، وقد نجحت في إعداد CA الخاص بي وأنشأت شهادة CERT (والمفتاح الخاص) لأغراض الاختبار.

أنا عالق مع Python 2.3 ، لذلك لا يمكنني استخدام مكتبة "SSL" القياسية. بدلاً من ذلك ، أنا عالق مع Pyopenssl ، الذي لا يبدو سيئًا ، ولكن لا يوجد العديد من المستندات حول هذا الموضوع.

سؤالي لا يتعلق حقًا بالحصول على العمل. أنا أكثر حيرة من الشهادات وأين يحتاجون للذهاب.

إليكم البرنامجين فعل الشغل:

الخادم:

#!/bin/env python

from OpenSSL import SSL
import socket
import pickle

def verify_cb(conn, cert, errnum, depth, ok):
    print('Got cert: %s' % cert.get_subject())
    return ok


ctx = SSL.Context(SSL.TLSv1_METHOD)
ctx.set_verify(SSL.VERIFY_PEER|SSL.VERIFY_FAIL_IF_NO_PEER_CERT, verify_cb)

# ??????
ctx.use_privatekey_file('./Dmgr-key.pem')
ctx.use_certificate_file('Dmgr-cert.pem')
# ??????
ctx.load_verify_locations('./CAcert.pem')

server = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))

server.bind(('', 50000))
server.listen(3)

a, b = server.accept()

c = a.recv(1024)
print(c)

عميل:

from OpenSSL import SSL
import socket
import pickle


def verify_cb(conn, cert, errnum, depth, ok):
    print('Got cert: %s' % cert.get_subject())
    return ok

ctx = SSL.Context(SSL.TLSv1_METHOD)
ctx.set_verify(SSL.VERIFY_PEER, verify_cb)

# ??????????
ctx.use_privatekey_file('/home/justin/code/work/CA/private/Dmgr-key.pem')
ctx.use_certificate_file('/home/justin/code/work/CA/Dmgr-cert.pem')
# ?????????
ctx.load_verify_locations('/home/justin/code/work/CA/CAcert.pem')

sock = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))
sock.connect(('10.0.0.3', 50000))

a = Tester(2, 2)
b = pickle.dumps(a)
sock.send("Hello, world")

sock.flush()
sock.send(b)
sock.shutdown()
sock.close()

لقد وجدت هذه المعلومات من ftp://ftp.pbone.net/mirror/ftp.pld-linux.org/dists/2.0/pld/i586/pld/rpms/python-pyopenssl-examples-0.6-2.i586.rpm الذي يحتوي على بعض النصوص على سبيل المثال.

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

حاولت بالتناوب إزالة إما peke أو cert على أي من المربعين ، وأحصل على الخطأ التالي بغض النظر عن الإزالة:

Openssl.ssl.Error: [('SSL Rottomines' ، 'SSL3_Read_Bytes' ، 'SSLV3 Failure Haintshake') ، ('ssl rotins' ، 'ssl3_write_bytes' ، 'fails ssl handshake'))]

هل يمكن لشخص ما أن يشرح ما إذا كان هذا هو السلوك المتوقع لـ SSL. هل أحتاج حقًا إلى توزيع المفتاح الخاص والشرفة العامة على جميع عملائي؟ أحاول تجنب أي مشاكل أمنية ضخمة ، ويميل تسرب المفاتيح الخاصة إلى أن تكون كبيرة ...

شكرا للمساعدة!

==================================================================

بفضل CAF لمساعدتي في معرفة المشكلة. بناءً على توصيته ، قمت بإنشاء أزواج شهادة جديدة: Spaceman و DMGR. ثم أضع كل من قطع الغيار "Spaceman" (KEY ، CERT) في برنامج العميل ، ونفس الشيء بالنسبة لمفاتيح "DMGR".

في الأساس ، فقط الخطان التاليان في عميل تم تغييره ، على الرغم من أنه كان هناك عمل من العمل مع OpenSSL على الجانب.

ctx.use_privatekey_file('/home/justin/code/work/CA/private/Dmgr-key.pem')
ctx.use_certificate_file('/home/justin/code/work/CA/Dmgr-cert.pem')

نسخة مصححة:

ctx.use_privatekey_file('/home/justin/code/work/CA/private/spaceman-key.pem')
ctx.use_certificate_file('/home/justin/code/work/CA/spacemancert.pem')
هل كانت مفيدة؟

المحلول

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

زوج المفاتيح الشهادة/المفتاح الخاص هو الشخص الذي تضعه باستخدامه use_privatekey_file() و use_certificate_file(). يجب أن يكون هذا مختلف الشهادة/زوج المفتاح على الخادم والعميل.

عند التحقق من شهادة الأقران ، تحتاج بعد ذلك إلى التحقق من:

  • أن الشهادة صالح (أي ، موقعة من قبل CA تثق بها في هذا التطبيق ، وليس منتهية الصلاحية ، لم يتم إلغاؤها) ؛ و
  • يتوافق مع الأقران الذي أنت فكر في أنت على اتصال (أي أن الشهادة تطابق الهوية التي يدعيها الأقران). يتم تخزين هذه الهوية داخل SubjectName حقل الشهادة ، وهو خاص بالتطبيق كيف تقوم بتخطيط هذا لهوية نظير (قد يكون اسم تسجيل الدخول للمستخدم أو اسم DNS أو أي شيء آخر).
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top