2010-02-10 12 views
19

वर्तमान में, मैं म्यूचुअल प्रमाणीकरण सुरक्षा को कार्यान्वित करने में सफल रहा हूं जब तक कि ग्राहक वेब ब्राउज़र का उपयोग करके वेबसाइट तक पहुंचता है, क्योंकि ब्राउज़र आपके लिए सभी प्रमाणपत्र विनिमय का ख्याल रखता है। अब मुझे एक सुरक्षित इंटरफ़ेस बनाना होगा जिसके साथ उपयोगकर्ता सर्वर द्वारा आवश्यक पारस्परिक प्रमाणीकरण का उपयोग करके HTTPS पर वेब सेवाओं तक पहुंच सकते हैं।वेब सेवाओं के साथ म्यूचुअल-प्रमाणीकरण

सबसे पहले, क्या कोई संसाधन है जो किसी को जानता है जो इससे मेरी मदद कर सकता है? मैंने काफी समय देखा है और कुछ भी नहीं मिला है। कोई अन्य सुझाव मुझे इस बारे में कैसे जा सकता है इस बारे में बता सकता है?

दूसरा, मुझे लगता है कि मेरा सबसे बड़ा रोडब्लॉक प्रमाणपत्रों को संभालने के तरीके की समझ में कमी है। मैं सर्वर की कुंजी को स्वीकार करने और सर्वर पर अपनी कुंजी पेश करने की बातचीत कैसे करूं? यह जावा में है।

उत्तर

1

this blog entry में एक साधारण नुस्खा दिया जाता है।

लेकिन मुझे लगता है कि वास्तविक उत्तर आपके क्लाइंट-साइड HTTP इंटरैक्शन को लागू करने के लिए उपयोग कर रहे जावा एपीआई पर निर्भर हो सकता है। उदाहरण के लिए, ऐसा लगता है कि आप जेएक्स-आरपीसी का उपयोग कर a bit differently चीजें करेंगे।

6

यदि वेब सेवा लाइब्रेरी मानक क्लाइंट के रूप में मानक java.net.URL कक्षा का उपयोग करती है, तो आप कुछ system properties सेट कर सकते हैं और दो-तरफा प्रमाणीकरण अंतर्निहित HTTPS समर्थन द्वारा प्रबंधित किया जाएगा।

necessary properties हैं:

  • javax.net.ssl.trustStore: शामिल जड़ CA प्रमाणपत्र
  • javax.net.ssl.keyStore: ग्राहक प्रमाणपत्र और निजी कुंजी
  • javax.net.ssl.keyStorePassword शामिल है: पासवर्ड की रक्षा ग्राहक की निजी कुंजी

इन सेटिंग्स प्रक्रिया द्वारा सभी एसएसएल कनेक्शन के लिए डिफ़ॉल्ट बन जाते हैं। यदि आप बेहतर नियंत्रण चाहते हैं, तो आपको अपना खुद का SSLContext सेट अप करना होगा। चाहे आपके webservice रनटाइम के साथ यह संभव हो कि आप किस रनटाइम को चुनते हैं।

11

ब्राउज़र के बाहर एसएसएल (उर्फ दो तरह एसएसएल) के साथ आपसी प्रमाणीकरण के लिए, आप की आवश्यकता होगी ... ठीक है, वास्तव में, के लिए आपको सबसे पहले एक तरह से SSL के लिए क्या जरूरत है देखते हैं:

  1. एक सर्वर कुंजीस्टोर
  2. एक ग्राहक truststore

सर्वर कुंजीस्टोर सर्वर (संभवतः स्व-हस्ताक्षरित) प्रमाणपत्र और निजी कुंजी शामिल हैं। यह स्टोर सर्वर पर संदेशों पर हस्ताक्षर करने और ग्राहक को प्रमाण-पत्र वापस करने के लिए उपयोग की जाती है।

क्लाइंट ट्रस्टस्टोर में सर्वर का (स्वयं हस्ताक्षरित) प्रमाण पत्र होता है (सर्वर कीस्टोर से सर्वर स्टैंडस्टोन में निकाला जाता है, सर्वर निजी कुंजी के बिना)। यह आवश्यक है अगर प्रमाण पत्र किसी विश्वसनीय सीए द्वारा हस्ताक्षरित नहीं है जिसके लिए आपके पास पहले से ही ट्रस्टस्टोर में जेआरई के साथ बंडल किया गया है। यह कदम विश्वास की एक श्रृंखला बनाने की अनुमति देता है।

इसके साथ, आप एक तरफा एसएसएल (पारंपरिक उपयोग केस) लागू कर सकते हैं।

दो तरह एसएसएल लागू करने के लिए, तो आप इस सेटअप "सममित" बनाने की जरूरत है ताकि हम जोड़ने की आवश्यकता होगी:

  1. एक ग्राहक कुंजीस्टोर
  2. एक सर्वर truststore

