অ্যান্ড্রয়েড প্ল্যাটফর্ম দ্বারা বিশ্বাসযোগ্য হিসাবে বিবেচিত নয় যা শংসাপত্র কর্তৃপক্ষের সুরক্ষিত সংযোগ অর্জনের জন্য নিম্নলিখিত প্রধান পদক্ষেপগুলির প্রয়োজন।
অনেক ব্যবহারকারীদের অনুরোধ হিসাবে, আমি আমার ব্লগ নিবন্ধ থেকে সর্বাধিক গুরুত্বপূর্ণ অংশগুলি মিরর করেছি :
- সমস্ত প্রয়োজনীয় শংসাপত্র (রুট এবং কোনও মধ্যবর্তী সিএ এর) গ্র্যাব করুন
- কীটল এবং বাউনিসিস্টল সরবরাহকারীর সাথে একটি কীস্টোর তৈরি করুন এবং শংসাপত্রগুলি আমদানি করুন
- আপনার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে কীস্টোরটি লোড করুন এবং সুরক্ষিত সংযোগগুলির জন্য এটি ব্যবহার করুন (আমি স্ট্যান্ডার্ডের পরিবর্তে অ্যাপাচি এইচটিপিপিলেট ব্যবহার করার পরামর্শ দিচ্ছি
java.net.ssl.HttpsURLConnection
(বুঝতে আরও সহজ, আরও পারফরম্যান্ট))
শংসাপত্রগুলি ধরুন
আপনাকে সমস্ত শংসাপত্রগুলি পেতে হবে যা রুট সিএ পর্যন্ত পুরোপুরি শেষ পয়েন্ট শংসাপত্র থেকে একটি চেইন তৈরি করে। এর অর্থ, যে কোনও (উপস্থিত থাকলে) ইন্টারমিডিয়েট সিএ শংসাপত্র এবং রুট সিএ শংসাপত্র। আপনার শেষ পয়েন্ট শংসাপত্র পাওয়ার দরকার নেই।
কীস্টোরটি তৈরি করুন
বাউনসিস্টল সরবরাহকারীটি ডাউনলোড করুন এবং এটি একটি পরিচিত স্থানে সংরক্ষণ করুন। এছাড়াও নিশ্চিত করুন যে আপনি কীটল কমান্ডটি চালু করতে পারেন (সাধারণত আপনার জেআরই ইনস্টলেশনের বিন ফোল্ডারের নীচে অবস্থিত)।
এখন প্রাপ্ত শংসাপত্রগুলি (শেষের বিন্দু শংসাপত্রটি আমদানি করবেন না) বাউন্সিস্টল ফর্ম্যাটেড কীস্টোরগুলিতে আমদানি করুন।
আমি এটি পরীক্ষা করিনি, তবে আমি মনে করি শংসাপত্রগুলি আমদানির ক্রমটি গুরুত্বপূর্ণ। এর অর্থ, প্রথমে নিম্নতম মধ্যবর্তী সিএ শংসাপত্রটি আমদানি করুন এবং তারপরে রুট সিএ শংসাপত্রটি পর্যন্ত।
নিম্নলিখিত কমান্ডের সাথে একটি নতুন কীস্টোর (ইতিমধ্যে উপস্থিত না থাকলে) পাসওয়ার্ড সহ মাইক্রিট তৈরি হবে এবং মধ্যবর্তী সিএ শংসাপত্রটি আমদানি করা হবে। আমি বাউনসিস্টল সরবরাহকারীর সংজ্ঞাও দিয়েছি, যেখানে এটি আমার ফাইল সিস্টেম এবং কীস্টোর ফর্ম্যাটে পাওয়া যাবে। শৃঙ্খলে প্রতিটি শংসাপত্রের জন্য এই আদেশটি কার্যকর করুন।
keytool -importcert -v -trustcacerts -file "path_to_cert/interm_ca.cer" -alias IntermediateCA -keystore "res/raw/mykeystore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "path_to_bouncycastle/bcprov-jdk16-145.jar" -storetype BKS -storepass mysecret
কীস্টোরে শংসাপত্রগুলি সঠিকভাবে আমদানি করা হয়েছিল কিনা তা যাচাই করুন:
keytool -list -keystore "res/raw/mykeystore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "path_to_bouncycastle/bcprov-jdk16-145.jar" -storetype BKS -storepass mysecret
পুরো চেইন আউটপুট করা উচিত:
RootCA, 22.10.2010, trustedCertEntry, Thumbprint (MD5): 24:77:D9:A8:91:D1:3B:FA:88:2D:C2:FF:F8:CD:33:93
IntermediateCA, 22.10.2010, trustedCertEntry, Thumbprint (MD5): 98:0F:C3:F8:39:F7:D8:05:07:02:0D:E3:14:5B:29:43
এখন আপনি নীচে আপনার অ্যান্ড্রয়েড অ্যাপ্লিকেশনে একটি কাঁচা সংস্থান হিসাবে কীস্টোরটি অনুলিপি করতে পারেন res/raw/
আপনার অ্যাপ্লিকেশনটিতে কীস্টোরটি ব্যবহার করুন
সবার আগে আমাদের একটি কাস্টম অ্যাপাচি এইচটিটিপিপ্লায়েন্ট তৈরি করতে হবে যা এইচটিটিপিএস সংযোগের জন্য আমাদের কীস্টোর ব্যবহার করে:
import org.apache.http.*
public class MyHttpClient extends DefaultHttpClient {
final Context context;
public MyHttpClient(Context context) {
this.context = context;
}
@Override
protected ClientConnectionManager createClientConnectionManager() {
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
// Register for port 443 our SSLSocketFactory with our keystore
// to the ConnectionManager
registry.register(new Scheme("https", newSslSocketFactory(), 443));
return new SingleClientConnManager(getParams(), registry);
}
private SSLSocketFactory newSslSocketFactory() {
try {
// Get an instance of the Bouncy Castle KeyStore format
KeyStore trusted = KeyStore.getInstance("BKS");
// Get the raw resource, which contains the keystore with
// your trusted certificates (root and any intermediate certs)
InputStream in = context.getResources().openRawResource(R.raw.mykeystore);
try {
// Initialize the keystore with the provided trusted certificates
// Also provide the password of the keystore
trusted.load(in, "mysecret".toCharArray());
} finally {
in.close();
}
// Pass the keystore to the SSLSocketFactory. The factory is responsible
// for the verification of the server certificate.
SSLSocketFactory sf = new SSLSocketFactory(trusted);
// Hostname verification from certificate
// http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e506
sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
return sf;
} catch (Exception e) {
throw new AssertionError(e);
}
}
}
আমরা আমাদের কাস্টম এইচটিটিপিপ্লায়েন্ট তৈরি করেছি, এখন আমরা নিরাপদ সংযোগের জন্য এটি ব্যবহার করতে পারি। উদাহরণস্বরূপ, যখন আমরা একটি রেস্ট রিসোর্সে জিইটি কল করি:
// Instantiate the custom HttpClient
DefaultHttpClient client = new MyHttpClient(getApplicationContext());
HttpGet get = new HttpGet("https://www.mydomain.ch/rest/contacts/23");
// Execute the GET call and obtain the response
HttpResponse getResponse = client.execute(get);
HttpEntity responseEntity = getResponse.getEntity();
এটাই ;)