2012-07-23 7 views
97

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

अब तक, मैं

keytool -import -trustcacerts -noprompt -storepass changeit -alias $REMHOST -file $REMHOST.pem 
keytool -import -trustcacerts -noprompt -keystore cacerts -storepass changeit -alias $REMHOST -file $REMHOST.pem 

फिर भी में आयात करने में कामयाब रहे, जब मैं HTTPSClient.class चलाने का प्रयास मैं अभी भी मिलती है:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
+0

मैं जरूरी नहीं कि उस कोड पर भरोसा करे। 'Security.addProvider' जैसी चीजें (new com.sun.net.ssl.internal.ssl.Provider()) 'पहले भाग में पूरी तरह से अनावश्यक हैं। दूसरा कोई प्रमाण सत्यापन नहीं करता है। साथ शुरू करने के लिए एक सादा 'URLConnection' के साथ प्रयास करें। क्या आप वाकई अपने जेआरई इंस्टॉलेशन के 'lib/security' में' cacerts' को संशोधित कर चुके हैं? क्या आपने ['Trustmanager' डिबगिंग विकल्प] (http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#Debug) की कोशिश की है? – Bruno

उत्तर

148

विंडोज पर सबसे आसान तरीका उपयोग करने के लिए है कार्यक्रम portecle

  1. पोर्टेक डाउनलोड और स्थापित करें।
  2. पहले 100% सुनिश्चित करें कि आप जानते हैं कि आपके प्रोग्राम को चलाने के लिए कौन सी जेआरई या जेडीके का उपयोग किया जा रहा है। 64 बिट विंडोज 7 पर कुछ जेआरई हो सकते हैं। प्रक्रिया एक्सप्लोरर इससे आपकी सहायता कर सकता है या आप इसका उपयोग कर सकते हैं: System.out.println(System.getProperty("java.home"));
  3. फ़ाइल को JAVA_HOME \ lib \ security \ cacerts को किसी अन्य फ़ोल्डर में कॉपी करें।
  4. क्लिक करें उपकरण> फ़ाइल mycertificate.pem के लिए
  5. क्लिक करें आयात आयात विश्वसनीय प्रमाणपत्र
  6. ब्राउज़ changeit:
  7. Portecle क्लिक फ़ाइल में> ओपन KeyStore फ़ाइल
  8. cacerts फ़ाइल
  9. इस पासवर्ड दर्ज करें का चयन करें
  10. ट्रस्ट पथ के बारे में चेतावनी के लिए ठीक क्लिक करें।
  11. प्रमाण पत्र के बारे में विवरण प्रदर्शित करते समय ठीक क्लिक करें।
  12. प्रमाणपत्र को भरोसेमंद स्वीकार करने के लिए हाँ पर क्लिक करें।
  13. जब यह उपनाम के लिए पूछता है तो ठीक क्लिक करें और जब यह कहता है कि उसने प्रमाणपत्र आयात किया है तो ठीक क्लिक करें।
  14. सहेजें पर क्लिक करें। इसे मत भूलें या परिवर्तन को त्याग दिया गया है।
  15. फ़ाइल कैकर्ट को कॉपी करें जहां आपको यह मिला।

लिनक्स पर:

आप एक वेब सर्वर से SSL प्रमाणपत्र डाउनलोड कर सकते हैं पहले से ही इस तरह यह उपयोग कर रहा है कि:

$ openssl x509 -in /tmp/examplecert.crt -text 
:

$ echo -n | openssl s_client -connect www.example.com:443 | \ 
    sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/examplecert.crt 

वैकल्पिक रूप से प्रमाण पत्र जानकारी की पुष्टि

जावा कैकर्ट्स कीस्टोर में प्रमाण पत्र आयात करें:

$ keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts \ 
    -storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt 

संपादित करें:

इन दिनों हम अक्सर कीस्ट्रोक को एक प्रमाण पत्र को जोड़ने के लिए है क्योंकि आप ssls.com से $ 5 प्रति वर्ष के लिए एक प्रमाण पत्र प्राप्त कर सकते हैं नहीं है। बस अगर यह आपके लिए एक विकल्प है।

