সার্ভারের সাথে নিরাপদ সংযোগ ব্যবহার করে সফটওয়্যার তৈরি করা প্রতিটি ডেভেলপারের দক্ষতা হওয়া উচিত। আপনি যদি কোনো নির্দিষ্ট প্রোডাকশন পরিবেশে SSL সক্ষম না করেও থাকেন, তবুও আপনি যে সার্ভারগুলোর সাথে কাজ করেন সেগুলোর সাথে সংযোগ সুরক্ষিত করার পদ্ধতি জানতে হবে। এই পোস্টটি Python-এ Redis Enterprise Cloud-এ নিরাপদ সংযোগ সক্ষম করার বিষয়ে লিখিত পূর্ববর্তী পোস্টের অনুসরণকারী, যেটি জাভা ডেভেলপারদের জন্য লেখা।
এই পোস্টটি Redis Enterprise Cloud এবং একটি জাভা ক্লায়েন্ট প্রোগ্রামের মধ্যে এনক্রিপ্টেড সংযোগ চালু, পরীক্ষা ও কনফিগার করার একটি সহজ প্রক্রিয়া বর্ণনা করবে। জাভা প্রোগ্রামের জন্য SSL সক্ষম করার সবচেয়ে বিভ্রান্তিকর অংশ হল সার্টিফিকেট এবং কীগুলিকে জাভ아가 বুঝতে পারে এমন ফরম্যাটে রূপান্তর করা। এটি একটি জাভা-নির্দিষ্ট প্রক্রিয়া যা আমাদের প্রক্রিয়ার পরীক্ষা ও কনফিগারেশন ধাপের মাঝপথে যোগ করতে হবে।
টুলসেট
Redis-এ SSL সক্ষম করার টিকেট বন্ধ করতে নিচের টুলগুলো সংগ্রহ করুন:
- Redis Enterprise Cloud অ্যাকাউন্ট
- OpenSSL
- Java SE JDK
- Jedis
আপনার কাছে Bash শেলও থাকতে হবে যাতে আমরা প্রদত্ত একটি ছোট স্ক্রিপ্ট চালাতে পারি। আপনার অপারেটিং সিস্টেমে Bash যদি স্ট্যান্ডার্ড ইনস্টলেশনের অংশ না হয়, তবে এটি ইনস্টল করতে হবে অথবা আপনার পছন্দের শেল অনুযায়ী স্ক্রিপ্টটি অনুবাদ করতে হবে।
SSL ব্যবহার করতে হলে আপনার Redis Enterprise Cloud সাবস্ক্রিপশনে SSL ফিচার সক্রিয় থাকতে হবে। যদি আপনার অ্যাকাউন্টে SSL ইতিমধ্যে সক্রিয় না থাকে, তবে Redis সাপোর্ট টিমের সাথে যোগাযোগ করে এটি সক্রিয় করতে হবে। আপনার অ্যাকাউন্ট ড্যাশবোর্ডের প্রধান মেনুতে সাপোর্ট টিমের সাথে যোগাযোগ করার লিংক পাবেন। SSL সেট আপ করার ডকুমেন্টেশন Redis Enterprise Cloud Operations and Administration Guide-এ পাওয়া যাবে।
SSL বনাম TLS
স্মরণ করুন: আমাদের Python পোস্টের মতোই, আমরা অনানুষ্ঠানিক কনভেনশন অনুসরণ করে "SSL" শব্দটিকে "SSL" বা "TLS"-নিরাপদ সংযোগ উভয়েরই প্রতীক হিসেবে ব্যবহার করব। যদিও Redis Enterprise Cloud (জুন ২০১৮ পর্যন্ত) সংযোগ নিরাপদ করতে TLS প্রোটোকল সংস্করণ ১.২ ব্যবহার করে, তবুও Redis Enterprise Cloud এবং Jedis উভয়ই "SSL" тер্মটি ব্যবহার করে, তাই আমরাও সেটি অনুসরণ করব।
ধাপ এক এবং দুই
প্রথম দুটি ধাপ Python ক্লায়েন্টের জন্য SSL সেট আপ করার মতোই। এখানে সেগুলো পুনরাবৃত্তি না করে আমরা আপনাকে সেই Python পোস্টে ফিরে যাবার পরামর্শ দিচ্ছি। যেকোনো ভাষায় SSL নিয়ে কাজ করার জন্য সেখানে অনেক উপকারী তথ্য রয়েছে। ধাপ ৩-এ যাওয়ার আগে সেখানে ধাপ ৩ পর্যন্ত সব কিছু পড়ার সুপারিশ করছি।
প্রক্রিয়াটি জাভার জন্য ধাপ ২-র পর ভিন্ন হয়ে যায়, তাই আমরা এখানে একটি ধাপ ২.৫ যোগ করছি যাতে Redis Enterprise Cloud-এ থেকে ডাউনলোড করা ক্রেডেনশিয়াল ফাইলগুলো JavaSE-এ উপযোগী ফরম্যাটে রূপান্তরিত হয়।
ধাপ ২.৫: ক্রেডেনশিয়াল রূপান্তর
JavaSE-র স্ট্যান্ডার্ড অংশ হিসেবে Oracle নানাদিক সুরক্ষা সার্ভিস প্রদান করে, যার মধ্যে রয়েছে Java Cryptography Architecture (JCA)। JCA জাভা অ্যাপ্লিকেশনগুলোর জন্য সুরক্ষা সার্ভিস আহ্বান করার API সেট সংজ্ঞায়িত করে যা প্লাগ-ইন প্রোভাইডার দ্বারা বাস্তবায়িত হয়। অ্যাপ্লিকেশনগুলো যেকোনো উপলব্ধ প্রোভাইডার ব্যবহার করতে পারে (যারা প্রায়শু স্ট্যান্ডার্ড API-এর বাইরে অতিরিক্ত সার্ভিস দেন), তবে অধিকাংশ অ্যাপ্লিকেশন JDK-র সাথে দেওয়া ডিফল্ট প্রোভাইডারগুলো ব্যবহার করে।
ডিফল্ট প্রোভাইডারগুলো ব্যবহার করার চ্যালেঞ্জ হলো সেগুলো PEM ফরম্যাট সাপোর্ট করে না, যা লিনাক্স SSL লাইব্রেরি সার্টিফিকেট ও কী সংরক্ষণের জন্য সাধারণভাবে ব্যবহৃত হয়। JCA-তে ক্রেডেনশিয়াল উপাদান পাসওয়ার্ড-সুরক্ষিত কীস্টোর রিপোজিটরিতে সংরক্ষিত হয়। জাভা অ্যাপ্লিকেশনে দুটি রিপোজিটরি ব্যবহার করা সাধারণ: একটিকে ডকুমেন্টেশনে কীস্টোর বলা হয় আর অন্যটিকে ট্রাস্টস্টোর। কীস্টোরে ক্লায়েন্ট সফটওয়্যারের সার্টিফিকেট ও প্রাইভেট কী রাখা হয়, আর ট্রাস্টস্টোরে সার্টিফিকেট অথরিটির বিশ্বস্ত সার্টিফিকেটগুলো থাকে। Redis Enterprise Cloud PEM ফরম্যাট ব্যবহার করে, তাই আমরা OpenSSL এবং Java Keytool ব্যবহার করে একটি স্ক্রিপ্ট তৈরি করেছি যা আপনার PEM ফাইলগুলোকে জাভা ক্লায়েন্ট প্রোগ্রামের জন্য ব্যবহারযোগ্য ট্রাস্টস্টোর ও কীস্টোরে রূপান্তর করতে প্রয়োজনীয় সকল কমান্ড এক্সিকিউট করে।
নিচের স্ক্রিপ্টটি, transmogrify.sh, আপনার redis_credentials.zip আনপ্যাক করা ডিরেক্টরি থেকে চালাতে হবে। স্ক্রিপ্টটি Redis Certificate Authority সার্টিফিকেট (redis_ca.pem) ব্যবহার করে একটি ট্রাস্টস্টোর (redis_truststore.p12) তৈরি করে এবং ক্লায়েন্ট সার্টিফিকেট (redis_user.crt) ও সংশ্লিষ্ট প্রাইভেট কী (redis_user_private.key) ব্যবহার করে একটি কীস্টোর (redisclient_keystore.p12) তৈরি করে। যদিও ক্লায়েন্ট কীস্টোর পাসওয়ার্ড দ্বারা সুরক্ষিত, তবুও আপনাকে আপনার কীস্টোরের নিরাপত্তা নিশ্চিত করতে হবে। কীস্টোর ও ট্রাস্টস্টোর উভয়কেই একটি নির্দিষ্ট Redis ডাটাবেস ইনস্ট্যান্সের সাথে সংযোগকারী প্রতিটি ক্লায়েন্টে বিতরণ করতে হবে, তাই আপনার ক্রেডেনশিয়াল ম্যানেজমেন্ট সিস্টেমে এই ফাইলগুলো একীভূত করা উচিত।
JDK9-এর পূর্বের জাভা সংস্করণগুলো मालিকানাধীন Java KeyStore (JKS) ফরম্যাট পছন্দ করত, কিন্তু JDK9 থেকে জাভা ইন্ডাস্ট্রি স্ট্যান্ডার্ড PKCS12 ফরম্যাটকে ডিফল্ট হিসেবে ব্যবহার করে। এই স্ক্রিপ্ট PKCS12 ফরম্যাটে স্টোর তৈরি করে, কিন্তু আপনি স্ক্রিপ্টটি মডিফাই করে স্টোর টাইপ অপশন ও ফাইল এক্সটেনশন পরিবর্তন করে JKS ফরম্যাটও ব্যবহার করতে পারেন।
ধাপ ৩: ক্লায়েন্ট কোডে SSL কনফিগার করুন
আপনার জাভা ক্লায়েন্টে SSL সক্ষম করার চূড়ান্ত ধাপ হলো ক্লায়েন্ট কোড মডিফাই করে একটি SSL সংযোগ স্থাপন করা। আমাদের নমুনা কোড আমাদের Redis Enterprise Cloud ইনস্ট্যান্সের সাথে একটি নিরাপদ সংযোগ স্থাপন করবে, তারপর Redis PING কমান্ড পাঠাবে। আমাদের মডিফাইড কোড দেখতে হবে:
(এখানে কোড স্নিপেট থাকে, যা বাদ দেওয়া হয়েছে)
আপনি লক্ষ্য করবেন, কোডে কোথাও আমরা ধাপ ২.৫-এ তৈরি করা কীস্টোর বা ট্রাস্টস্টোরকে রেফারেন্স করিনি। JCA প্রোভাইডারهای ডিফল্ট আচরণ সার্ভারকে প্রমাণীকরণ করে; আমাদের শুধু আমাদের কী ও সার্টিফিকেটের তথ্য দিতে হবে। এটি সিস্টেম প্রোপার্টির মাধ্যমে করা যায় যা JCA প্রোভাইডার পড়ে। আপনার IDE অ্যাপ্লিকেশন কনফিগারেশন বা java কমান্ড লাইনে নিচের প্যারামিটারগুলো যোগ করুন:
(এখানে প্যারামিটারগুলো থাকে)
সিস্টেমের উপযুক্ত লোকেশন ও পাসওয়ার্ড ব্যবহার করে সেগুলো মডিফাই করুন।
কীস্টোর প্রোপার্টিগুলো:
javax.net.ssl.keyStoreType=PKCS12javax.net.ssl.keyStore=/Users/tague/dev/ssl-testj/redisclient_keyStore.p12javax.net.ssl.keyStorePassword=redis
এগুলো ট্রান্সমোগ্রিফাই স্ক্রিপ্ট দ্বারা তৈরি কীস্টোরের টাইপ (ফরম্যাট), লোকেশন ও পাসওয়ার্ড নির্দেশ করে। অনুরূপভাবে, ট্রাস্টস্টোর প্রোপার্টিগুলো:
javax.net.ssl.trustStoreType=PKCS12javax.net.ssl.trustStore=/Users/tague/dev/ssl-testj/redis_truststore.p12javax.net.ssl.trustStorePassword=redis
ট্রাস্টস্টোরের টাইপ, লোকেশন ও পাসওয়ার্ড নির্দেশ করে। চূড়ান্ত প্রোপার্টি javax.net.debug=ssl:handshake হলো একটি অপশনাল প্রোপার্টি যা ডিবাগ ইনফরমেশন সক্ষম করতে ব্যবহৃত হয়।
Jedis-কে SSL ব্যবহার করতে কনফিগার করা специјаলি কঠিন নয়, কিন্তু যদি আপনি PEM ক্রেডেনশিয়ালকে জাভা কী ও ট্রাস্টস্টোরে রূপান্তর করার প্রয়োজনীয় ধাপগুলোর সাথে পরিচিত না হন, তবে শুরুতে এটি ভয়ঙ্কর লাগতে পারে।
আশা করি এই পোস্টটি আমাদের জাভা প্রেমীদের জন্য Redis Enterprise Cloud-এ নিরাপদ সংযোগ সেট আপ করার একই সহজ পরিচয় দিয়েছে যা আমরা Python ডেভেলপারদের দিয়েছিলাম। আমি একটি চূড়ান্ত স্মরণ করাতে চাই নিরাপত্তা নিয়ে: অধিকাংশ সংস্থার পাসওয়ার্ড ও প্রাইভেট কী ম্যানেজ করার নির্দিষ্ট নীতি ও প্রক্রিয়া থাকে। অনুগ্রহ করে আপনার অপারেশন ও সিকিউরিটি টিমের সাথে যাচাই করুন যাতে আপনি তাদের গাইডলাইন মেনে চলছেন।