2014-10-29 12 views
11

मैंने स्प्रिंग नियंत्रक लिखा है। यह ग्राहकों से अनुरोध प्राप्त करता है। यह सिर्फ REST शैली है।वसंत आरईएसटी सेवा प्रमाणपत्र लेखक

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

मैं इस सुरक्षा को वसंत में कैसे कॉन्फ़िगर कर सकता हूं? क्या आप मुझे एक उदाहरण या लिंक दे सकते हैं जहां यह लिखा गया है?

धन्यवाद

उत्तर

15

आप के लिए Mutual Authentication कहा जाता है क्या देख रहे हैं।

क्लाइंट को प्रमाण पत्र भेजने/अनुरोध करने के लिए सर्वर की ज़िम्मेदारी है। प्रत्येक सर्वर यह अलग-अलग करता है और आपको अपने विशेष सर्वर को कॉन्फ़िगर करने के तरीके को देखना होगा।

वसंत सुरक्षा के लिए, मैं X.509 Authentication में देखने की अनुशंसा करता हूं। इस प्रकार का प्रमाणीकरण उपयोग करने के लिए काफी आसान है और आवश्यकतानुसार विस्तारित है।

संपादित

तो, यहां संदर्भ के उदाहरणों से पता चलता है कि तुम क्या कह रहे हैं के एक जोड़े हैं:

http://whiteycode.blogspot.com/2012/04/part-3-x509-authentication-with-spring.html

पीडीएफ चेतावनी

http://www.promixis.com/pdfs/SpringSecurityAndX509ClientCertificates.pdf

टी उनका उदाहरण वास्तव में आपके प्रमाणपत्रों को सेटअप करने और अपनी व्यक्तिगत सीए (प्रमाणपत्र प्राधिकरण) बनाने के तरीके के बारे में अच्छा है। चेतावनी, जिस तरह से वे क्लाइंट सर्टिफिकेट बनाने का तरीका दिखाते हैं, वैसे ही नहीं। आपके क्लाइंट (आईई वेब ब्राउज़र या जावा httpclient क्लाइंट) को निर्धारित करना चाहिए कि आपका क्लाइंट प्रमाणपत्र कैसे बनाएं। जावा पाठ्यक्रम की जावा कीस्टोर का उपयोग करना पसंद करता है और ब्राउज़र सर्टिफिकेट की पी 12 शैली पसंद करते हैं।

अंतिम सलाह/चेतावनी ... मुझे प्रमाण पत्र के साथ आपके ज्ञान का स्तर नहीं पता है, लेकिन ... म्यूचुअल प्रमाणीकरण इस बारे में है कि किस पर भरोसा है। यह कहने की जिम्मेदारी है, मुझे आपको प्रमाण पत्र के साथ प्रमाणित करने की आवश्यकता है और यहां मेरा प्रमाण पत्र प्रदाताओं की एक सूची है। तब ग्राहक उन जिम्मेदार प्रमाणपत्र प्रदाताओं में से किसी एक द्वारा हस्ताक्षरित प्रमाणपत्र के साथ जवाब देने की ज़िम्मेदारी है। यह तब आवेदन करने की ज़िम्मेदारी है, क्या मैं प्रमाण पत्र के अंदर उनके नाम के आधार पर इस व्यक्ति पर भरोसा करता हूं? अगर और जब चीजें गलत हो जाती हैं तो सोचें कि कौन है और कौन पर भरोसा नहीं कर रहा है।

एक शानदार टूल आपके आवेदन पर -Djavax.net.debug = ssl का उपयोग कर रहा है। यह पूरे एसएसएल हैंडशेक दिखाएगा और क्या अनुरोध किया जा रहा है और विशिष्ट प्रतिक्रिया क्या हैं। वह विकल्प थोड़ा वर्बोज़ है, लेकिन जब आवश्यक हो तो यह अच्छा होता है।

संपादित एक्स 2

यहाँ कैसे बिलाव 7 पर आपसी प्रमाणीकरण सक्षम करने के लिए

अपने सर्वर में है।एक्सएमएल कॉन्फ़िगरेशन फ़ाइल आपको एसएसएल कनेक्टर के लिए निम्न के करीब देखना चाहिए:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" 
      maxThreads="150" SSLEnabled="true" scheme="https" secure="true" 
      clientAuth="want" sslProtocol="TLS" 
      keystoreFile="C:\Java\Certs\localhost.jks" 
      keystorePass="changeit" 
      URIEncoding="UTF-8" /> 

क्लाइंटऑथ मान नोट करने का महत्वपूर्ण मूल्य है।

ग्राहक को 'इच्छित' पर सेट करना क्लाइंट को प्रमाणित क्लाइंट एसएसएल प्रमाण पत्र भेजने के लिए कहता है जो सर्वर पर भरोसा करता है, तो सर्वर पर भरोसा है। यदि नहीं, तो आगे बढ़ें और अपना अनुरोध सामान्य के रूप में करें।

