जावा कीस्टोर में .cer सर्टिफिकेट कैसे आयात करें?


226

एक जावा वेबसर्विस क्लाइंट के विकास के दौरान मैं एक समस्या में भाग गया। वेबसेवा के लिए प्रमाणीकरण क्लाइंट प्रमाणपत्र, उपयोगकर्ता नाम और पासवर्ड का उपयोग कर रहा है। ग्राहक प्रमाणपत्र जो कंपनी से प्राप्त किया गया है, वह वेबस् सेवा के पीछे .cerप्रारूप में है। जब मैं किसी पाठ संपादक का उपयोग करके फ़ाइल का निरीक्षण करता हूं, तो उसमें निम्नलिखित सामग्री होती है:

-----BEGIN CERTIFICATE-----
[Some base64 encoded data]
-----END CERTIFICATE-----

मैं इस फाइल को इंटरनेट एक्सप्लोरर में एक प्रमाण पत्र के रूप में आयात कर सकता हूं (पासवर्ड दर्ज किए बिना!) और इसे वेब सेवा के साथ प्रमाणित करने के लिए उपयोग करता हूं।

मैं इस प्रमाणपत्र को पहली और अंतिम पंक्ति को हटाकर, एक नई सूची में परिवर्तित करने और एक बेस 64-डिकोड चलाकर एक कीस्टोर में आयात करने में सक्षम था। परिणामी फ़ाइल को कीस्टोर ( keytoolकमांड का उपयोग करके ) में आयात किया जा सकता है । जब मैं कीस्टोर में प्रविष्टियों को सूचीबद्ध करता हूं, तो यह प्रविष्टि प्रकार की होती है trustedCertEntry। इस प्रविष्टि प्रकार (?) की वजह से मैं इस प्रमाणपत्र का उपयोग वेबसेवा के साथ प्रमाणित करने के लिए नहीं कर सकता। मुझे लगता है कि प्रदान किया गया प्रमाण पत्र एक सार्वजनिक प्रमाण पत्र है जो प्रमाणीकरण के लिए उपयोग किया जा रहा है ...

एक वर्कअराउंड मैंने पाया है कि IE में प्रमाण पत्र आयात करना है और इसे एक .pfxफ़ाइल के रूप में निर्यात करना है । इस फाइल को एक कीस्टोर के रूप में लोड किया जा सकता है और इसे वेबसर्विस के साथ प्रमाणित करने के लिए इस्तेमाल किया जा सकता है। हालाँकि मैं अपने ग्राहकों से हर बार जब वे एक नया प्रमाणपत्र प्राप्त करते हैं, तो इन चरणों को करने की उम्मीद नहीं कर सकते। इसलिए मैं .cerफ़ाइल को सीधे जावा में लोड करना चाहूंगा । कोई विचार?

अतिरिक्त जानकारी: webservice के पीछे की कंपनी ने मुझे बताया कि पीसी और उपयोगकर्ता से प्रमाणपत्र का अनुरोध किया जाना चाहिए (IE और वेबसाइट का उपयोग करके) जो बाद में प्रमाण पत्र का आयात करेगा।

जवाबों:


317
  • यदि आप प्रमाणित करना चाहते हैं कि आपको निजी कुंजी की आवश्यकता है - कोई अन्य विकल्प नहीं है।
  • एक प्रमाण पत्र अतिरिक्त संपत्तियों (जैसे कंपनी का नाम, देश, ...) के साथ सार्वजनिक कुंजी है जो कुछ प्रमाणपत्र प्राधिकरण द्वारा हस्ताक्षरित है जो गारंटी देता है कि संलग्न गुण सत्य हैं।
  • .CERफ़ाइलें प्रमाण पत्र हैं और निजी कुंजी नहीं है। निजी कुंजी .PFX keystoreसामान्य रूप से फ़ाइल के साथ प्रदान की जाती है । यदि आप वास्तव में प्रमाणित करते हैं क्योंकि आपने पहले ही निजी कुंजी आयात कर ली है।
  • आप आम तौर पर .CERबिना किसी समस्या के प्रमाण पत्र आयात कर सकते हैं

    keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 

