اتصال TLS مع PSK باستخدام Bouncycastle

يجب أن أقوم بإنشاء اتصال TLS إلى خادم بعيد باستخدام مفتاح تمت مشاركته مسبقاً. أنا حاليًا أستخدم PSKTlsClient من Bouncycastle. يبدو رمز التهيئة الخاص بي على النحو التالي:

 socket_ = new Socket(address,port);            
 tlsHandler_ = new TlsProtocolHandler(socket_.getInputStream(),socket_.getOutputStream());           
 pskTlsClient_ = new PSKTlsClient(tlsPskInfo_);            
 tlsHandler_.connect(pskTlsClient_);

ومع ذلك ايم الحصول على هذا stacktrace:

java.io.IOException: Internal TLS error, this could be an attack
at org.bouncycastle.crypto.tls.TlsProtocolHandler.failWithError(Unknown Source)
at org.bouncycastle.crypto.tls.TlsProtocolHandler.safeReadData(Unknown Source)
at org.bouncycastle.crypto.tls.TlsProtocolHandler.connect(Unknown Source)
at common.network.Transport.PskTlsClientSocket.connect(PskTlsClientSocket.java:61)

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

0

1 إجابة

تم حلها. كانت المشكلة ، أنه في مكتبة bouncycastle java ، لم يتم تنفيذ طريقة شهادة خادم العملية ودائما يلقي خطأ داخلي. لذلك اضطررت إلى تنفيذ ذلك وكل شيء سار على ما يرام بعد ذلك.

تصحيح: في TlsPSKKeyExchange.java تغيير الطريقة التالية إلى:

public void processServerCertificate(Certificate serverCertificate) throws IOException
{
    SubjectPublicKeyInfo subPubKeyInfo = serverCertificate.certs[0].getTBSCertificate().getSubjectPublicKeyInfo();
    RSAPublicKey pubKey = RSAPublicKey.getInstance(subPubKeyInfo.getPublicKey());
    rsaServerPublicKey = new RSAKeyParameters(false,pubKey.getModulus(),pubKey.getPublicExponent());
}

يتم استخدام المفتاح العمومي الأول في الشهادة الأولى لتشفير RSA.

0
وأضاف
لقد قمت للتو بتحديث المنشور وأضفت الكود
وأضاف المؤلف nux, مصدر
شكرا للتلميح.
وأضاف المؤلف nux, مصدر
شكرًا للإبلاغ عن nux.
وأضاف المؤلف Maarten Bodewes, مصدر
هل يمكنك نشر مثال مقتطف للآخرين؟
وأضاف المؤلف sharjeel, مصدر
لست متأكدًا من التوقيت ذي الصلة ، ولكن تم تطبيق أحدث إصدار من BC (1.49) على TlsPSKKeyExchange.processServerCertificate ، لذلك لم يعد من الضروري إجراء هذا التغيير.
وأضاف المؤلف Peter Dettman, مصدر