क्लाइंट कीस्टोर में ग्राहक का (संभवतः स्वयं हस्ताक्षरित) प्रमाणपत्र और निजी कुंजी शामिल है। इस स्टोर का उपयोग क्लाइंट द्वारा सर्वर कीस्टोर की तुलना में उसी उद्देश्य के लिए किया जाता है, यानी टीएलएस पारस्परिक प्रमाणीकरण हैंडशेक के दौरान सर्वर को क्लाइंट प्रमाण-पत्र भेजने के लिए।

सर्वर ट्रस्टस्टोर में क्लाइंट (स्वयं हस्ताक्षरित) स्टैंडअलोन प्रमाण पत्र (क्लाइंट कीस्टोर से क्लाइंट कीस्टोर से निकाले गए हैं, क्लाइंट निजी कुंजी के बिना)। जैसा कि पहले उल्लेख किया गया है, वही कारणों के लिए यह आवश्यक है।

कुछ संसाधनों आप यह सब सामान उत्पन्न करने के लिए मदद करने के लिए और अंतिम समाधानों को लागू करने के लिए:

+3

यद्यपि आप बहुत अच्छी तरह से आपसी प्रमाणीकरण अवधारणा की व्याख्या की है, लिंक पर सब बहुत उपयोगी नहीं हैं। 2006 से जावा वेब सेवा सुरक्षा ने काफी बदलाव किया है! :) – Catchwa

14

मैं एक लंबे खर्च इस पर समय लेकिन मुझे अंततः एक उदाहरण मिला कि actu सहयोगी काम करता है। यह ग्लासफ़िश और नेटबीन्स आधारित है लेकिन मुझे लगता है कि आप इसे अन्य वातावरण (जैसे एक्लिप्स और टोमकैट) में काम कर सकते हैं यदि आप इसके साथ खेलते हैं।

http://java.sun.com/webservices/reference/tutorials/wsit/doc/WSIT_Security9.html#wp162511

समस्या मैं हालांकि पाया है तब होता है जब आप अपने प्रमाणपत्रों, नहीं जो कि glassfish साथ पहले से इंस्टॉल हो उपयोग करना चाहते हैं।

नोट: मैं सुरक्षा विशेषज्ञ नहीं हूं। इसे उत्पादन वातावरण में तैनात न करें!

ऐसा करने के लिए मैं NetBeans 6.9 उपयोग कर रहा हूँ, JDK 1.6, ग्लासफिश 3.0.1 और OpenSSL v1.0 (मैं अनौपचारिक Win32 बाइनरी उपयोग कर रहा हूँ)

# Create the CA 
mkdir ca server client 
cd ca 
openssl req -new -x509 -days 3650 -extensions v3_ca -keyout ca.key -out ca.pem 
echo 02 > serial.txt 
cd .. 

# Creating the Server Keystore 

openssl req -days 3650 -newkey rsa:1024 -keyout server/server.key -out server/server.req 
openssl x509 -extensions usr_cert -extfile C:\testbed\OpenSSL-Win32\bin\openssl.cfg -CA ca/ca.pem -CAkey ca/ca.key -CAserial ca/serial.txt -req -in server/server.req -out server/server.crt 
openssl pkcs12 -export -inkey server/server.key -in server/server.crt -out server/server.p12 -name server 
keytool -importkeystore -destkeystore server/server.jks -deststoretype jks -srckeystore server/server.p12 -srcstoretype pkcs12 
keytool -exportcert -alias server -keystore server/server.jks -file server/server.cer 

# Create the Client Keystore 

openssl req -days 3650 -newkey rsa:1024 -keyout client/client1.key -out client/client1.req 
openssl x509 -extensions usr_cert -extfile C:\testbed\OpenSSL-Win32\bin\openssl.cfg -CA ca/ca.pem -CAkey ca/ca.key -CAserial ca/serial.txt -req -in client/client1.req -out client/client1.crt 
openssl pkcs12 -export -inkey client/client1.key -in client/client1.crt -out client/client1.p12 -name client1 
keytool -importkeystore -destkeystore client/client1.jks -deststoretype jks -srckeystore client/client1.p12 -srcstoretype pkcs12 
keytool -exportcert -alias client1 -keystore client/client1.jks -file client/client1.cer 

# Import public keys and certificates into each others keystores 

keytool -import -noprompt -trustcacerts -alias client1 -file client/client1.cer -keystore server/server.jks 
keytool -import -noprompt -trustcacerts -alias server -file server/server.cer -keystore client/client1.jks 
keytool -import -noprompt -trustcacerts -alias my_ca -file ca/ca.pem -keystore server/server.jks 
keytool -import -noprompt -trustcacerts -alias my_ca -file ca/ca.pem -keystore client/client1.jks 
keytool -import -noprompt -trustcacerts -alias my_ca -file ca/ca.pem -keystore "C:\Program Files\glassfish-3.0.1\glassfish\domains\domain1\config\cacerts.jks" 
keytool -import -noprompt -trustcacerts -alias my_ca -file ca/ca.pem -keystore "C:\Program Files\Java\jdk1.6\jre\lib\security\cacerts" 
move "C:\Program Files\glassfish-3.0.1\glassfish\domains\domain1\config\keystore.jks" "C:\Program Files\glassfish-3.0.1\glassfish\domains\domain1\config\keystore.jks.backup" 
copy server\server.jks "C:\Program Files\glassfish-3.0.1\glassfish\domains\domain1\config\keystore.jks" 