3
IE के लिए एक प्लगइन द्वारा निजी कुंजी को चालू किया जाता है। अब के लिए केवल समाधान IE में प्रमाण पत्र आयात करना और एक .pfx फ़ाइल निर्यात करना है।
Jan-Pieter

5
.CER फ़ाइलों में सार्वजनिक कुंजी होती है। उनके पास निजी कुंजी नहीं है। संपादन का सुझाव दें ..
केलीएम

6
यलिया यहाँ क्या करती है?
हॉप

5
:( -> कीटूल एरर: java.lang.Exception: इनपुट नहीं X.509 सर्टिफिकेट
necromancer

1
@ एक जावा कीस्टोर के पास अलग-अलग उपनाम के साथ प्रत्येक को पहचानने के लिए कई प्रमाणपत्र हो सकते हैं। आप इसे संदर्भ के रूप में उपयोग कर सकते हैं और / या अन्य रूप से उपनाम द्वारा इसे पुनः प्राप्त कर सकते हैं।
लूजोप

85

आयात कर रहा है .cerमें प्रमाणपत्र फ़ाइल ब्राउज़र से डाउनलोड (विवरण के लिए यूआरएल और खुदाई खोलने) cacerts में KeyStore java_home\jre\lib\security, मेरे लिए काम किया के रूप में करने का विरोध किया attemps पैदा करते हैं और अपने ही कीस्ट्रोक उपयोग करने के लिए।

  1. अपने पर जाओ java_home\jre\lib\security
  2. ( विंडोज ) का उपयोग कर cmdऔर CTRL+ SHIFT+ वहाँ व्यवस्थापक कमांड लाइन खोलेंENTER
  3. प्रमाणपत्र आयात करने के लिए की-टूल चलाएँ:
    • ( क्रमशः yourAliasNameऔर path\to\certificate.cerक्रमशः)

 ..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer

इस तरह आपको कोई अतिरिक्त JVM विकल्प निर्दिष्ट करने की आवश्यकता नहीं है और प्रमाणपत्र को JRE द्वारा मान्यता दी जानी चाहिए।


पथ \ के लिए \ प्रमाणपत्र। अगर मेरी फाइल डेस्कटॉप पर है तो मैं इसे कैसे पा सकता हूं? सी: / उपयोगकर्ता / डेस्कटॉप / या ../../../..desktop/filename
जेसी

MacOS / Linux पर यह कमांड sudo के साथ काम करता है। धन्यवाद। लेकिन क्या नैरोप्रोम परम है? मैंने इसका उपयोग नहीं किया और फिर भी सफल रहा।
एवगेनी मिशुस्टिन

ध्यान दें कि विकसित करने के लिए JDK का उपयोग करते समय, सही रास्ता java_home\jdk_x.xx\jre\lib\security एक निरपेक्ष पथ उपयोग बैकस्लैश के लिए है, उदाहरण के लिए "C:\myCert.crt"उद्धरण चिह्न वैकल्पिक हैं यदि पथ में व्हाट्सएप नहीं है।
jp-jee

एक लाख बार धन्यवाद।
12:30 पर vikingsteve

प्रश्न: निजी कुंजी के बारे में क्या? चर्चा ग्राहक प्रमाणपत्रों के बारे में है। मेरी समझ यह है कि एक व्यक्ति को एक निजी कुंजी के साथ एक सीएसआर बनाने की आवश्यकता होती है, फिर दूरस्थ वेबसाइट कंपनी से ग्राहक प्रमाणपत्र प्राप्त करें और फिर ग्राहक कुंजी को निजी कुंजी से मिलाएं। आपके उत्तर में निजी कुंजी के बारे में कुछ भी उल्लेख नहीं है। सिर्फ पूछ रहे।
user2367418

51

यहाँ वह कोड है जो मैं प्रोग्रामर .cer फ़ाइलों के लिए एक नया KeyStore में उपयोग कर रहा हूँ।

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
//VERY IMPORTANT.  SOME OF THESE EXIST IN MORE THAN ONE PACKAGE!
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

//Put everything after here in your function.
KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);//Make an empty store
InputStream fis = /* insert your file path here */;
BufferedInputStream bis = new BufferedInputStream(fis);