+1

इसका मुख्य विचार पोर्टेकल नहीं है बल्कि सही कीस्टोर में प्रमाणपत्र आयात कर रहा है। – Alfabravo

+0

+1 धन्यवाद आदमी! यहां तक ​​कि अगर एक पुरानी पोस्ट है, तो यह मेरी समस्याओं का समाधान करता है !!! पोर्टेकल समाधान नहीं था लेकिन इससे मुझे चीजों को सरल बनाने में बहुत मदद मिली! (शायद प्रमाण पत्र रूपांतरणों के कारण) – Andre

+7

विंडोज़ उत्तर के साथ आपके उत्तर में openssl कमांड डालने के लिए Kudos :) –

26

मैंने एक छोटी सी लिपि लिखना समाप्त कर दिया जो कि कीस्टोरों को प्रमाण पत्र जोड़ता है, इसलिए इसका उपयोग करना बहुत आसान है।

आप से फ़ाइल cacerts आप एक प्रमाण पत्र एक नया प्रमाणपत्र प्राप्त है कि जावा में शामिल नहीं है द्वारा हस्ताक्षर किए गए प्रयोग कर रहे हैं से https://github.com/ssbarnea/keytool-trust

#!/bin/bash 
# version 1.0 
# https://github.com/ssbarnea/keytool-trust 
REMHOST=$1 
REMPORT=${2:-443} 

KEYSTORE_PASS=changeit 
KEYTOOL="sudo keytool" 

# /etc/java-6-sun/security/cacerts 

for CACERTS in /usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts \ 
    /usr/lib/jvm/java-7-oracle/jre/lib/security/cacerts \ 
    "/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/cacerts" \ 
    "/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/MacOS/itms/java/lib/security/cacerts" 
do 

if [ -e "$CACERTS" ] 
then 
    echo --- Adding certs to $CACERTS 

# FYI: the default keystore is located in ~/.keystore 

if [ -z "$REMHOST" ] 
    then 
    echo "ERROR: Please specify the server name to import the certificatin from, eventually followed by the port number, if other than 443." 
    exit 1 
    fi 

set -e 

rm -f $REMHOST:$REMPORT.pem 

if openssl s_client -connect $REMHOST:$REMPORT 1>/tmp/keytool_stdout 2>/tmp/output </dev/null 
     then 
     : 
     else 
     cat /tmp/keytool_stdout 
     cat /tmp/output 
     exit 1 
     fi 

if sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' </tmp/keytool_stdout > /tmp/$REMHOST:$REMPORT.pem 
     then 
     : 
     else 
     echo "ERROR: Unable to extract the certificate from $REMHOST:$REMPORT ($?)" 
     cat /tmp/output 
     fi 

if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT >/dev/null 
    then 
    echo "Key of $REMHOST already found, skipping it." 
    else 
    $KEYTOOL -import -trustcacerts -noprompt -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem 
    fi 

if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -keystore "$CACERTS" >/dev/null 
    then 
    echo "Key of $REMHOST already found in cacerts, skipping it." 
    else 
    $KEYTOOL -import -trustcacerts -noprompt -keystore "$CACERTS" -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem 
    fi 

fi 

done 

