निम्न विधि डिफ़ॉल्ट (cacerts) कुंजीस्टोर लोड करता है, एक प्रमाण पत्र स्थापित किया गया है, तो देखने के लिए जाँच करता है, और यह नहीं तो स्थापित करता है। यह किसी भी सर्वर पर keystore
कमांड मैन्युअल रूप से चलाने की आवश्यकता को समाप्त करता है।
यह मानता है कि डिफ़ॉल्ट कुंजीस्टोर पासवर्ड (changeit) में कोई बदलाव नहीं है, CACERTS_PASSWORD
अद्यतन नहीं तो। ध्यान दें कि विधि प्रमाणपत्र जोड़ने के बाद कीस्टोर को सहेजता है, इसलिए एक बार सर्टिफिकेट स्टोर में स्थायी रूप से होने के बाद चलाने के बाद।
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
/**
* Add a certificate to the cacerts keystore if it's not already included
*/
public class SslUtil {
private static final String CACERTS_PATH = "/lib/security/cacerts";
// NOTE: DO NOT STORE PASSWORDS IN PLAIN TEXT CODE, LOAD AT RUNTIME FROM A SECURE CONFIG
// DEFAULT CACERTS PASSWORD IS PROVIDED HERE AS A QUICK, NOT-FOR-PRODUCTION WORKING EXAMPLE
// ALSO, CHANGE THE DEFAULT CACERTS PASSWORD, AS IT IMPLORES YOU TO!
private static final String CACERTS_PASSWORD = "changeit";
/**
* Add a certificate to the cacerts keystore if it's not already included
*
* @param alias The alias for the certificate, if added
* @param certInputStream The certificate input stream
* @throws KeyStoreException
* @throws NoSuchAlgorithmException
* @throws CertificateException
* @throws IOException
*/
public static void ensureSslCertIsInKeystore(String alias, InputStream certInputStream)
throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException{
//get default cacerts file
final File cacertsFile = new File(System.getProperty("java.home") + CACERTS_PATH);
if (!cacertsFile.exists()) {
throw new FileNotFoundException(cacertsFile.getAbsolutePath());
}
//load cacerts keystore
FileInputStream cacertsIs = new FileInputStream(cacertsFile);
final KeyStore cacerts = KeyStore.getInstance(KeyStore.getDefaultType());
cacerts.load(cacertsIs, CACERTS_PASSWORD.toCharArray());
cacertsIs.close();
//load certificate from input stream
final CertificateFactory cf = CertificateFactory.getInstance("X.509");
final Certificate cert = cf.generateCertificate(certInputStream);
certInputStream.close();
//check if cacerts contains the certificate
if (cacerts.getCertificateAlias(cert) == null) {
//cacerts doesn't contain the certificate, add it
cacerts.setCertificateEntry(alias, cert);
//write the updated cacerts keystore
FileOutputStream cacertsOs = new FileOutputStream(cacertsFile);
cacerts.store(cacertsOs, CACERTS_PASSWORD.toCharArray());
cacertsOs.close();
}
}
}
इतना है कि यह प्रयोग करें:
SslUtil.ensureSslCertIsInKeystore("startssl", new FileInputStream("/path/to/cert.crt"));
यदि यह कोई प्रमाण पत्र आयात किए बिना काम करता है, तो मुझे नहीं पता कि सुरक्षा कैसे सुनिश्चित की जाएगी/बढ़ाया जाएगा वेब साइट प्रमाण पत्र आयात करके। यदि कोई प्रमाण पत्र आयात किया जाना चाहिए तो यह StartSSL का मूल प्रमाणपत्र है, लेकिन आपका वेबसाइट प्रमाण पत्र नहीं, क्योंकि जावा स्टार्टएसएसएल को मान्य प्रमाणन प्राधिकरण के रूप में नहीं पहचान सका। –
@ जेबी ओह। ऐसा इसलिए था क्योंकि मेरे पिछले प्रश्न में चबर्ड ने कहा था कि मुझे यह सुनिश्चित करने के लिए अपने क्लाइंट में सर्वर के प्रमाणपत्र को प्रमाणित करना सुनिश्चित करना चाहिए कि मैं झूठी सेवा से बात कर रहा हूं और उसने कीटोल के बारे में कुछ बताया है। तो यदि आपकी कहानियां वेबसाइट प्रमाण पत्र आयात करने से सुरक्षा प्रभावित नहीं होती है, तो कोई भी SSL प्रमाणपत्र क्यों आयात करेगा? – Andy
यह जावा का एसएसएल स्टैक है जो वेब साइट सर्टिफिकेट को मान्य करेगा, जैसे ब्राउजर करता है। क्या आप उन सभी एसएसएल वेबसाइटों का प्रमाण पत्र आयात करते हैं जिन्हें आप उनसे मिलने से पहले देखते हैं? नहीं। ब्राउज़र उनके प्रमाण पत्र को मान्य करता है क्योंकि यह एक प्रसिद्ध प्रमाण पत्र प्राधिकरण द्वारा प्रमाणित है जिसे ब्राउज़र जानता है। StartSSL आपके मामले में प्रमाण पत्र प्राधिकरण है। जावा एक ही काम करता है। आपको StartSSL के प्रमाणपत्र को आयात करने की आवश्यकता हो सकती है, लेकिन वेबसाइट प्रमाण पत्र नहीं। –