CertificateFactory cf = CertificateFactory.getInstance("X.509");

while (bis.available() > 0) {
    Certificate cert = cf.generateCertificate(bis);
    trustStore.setCertificateEntry("fiddler"+bis.available(), cert);
}

20

आपको प्रमाणपत्र में कोई बदलाव नहीं करना चाहिए। क्या आप सुनिश्चित हैं कि आप सही आयात आदेश चला रहे हैं?

निम्नलिखित मेरे लिए काम करता है:

keytool -import -alias joe -file mycert.cer -keystore mycerts -storepass changeit

जहाँ mycert.cer शामिल है:

-----BEGIN CERTIFICATE-----
MIIFUTCCBDmgAwIBAgIHK4FgDiVqczANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
...
RLJKd+SjxhLMD2pznKxC/Ztkkcoxaw9u0zVPOPrUtsE/X68Vmv6AEHJ+lWnUaWlf
zLpfMEvelFPYH4NT9mV5wuQ1Pgurf/ydBhPizc0uOCvd6UddJS5rPfVWnuFkgQOk
WmD+yvuojwsL38LPbtrC8SZgPKT3grnLwKu18nm3UN2isuciKPF2spNEFnmCUWDc
MMicbud3twMSO6Zbm3lx6CToNFzP
-----END CERTIFICATE-----

2
जब मैं किमस्टोर में अनमॉडिफाइड सर्टिफिकेट इम्पोर्ट करने की कोशिश करता हूं, तो मुझे त्रुटि मिलती है "कीटूल एरर: java.lang.Exception: इनपुट नॉट ए एक्स 509 सर्टिफिकेट"। मेरे पोस्ट में वर्णित तरीके से प्रमाण पत्र को संशोधित करने के बाद, मैं आपके समान कमांड के साथ त्रुटियों के बिना प्रमाण पत्र आयात करने में सक्षम हूं। हालाँकि यह एक भरोसेमंद के रूप में आयात किया जाता है और webservice तक पहुँचने पर इसका उपयोग नहीं किया जाता है।
Jan-Pieter 15:

क्या आप कृपया आदेश को प्रश्न के अपवाद में जोड़ सकते हैं? क्या आप वाकई अपने आयात कमांड में एक उपनाम निर्दिष्ट कर रहे हैं?
डॉगबैन

यदि आप विंडोज का उपयोग कर रहे हैं तो cmd चलाना न भूलें
1919 को साइलेंटबेक 470

9

एक खुला स्रोत जीयूआई उपकरण keystore-explorer.org पर उपलब्ध है

KeyStore एक्सप्लोरर

KeyStore एक्सप्लोरर जावा कमांड-लाइन यूटिलिटीज keytool और jarsigner के लिए एक ओपन सोर्स GUI रिप्लेसमेंट है। KeyStore एक्सप्लोरर एक सहज ज्ञान युक्त ग्राफिकल यूजर इंटरफेस के माध्यम से, उनकी कार्यक्षमता और अधिक प्रस्तुत करता है।

निम्नलिखित स्क्रीन मदद करेंगे (वे आधिकारिक साइट से हैं)

डिफ़ॉल्ट स्क्रीन जो आपको कमांड चलाने से मिलती है:

shantha@shantha:~$./Downloads/kse-521/kse.sh

यहां छवि विवरण दर्ज करें

और करने के लिए जाना Examineऔर Examine a URLविकल्प और उसके बाद वेब URL को आप आयात करना चाहते हैं।

यदि आप google साइट लिंक देते हैं तो परिणाम विंडो नीचे की तरह होगी। यहां छवि विवरण दर्ज करें

यह उपयोग के मामले में से एक है और बाकी उपयोगकर्ता के लिए है (सभी क्रेडिट keystore-explorer.org पर जाते हैं )