ग्लासफिश व्यवस्थापक कंसोल में, अपने http-listener पर सुरक्षा सक्षम करें, SSL3, TLS और क्लाइंट प्रमाणीकरण बॉक्स पर निशान लगाएं, प्रमाणपत्र निकनाम को सर्वर पर सेट करें, कॉन्फ़िगर \ keystore.jks पर कुंजी स्टोर, कॉन्फ़िगर \ keystore.jks पर ट्रस्ट स्टोर, PKIX के लिए ट्रस्ट एल्गोरिदम और अधिकतम प्रमाणपत्र लंबाई 5 पर छोड़ दें।

नेटबीन में, एक नई वेब एप्लिकेशन प्रोजेक्ट बनाएं। उसमें, एक नई वेब सेवा बनाएं।

मेरे वेब सेवा कोड इस तरह देखा:

@WebService() 
public class ListProducts { 

    @Resource WebServiceContext context; 

    @WebMethod(operationName = "listProducts") 
    public String listProducts() { 
    return context.getUserPrincipal().toString(); 
    } 

} 

सही वेब सेवा पर क्लिक करें और संपादित करें वेब सेवा गुण। सुरक्षित सेवा बॉक्स पर निशान लगाएं और सुरक्षा तंत्र के रूप में म्यूचुअल सर्टिफिकेट सुरक्षा का चयन करें। कॉन्फ़िगर करें ... बटन पर क्लिक करें और एन्क्रिप्ट हस्ताक्षर बॉक्स पर निशान लगाएं। अब उपयोग विकास डिफ़ॉल्ट बॉक्स को अनचेक करें और फिर कीस्टोर बटन पर क्लिक करें। अपने server.jks कीस्टोर का स्थान सेट करें और server उपनाम का चयन करें।ट्रस्टस्टोर कॉन्फ़िगरेशन के लिए ऐसा ही करें (हालांकि आपको यहां उपनाम का चयन करने की आवश्यकता नहीं है)।

अपने ब्राउज़र में client1.p12 क्लाइंट प्रमाणपत्र आयात करें। ग्लासफ़िश पर अपनी वेब सेवा तैनात करें। ब्राउज़र में अपनी वेब सेवा खोलें और एचटीटीपीएस के माध्यम से तैनात डब्लूएसडीएल पर ब्राउज़ करें। डब्ल्यूएसडीएल और किसी भी अन्य स्कीमा डाउनलोड करें। स्थानीय प्रतियों में किसी भी संदर्भित स्कीमा का नाम बदलें ताकि जब आप WSDL2Java NetBeans का उपयोग किसी भी दूरस्थ संसाधन का उपयोग नहीं करेंगे। (यह पैराग्राफ इसलिए है क्योंकि आपने अपने डब्लूएसडीएल को ग्राहकों को अनुमोदित प्रमाण पत्र के साथ प्रतिबंधित कर दिया है, लेकिन नेटबीन इसे दूरस्थ रूप से नहीं ला सकता है क्योंकि उसके पास प्रश्न में प्रमाण पत्र तक पहुंच नहीं है)।

एक नया जावा प्रोजेक्ट बनाएं। एक नया वेब सेवा क्लाइंट बनाएं। संकेत मिलने पर, नेटबीन को अपनी सहेजी गई WSDL फ़ाइल पर इंगित करें। METRO2.0 लाइब्रेरी फ़ाइलों को आयात करें (C:\Program Files\Netbeans 6.9\enterprise\modules\ext\metr\webservices-*.jar)। अपने जावा \ jdk1.6 \ JRE \ lib \ समर्थन निर्देशिका में

public static void main(String[] args) { 
    System.getProperties().put("javax.net.ssl.keyStore", "C:\\NetBeansProjects\\security-04\\ssl\\client\\client1.jks"); 
    System.getProperties().put("javax.net.ssl.keyStorePassword", "changeit"); 
    System.getProperties().put("javax.net.ssl.trustStore", "C:\\NetBeansProjects\\security-04\\ssl\\client\\client1.jks"); 
    System.getProperties().put("javax.net.ssl.trustStorePassword", "changeit"); 
    System.out.println(new ListProductsService().getListProductsPort().listProducts()); 
} 

कॉपी webservices-api.jar: मेरे कोड इस तरह देखा। वेब सेवा संदर्भ पर राइट-क्लिक करें और वेब सेवा विशेषताएँ संपादित करें का चयन करें। Keystore स्थान को client1.jks पर सेट करें और उपनाम को client1 पर सेट करें। ट्रस्टस्टोर स्थान को client1.jks पर सेट करें और उपनाम को server पर सेट करें।

उम्मीद है कि आप अब अपने ग्राहक को चला सकते हैं और यदि आप ऐसा तरह उत्पादन देखना चाहिए: [email protected], CN=Bob Smith, OU=Something, O=SomethingElse, L=AnyTown, ST=AnyState, C=US

संबंधित मुद्दे