`` `

+0

आप एक लाइफसेवर हैं! मैं इस जवाब के लिए समर्थन ड्रम करने जा रहा हूँ। यह बहुत ही कमजोर है। –

+0

कमाल! आपकी स्क्रिप्ट –

+0

के लिए बहुत बहुत धन्यवाद। धन्यवाद। – codemonkey

18
D:\Java\jdk1.5.0_10\bin\keytool -import -file "D:\Certificates\SDS services\Dev\dev-sdsservices-was8.infavig.com.cer" -keystore "D:\Java\jdk1.5.0_10\jre\lib\security\cacerts" -alias "sds certificate" 
+0

सरल और प्रभावी !! –

3

नवीनतम संस्करण प्राप्त कर सकते हैं डिफ़ॉल्ट, आपको HTTPS कनेक्शन के लिए निम्न कॉन्फ़िगरेशन को पूरा करने की आवश्यकता है। cacerts में प्रमाण पत्र आयात करने के लिए:

  1. ओपन विंडोज एक्सप्लोरर और cacerts फ़ाइल है, जो JRE \ lib \ सुरक्षा सबफ़ोल्डर जहां कुल्हाड़ी कोर क्लाइंट स्थापित किया गया है में स्थित है पर जाएँ। डिफ़ॉल्ट स्थान सी: \ प्रोग्राम फ़ाइलें \ ACL सॉफ़्टवेयर \ AX कोर क्लाइंट \ jre \ lib \ security
  2. कोई भी परिवर्तन करने से पहले फ़ाइल की बैकअप प्रति बनाएं।
  3. आपके द्वारा उपयोग किए जाने वाले प्रमाणपत्र प्राधिकरण से प्राप्त प्रमाणपत्रों के आधार पर, आपको cacerts फ़ाइल में एक मध्यवर्ती प्रमाणपत्र और/या मूल प्रमाणपत्र आयात करने की आवश्यकता हो सकती है। प्रमाण पत्र आयात करने के लिए निम्न वाक्यविन्यास का उपयोग करें: keytool -import -alias -keystore -trustcacerts -file
  4. यदि आप दोनों प्रमाण पत्र आयात कर रहे हैं तो प्रत्येक प्रमाणपत्र के लिए निर्दिष्ट उपनाम अद्वितीय होना चाहिए।
  5. "पासवर्ड" प्रॉम्प्ट पर कीस्टोर के लिए पासवर्ड टाइप करें और एंटर दबाएं। Cacerts फ़ाइल के लिए डिफ़ॉल्ट जावा पासवर्ड "परिवर्तन" है। "इस प्रमाणपत्र पर भरोसा करें" प्रॉम्प्ट पर 'y' टाइप करें और एंटर दबाएं।
+0

इस कमांड का उपयोग करें: -> keytool -import -alias -keystore -trustcacerts -file user1688640

0

कोशिश करने के लिए

keytool -import -trustcacerts -noprompt -keystore <full path to cacerts> -storepass changeit -alias $REMHOST -file $REMHOST.pem 

मैं ईमानदारी से पता नहीं है, जहां यह अपने प्रमाण पत्र डालता है अगर आप सिर्फ cacerts लिखना है तो बस यह एक पूर्ण पथ

2

यह मेरे लिए काम किया देना चाह सकते हैं। :)

 
sudo keytool -importcert -file filename.cer -alias randomaliasname -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit 
0

सरल कमांड 'कीटोल' विंडोज और/या सिग्विन के साथ भी काम करता है।

  1. आप JDK है कि आप हो जाएगा अंदर JRE की पहचान सुनिश्चित करें:

    आप Cygwin यहाँ उपयोग कर रहे हैं संशोधित आदेश है कि मैं के "S.Botha के" जवाब नीचे से प्रयोग किया जाता है

  2. व्यवस्थापक के रूप में अपना प्रॉम्प्ट/साइगविन प्रारंभ करें
  3. उस जेडीके की बिन निर्देशिका के अंदर जाएं सीडी/साइग्राइड/सी/प्रोग्राम \ फ़ाइलें/जावा/जेडीके 1.8।0_121/JRE/bin
  4. , यह अंदर से Keytool आदेश निष्पादित जहां, अंत में अपने नए प्रमाणपत्र के लिए पथ प्रदान करते हैं ताकि तरह:

    ./keytool.exe -import -trustcacerts -keystore ../lib/security/cacerts -storepass changeit -noprompt -alias myownaliasformysystem -file "D:\Stuff\saved-certs\ca.cert" 
    

सूचना, इस के तहत है अगर क्योंकि सिगविन आप एक गैर-सिग्विन कार्यक्रम का मार्ग दे रहे हैं, इसलिए पथ डॉस की तरह और उद्धरणों में है।

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