के लिए मेरे पास एकाधिक SSL प्रमाणपत्र कैसे हो सकते हैं मेरे पास जावा में एक इन-हाउस HTTP सर्वर लिखा गया है; मेरे निपटारे पर पूर्ण स्रोत कोड। HTTP सर्वर वेब साइटों के किसी भी संख्या, जिनमें से प्रत्येक के साथ बनाई गई एक अलग सुनने सॉकेट होगा कॉन्फ़िगर कर सकते हैं: जावा Keytool के साथ बनाई गई एक मानक कुंजी संग्रह का उपयोगजावा सर्वर
skt=SSLServerSocketFactory.getDefault().createServerSocket(prt,bcklog,adr);
, मैं के लिए मुझे के जीवन से बाहर काम नहीं कर सकता अलग-अलग सुनो सॉकेट से जुड़े विभिन्न प्रमाणपत्र कैसे प्राप्त करें ताकि प्रत्येक कॉन्फ़िगर की गई वेब साइट का अपना प्रमाणपत्र हो।
मैं अब इस समय चुटकी में हूं, इसलिए कुछ कोड नमूने जो सबसे अधिक सराहना करेंगे। लेकिन इस संबंध में जेएसएसई एक साथ कैसे लटकता है, इस बारे में किसी भी अच्छे अवलोकन की सराहना करता हूं (मैंने सूर्य के जेएसएसई डॉको को तब तक खोजा है जब तक कि मेरा दिमाग दर्द न हो (शाब्दिक रूप से; हालांकि यह कैफीन निकासी हो सकती है))।
संपादित
वहाँ सुनने सॉकेट के साथ एक कुंजी संग्रह में सर्वर प्रमाणपत्र संबद्ध करने के लिए अन्य नाम का उपयोग करने के लिए कोई आसान तरीका है? ताकि:
- ग्राहक सभी प्रमाणपत्र के लिए प्रबंधन करने के लिए एक कुंजी संग्रह, और
- कई प्रमुख दुकानों के साथ बेला के आसपास कोई जरूरत नहीं है, आदि
मैं छाप हो रही थी है (इस दोपहर के पहले) कि मैं एक साधारण कीमैनगर लिख सकता हूं, केवल chooseServerAlias(...)
गैर-शून्य लौट रहा है, जो कि उपनाम के नाम का नाम है - किसी के पास तर्क की उस पंक्ति पर कोई विचार है?
समाधान
समाधान मैं इस्तेमाल किया, slyvarking के जवाब से बनाया गया एक अस्थायी कुंजी संग्रह बना सकते हैं और इच्छित कुंजी/प्रमाणपत्र विलक्षण बाहरी कुंजी संग्रह से निकाले से पॉप्युलेट करने के लिए किया गया था। कोड जो किसी भी रुचि रखते हैं के लिए इस प्रकार है (svrctfals मेरी "सर्वर प्रमाणपत्र उर्फ" मान है):
SSLServerSocketFactory ssf; // server socket factory
SSLServerSocket skt; // server socket
// LOAD EXTERNAL KEY STORE
KeyStore mstkst;
try {
String kstfil=GlobalSettings.getString("javax.net.ssl.keyStore" ,System.getProperty("javax.net.ssl.keyStore" ,""));
String ksttyp=GlobalSettings.getString("javax.net.ssl.keyStoreType" ,System.getProperty("javax.net.ssl.keyStoreType" ,"jks"));
char[] kstpwd=GlobalSettings.getString("javax.net.ssl.keyStorePassword",System.getProperty("javax.net.ssl.keyStorePassword","")).toCharArray();
mstkst=KeyStore.getInstance(ksttyp);
mstkst.load(new FileInputStream(kstfil),kstpwd);
}
catch(java.security.GeneralSecurityException thr) {
throw new IOException("Cannot load keystore ("+thr+")");
}
// CREATE EPHEMERAL KEYSTORE FOR THIS SOCKET USING DESIRED CERTIFICATE
try {
SSLContext ctx=SSLContext.getInstance("TLS");
KeyManagerFactory kmf=KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
KeyStore sktkst;
char[] blkpwd=new char[0];
sktkst=KeyStore.getInstance("jks");
sktkst.load(null,blkpwd);
sktkst.setKeyEntry(svrctfals,mstkst.getKey(svrctfals,blkpwd),blkpwd,mstkst.getCertificateChain(svrctfals));
kmf.init(sktkst,blkpwd);
ctx.init(kmf.getKeyManagers(),null,null);
ssf=ctx.getServerSocketFactory();
}
catch(java.security.GeneralSecurityException thr) {
throw new IOException("Cannot create secure socket ("+thr+")");
}
// CREATE AND INITIALIZE SERVER SOCKET
skt=(SSLServerSocket)ssf.createServerSocket(prt,bcklog,adr);
...
return skt;
आप अपनी खुद की KeyManager बहुत आसानी से लागू कर सकते हैं, लेकिन "मास्टर" कुंजी संग्रह में एक उपनाम का उपयोग कर स्मृति में एक नया, अस्थायी KeyStore के निर्माण के अपने विचार एक अच्छा एक है। – erickson