7

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

लेकिन अगर इसके अतिरिक्त आपको SSL के साथ क्लाइंट प्रमाणीकरण करने की आवश्यकता है, तो आपको अपने वेब सेवा क्लाइंट को प्रमाणित करने के लिए अपना स्वयं का प्रमाण पत्र प्राप्त करने की आवश्यकता है। इसके लिए आपको प्रमाणपत्र अनुरोध बनाने की आवश्यकता है; इस प्रक्रिया में आपकी निजी कुंजी और संबंधित सार्वजनिक कुंजी बनाना शामिल है, और उस सार्वजनिक कुंजी को आपकी कुछ जानकारी (ईमेल, नाम, डोमेन नाम, आदि) के साथ संलग्न करना है, जिसे एक प्रमाण पत्र अनुरोध कहा जाता है। फिर आप उस सर्टिफिकेट रिक्वेस्ट को उस कंपनी को भेजते हैं जो आपसे पहले ही इसके लिए पूछ चुकी है, और वे आपकी निजी कुंजी के साथ आपकी सार्वजनिक कुंजी पर हस्ताक्षर करके आपका सर्टिफिकेट बनाएंगे, और वे आपको अपने सर्टिफिकेट के साथ एक X509 फाइल वापस भेज देंगे, जिसे आप कर सकते हैं अब अपने keystore में जोड़ें, और आप ग्राहक प्रमाणीकरण की आवश्यकता वाले SSL का उपयोग करके एक वेब सेवा से जुड़ने के लिए तैयार होंगे।

अपने प्रमाणपत्र अनुरोध को उत्पन्न करने के लिए, "keytool -certreq -alias -file -keypass -keystore" का उपयोग करें। परिणामी फ़ाइल को उस कंपनी को भेजें जो उस पर हस्ताक्षर करने जा रही है।

जब आप अपना प्रमाणपत्र वापस ले लेते हैं, तो "keytool -importcert -alias -keypass -keystore" चलाएं।

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


5

यहाँ एक स्क्रिप्ट है जिसका उपयोग मैंने वर्तमान निर्देशिका में crt फ़ाइलों के एक समूह को java keystore में बैचने के लिए किया है। बस इसे अपने प्रमाणपत्र के समान फ़ोल्डर में सहेजें, और इसे इस तरह से चलाएं:

./import_all_certs.sh

import_all_certs.sh

KEYSTORE="$(/usr/libexec/java_home)/jre/lib/security/cacerts";

function running_as_root()
{
  if [ "$EUID" -ne 0 ]
    then echo "NO"
    exit
  fi

  echo "YES"
}

function import_certs_to_java_keystore
{
  for crt in *.crt; do 
    echo prepping $crt 
    keytool -import -file $crt -storepass changeit -noprompt --alias alias__${crt} -keystore $KEYSTORE
    echo 
  done
}

if [ "$(running_as_root)" == "YES" ]
then
  import_certs_to_java_keystore
else
  echo "This script needs to be run as root!"
fi

1

यहां बताया गया है कि यह मेरे लिए कैसे काम करता है:

  1. एक पाठ संपादक में निम्न प्रारूप में प्रमाण पत्र डेटा .txt के रूप में सहेजें

    ----- BEGIN CERTIFICATE ----- [Microsoft द्वारा क्रमबद्ध डेटा] ----- END प्रमाण पत्र -----

  2. ओपन क्रोम ब्राउज़र (यह कदम अन्य ब्राउज़रों के साथ भी काम कर सकता है) सेटिंग्स> उन्नत सेटिंग्स दिखाएं> HTTPS / SSL> प्रमाणपत्र प्रबंधित करें चरण में .txt आयात करें।
  3. आधार -64 एन्कोडेड प्रारूप में उस प्रमाणपत्र का चयन करें और निर्यात करें। इसे .cer के रूप में सहेजें
  4. अब आप इसे अपने जावा कीस्टोर में आयात करने के लिए कीटल या पोर्टेकल का उपयोग कर सकते हैं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.