আমার ক্ষেত্রে আমার কাছে একটি পেম ফাইল ছিল যা পারস্পরিক এসএসএল প্রমাণীকরণে ব্যবহার করার জন্য দুটি শংসাপত্র এবং একটি এনক্রিপ্ট করা ব্যক্তিগত কী রয়েছে। সুতরাং আমার পেম ফাইলটি দেখতে এমন দেখাচ্ছে:
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,C8BF220FC76AA5F9
...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
এখানে আমি কি করেছি
ফাইলটি তিনটি পৃথক পৃথক ফাইলে বিভক্ত করুন, যাতে প্রত্যেকে একটি করে প্রবেশ করে, লাইন ---BEGIN..
দিয়ে শুরু এবং শেষ হয় ---END..
। অনুমান করতে দেয় আমরা এখন তিনটি ফাইল আছে: cert1.pem
, cert2.pem
, এবংpkey.pem
।
pkey.pem
ওপেনসেল এবং নিম্নলিখিত সিনট্যাক্স ব্যবহার করে DER ফর্ম্যাটে রূপান্তর করুন :
openssl pkcs8 -topk8 -Nocrypt-in pkey.pem -infor PEM -out pkey.der -outfor DER
দ্রষ্টব্য, যদি ব্যক্তিগত কীটি এনক্রিপ্ট করা থাকে তবে ডিইআর ফর্ম্যাটে রূপান্তর করতে আপনাকে একটি পাসওয়ার্ড সরবরাহ করতে হবে (মূল পেম ফাইলের সরবরাহকারী থেকে এটি গ্রহণ করুন),
openssl
আপনাকে পাসওয়ার্ডের জন্য অনুরোধ করবে: "এর জন্য একটি পাসফ্রেজ লিখুনpkey.pem
:"।
যদি রূপান্তর সফল হয়, আপনি কল করা একটি নতুন ফাইল পাবেন pkey.der
।
একটি নতুন জাভা কীস্টোর তৈরি করুন এবং ব্যক্তিগত কী এবং শংসাপত্রগুলি আমদানি করুন:
String keypass = "password"; // this is a new password, you need to come up with to protect your java key store file
String defaultalias = "importkey";
KeyStore ks = KeyStore.getInstance("JKS", "SUN");
// this section does not make much sense to me,
// but I will leave it intact as this is how it was in the original example I found on internet:
ks.load( null, keypass.toCharArray());
ks.store( new FileOutputStream ( "mykeystore" ), keypass.toCharArray());
ks.load( new FileInputStream ( "mykeystore" ), keypass.toCharArray());
// end of section..
// read the key file from disk and create a PrivateKey
FileInputStream fis = new FileInputStream("pkey.der");
DataInputStream dis = new DataInputStream(fis);
byte[] bytes = new byte[dis.available()];
dis.readFully(bytes);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
byte[] key = new byte[bais.available()];
KeyFactory kf = KeyFactory.getInstance("RSA");
bais.read(key, 0, bais.available());
bais.close();
PKCS8EncodedKeySpec keysp = new PKCS8EncodedKeySpec ( key );
PrivateKey ff = kf.generatePrivate (keysp);
// read the certificates from the files and load them into the key store:
Collection col_crt1 = CertificateFactory.getInstance("X509").generateCertificates(new FileInputStream("cert1.pem"));
Collection col_crt2 = CertificateFactory.getInstance("X509").generateCertificates(new FileInputStream("cert2.pem"));
Certificate crt1 = (Certificate) col_crt1.iterator().next();
Certificate crt2 = (Certificate) col_crt2.iterator().next();
Certificate[] chain = new Certificate[] { crt1, crt2 };
String alias1 = ((X509Certificate) crt1).getSubjectX500Principal().getName();
String alias2 = ((X509Certificate) crt2).getSubjectX500Principal().getName();
ks.setCertificateEntry(alias1, crt1);
ks.setCertificateEntry(alias2, crt2);
// store the private key
ks.setKeyEntry(defaultalias, ff, keypass.toCharArray(), chain );
// save the key store to a file
ks.store(new FileOutputStream ( "mykeystore" ),keypass.toCharArray());
(alচ্ছিক) আপনার নতুন কী স্টোরের সামগ্রীটি যাচাই করুন:
$ keytool -list -keystore mykeystore -storepass password
কীস্টোর প্রকার: জে কেএস কীস্টোর সরবরাহকারী: সান
আপনার কীস্টোরটিতে 3 টি প্রবেশ রয়েছে:
সিএন = ..., আউ = ..., ও = .., ২ সেপ্টেম্বর, 2014, বিশ্বস্ত ক্যারেন্টেট্রি, শংসাপত্রের ফিঙ্গারপ্রিন্ট (এসএএএ 1): 2 সি: বি 8: ...
আমদানি, সেপ্টেম্বর 2, 2014, প্রাইভেটকিএন্ট্রি, শংসাপত্রের ফিঙ্গারপ্রিন্ট (SHA1): 9 সি: বি 0: ...
সিএন = ..., ও = ...., সেপ্টেম্বর 2, 2014, বিশ্বস্তকার্টেনট্রি, শংসাপত্রের ফিঙ্গারপ্রিন্ট (SHA1): 83:63: ...
(alচ্ছিক) আপনার এসএসএল সার্ভারের বিপরীতে আপনার নতুন কী স্টোর থেকে আপনার শংসাপত্র এবং ব্যক্তিগত কী পরীক্ষা করুন: (আপনি ভিএম বিকল্প হিসাবে ডিবাগিং সক্ষম করতে চাইতে পারেন: -জাজাক্সটনে.দেবগ = সব)
char[] passw = "password".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS", "SUN");
ks.load(new FileInputStream ( "mykeystore" ), passw );
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, passw);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
TrustManager[] tm = tmf.getTrustManagers();
SSLContext sclx = SSLContext.getInstance("TLS");
sclx.init( kmf.getKeyManagers(), tm, null);
SSLSocketFactory factory = sclx.getSocketFactory();
SSLSocket socket = (SSLSocket) factory.createSocket( "192.168.1.111", 443 );
socket.startHandshake();
//if no exceptions are thrown in the startHandshake method, then everything is fine..
অবশেষে আপনার শংসাপত্রগুলি HTTPURL সংযোগের সাথে নিবন্ধন করুন যদি এটি ব্যবহার করার পরিকল্পনা করা হয়:
char[] passw = "password".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS", "SUN");
ks.load(new FileInputStream ( "mykeystore" ), passw );
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, passw);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
TrustManager[] tm = tmf.getTrustManagers();
SSLContext sclx = SSLContext.getInstance("TLS");
sclx.init( kmf.getKeyManagers(), tm, null);
HostnameVerifier hv = new HostnameVerifier()
{
public boolean verify(String urlHostName, SSLSession session)
{
if (!urlHostName.equalsIgnoreCase(session.getPeerHost()))
{
System.out.println("Warning: URL host '" + urlHostName + "' is different to SSLSession host '" + session.getPeerHost() + "'.");
}
return true;
}
};
HttpsURLConnection.setDefaultSSLSocketFactory( sclx.getSocketFactory() );
HttpsURLConnection.setDefaultHostnameVerifier(hv);