۱۴۰۰ دی ۶, دوشنبه

فعال سازی پروتکل های قدیمی TSL/SSL در جاوا

 همیشه این امکان وجود دارد که با یک پروژه قدیمی روبرو شویم و مجبور باشیم تا آنرا اصلاح و یا بروزرسانی کنیم. معمولا استک آنها خیلی قدیمی و منسوخ شده هستند، مانند پروژه ای که هفته پیش روی آن کار کردم، دیتابیس این پروژه SQL Server بود که برای ارتباط امن از پروتکل TSL 1.0 استفاده می‌کرد! من روی سیستم ام JDK 8 آپدیت 312 را نصب کرده بودم، و روی این نسخه از جاوا، TSL 1.0 به دلایل امنیتی، غیر فعال شده است. نتیجه این که پروژه اسپرینگ بوت قدیمی، امکان برقراری ارتباط با دیتابیس را نداشت و خطای زیر را نمایش میداد:


com.microsoft.sqlserver.jdbc.SQLServerException: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "The server selected protocol version TLS10 is not accepted by
client preferences [TLS12]". ClientConnectionId:38242ee7-8809-47a1-b020-2df5e3cc8683

برای بروز کردن یکی از سرویس های پروژه نیازمند اجرای آن روی سیستم ام بودم، و امکان بروز کردن دیتابیس وجود نداشت. راه حل بعدی نصب نسخه قدیمی تر از JDK بود که با این پروتکل سازگار باشد (!). اما، یک راه دیگر نیز هست، فعال کردن این پروتکل روی جاوای موجود.

برای این منظور، از یار قدیمی، گوگل استفاده کردم و دنبال راه حلی برای فعال سازی پروتکل TSL 1.0 گشتم که در آدرس زیر راه حل آنرا پیدا کردم: https://www.qvera.com/kb/index.php/2689/how-to-re-enable-tlsv1-and-tlsv1-1-in-java-8

برای فعال سازی این پروتکل، باید وارد مسیر JAVA_HOME جاوای مد نظرتان شوید (مسیری که جاوا نصب شده و شامل پوشه های اصلی برنامه نظیر bin، bundle و غیره میشود) و فایل java.security را در آن مسیر جستجو کنید و آنرا برای ویرایش باز کنید.

اکنون دنبال مقدار jdk.tls.disabledAlgorithms در فایل بگردید، این کلید مقادیر الگوریتم های غیر فعال شده را نگهداری می‌کند که با حذف نام الگوریتم، دوباره در جاوا فعال میشود، که برای پروژه من TSL1 باید حذف میشد:


jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, include jdk.disabled.namedCurves

مقدار jdk.tls.disabledAlgorithms بعد از اصلاح:


jdk.tls.disabledAlgorithms=SSLv3, TLSv1.1, RC4, DES, MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, include jdk.disabled.namedCurves

اکنون میتوانید براحتی از پروتکل مد نظر استفاده کنید. توجه داشته باشید که این روش به هیچ وجه برای نسخه های جدید اپلیکیشن یا پروژه های جدید استفاده نکنید، زیرا شامل خطرات امنیتی بسیار بالایی می‌شود.