क्लाइंट को 'सत्य' पर सेट करना क्लाइंट को बताता है कि उन्हें सर्वर पर विश्वास करने वाले प्रमाणपत्रों की सूची से एक हस्ताक्षरित क्लाइंट एसएसएल प्रमाण पत्र भेजना है। अगर आपके पास सर्वर पर भरोसा प्रमाणपत्रों की एक सूची द्वारा हस्ताक्षरित प्रमाण पत्र नहीं है, तो ग्राहक को अनुरोध करने की अनुमति नहीं है।

सर्वर पर भरोसा करने वाले प्रमाणपत्रों की सूची डिफ़ॉल्ट जावा ट्रस्टस्टोर से आती है या -Djavax.net.ssl.trustStore="C:\Java\Certs\jssecacerts1" VM विकल्प का उपयोग करके सेट की जा सकती है।

आम तौर पर, जब आप एक विशिष्ट सीए प्रमाणपत्र प्राप्त करते हैं जो कि आप विश्वास करते हैं कि डिफ़ॉल्ट जावा ट्रस्टस्टोर में नहीं है, तो डिफ़ॉल्ट ट्रस्टस्टोर की प्रतिलिपि बनाई जाती है, नया सीए प्रमाण पत्र प्रतिलिपि ट्रस्टस्टोर में आयात किया जाता है और फिर उपरोक्त वीएम विकल्प के साथ उपयोग किया जाता है।

चेतावनी

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

+0

हां, मैं X.50 9 प्रमाणीकरण का उदाहरण चाहता हूं, स्प्रिंग नियंत्रक (जो आरईएसटी स्टाइल अनुरोध प्राप्त करता है)। क्या आप मुझे एक और संदर्भ दे सकते हैं, जहां सबकुछ बाहर बढ़ाया जाएगा? – grep

+0

वाह, यह एक लंबा आदेश है। मैं चारों ओर गुजरता हूं और देखता हूं कि ऐसा कुछ है या नहीं। – hooknc

+0

जैसा कि आप मुझे बताते हैं "यह सर्वर जिम्मेदारी है"। यदि यह सर्वर पक्ष में किया जाता है (उदाहरण के लिए हम इसे टोमकैट में कर सकते हैं), वसंत सुरक्षा में X.50 9 प्रमाणीकरण क्यों है? – grep

0

मैं सब कुछ सेटअप करने के लिए एक REST एंडपॉइंट कि क्लाइंट प्रमाणपत्र द्वारा सुरक्षित है के साथ एक स्प्रिंग बूट एप्लिकेशन की जरूरत के साथ एक 100% सुबोध उदाहरण प्रोजेक्ट बनाया https://github.com/jonashackt/spring-boot-rest-clientcertificate

यह भी सभी चरणों .key, .crt और .jks फ़ाइलें उत्पन्न करने के लिए आवश्यक होता है: सुरक्षित सर्वर के साथ। यदि आप एक स्व-हस्ताक्षरित प्रमाणपत्र का उपयोग नहीं करना चाहते हैं तो बस तदनुसार चरणों को समायोजित करें।

RestTemplate इस तरह कॉन्फ़िगर किया गया है:

package de.jonashackt.restexamples; 

import org.apache.http.client.HttpClient; 
import org.apache.http.impl.client.HttpClients; 
import org.apache.http.ssl.SSLContextBuilder; 
import org.springframework.boot.web.client.RestTemplateBuilder; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; 
import org.springframework.util.ResourceUtils; 
import org.springframework.web.client.RestTemplate; 

import javax.net.ssl.SSLContext; 

@Configuration 
public class RestClientCertTestConfiguration { 

    private String allPassword = "allpassword"; 

    @Bean 
    public RestTemplate restTemplate(RestTemplateBuilder builder) throws Exception { 

     SSLContext sslContext = SSLContextBuilder 
       .create() 
       .loadKeyMaterial(ResourceUtils.getFile("classpath:keystore.jks"), allPassword.toCharArray(), allPassword.toCharArray()) 
       .loadTrustMaterial(ResourceUtils.getFile("classpath:truststore.jks"), allPassword.toCharArray()) 
       .build(); 

     HttpClient client = HttpClients.custom() 
       .setSSLContext(sslContext) 
       .build(); 

     return builder 
       .requestFactory(new HttpComponentsClientHttpRequestFactory(client)) 
       .build(); 
    } 
} 

तो फिर तुम यह सिर्फ अपने Test.class अंदर @Autowired टिप्पणी के साथ करने के लिए इस्तेमाल you're की तरह उपयोग कर सकते हैं।

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