Pkcs12 कंटेनर से निजी कुंजी पासवर्ड कैसे निकालें?


40
  1. मैंने क्रोम के एसएसएल / एक्सपोर्ट कमांड का उपयोग करके प्रमाणपत्र निकाला।
  2. फिर इसे ओपनवीपीएन के लिए इनपुट के रूप में प्रदान किया - ओपनवैप के लिए कॉन्फ़िगरेशन में:
    pkcs12 "path/to/pkcs12_container"
  3. कॉल करते समय openvpn ~/openvp_configयह निजी कुंजी के लिए पासवर्ड मांगता है (जब मैं क्रोम का उपयोग करते समय दर्ज किया गया):
    Enter Private Key Password:...
  4. मैं यह पासवर्ड अनुरोध हटाना चाहता हूं।

प्रश्न: pkcs12 से निजी कुंजी के लिए पासवर्ड कैसे निकालें?

यही है, pkcs12 फ़ाइल बनाएं जिसमें पासवर्ड की आवश्यकता नहीं है।

(ऐसा लगता है कि मैंने पहले ही किसी तरह एक साल पहले किया था, और अब इसे भूल गया।


निम्न स्क्रिप्ट करता है (यह अनिवार्य रूप zero0 जवाब है): gist.github.com/5nizza/7ae9cff0d43f33818a33 उपयोग:./remove_pass_from_cert.sh YourCertName YourCertPass
Ayrat

जवाबों:


48

इसे विभिन्न opensslकॉल द्वारा प्राप्त किया जा सकता है ।

  • पासवर्ड आपका वर्तमान पासवर्ड है
  • YourPKCSFile वह फ़ाइल है जिसे आप कनवर्ट करना चाहते हैं
  • NewPKCSWithoutPassphraseFile, बिना पासफ़्रेज़ के PKCS12 के लिए लक्ष्य फ़ाइल है

सबसे पहले, प्रमाणपत्र निकालें:

$ openssl pkcs12 -clcerts -nokeys -in "YourPKCSFile" \
      -out certificate.crt -password pass:PASSWORD -passin pass:PASSWORD

दूसरा, सीए कुंजी:

$ openssl pkcs12 -cacerts -nokeys -in "YourPKCSFile" \
      -out ca-cert.ca -password pass:PASSWORD -passin pass:PASSWORD

अब, निजी कुंजी:

$ openssl pkcs12 -nocerts -in "YourPKCSFile" \
      -out private.key -password pass:PASSWORD -passin pass:PASSWORD \
      -passout pass:TemporaryPassword

अब पासफ़्रेज़ हटा दें:

$ openssl rsa -in private.key -out "NewKeyFile.key" \
      -passin pass:TemporaryPassword

नई PKCS-File के लिए चीजों को एक साथ रखें:

$ cat "NewKeyFile.key"  \
      "certificate.crt" \
      "ca-cert.ca" > PEM.pem

और नई फ़ाइल बनाएँ:

$ openssl pkcs12 -export -nodes -CAfile ca-cert.ca \
      -in PEM.pem -out "NewPKCSWithoutPassphraseFile"

अब आपके पास निजी कुंजी भाग पर पासफ़्रेज़ के बिना एक नई PKCS12 कुंजी फ़ाइल है।


जबरदस्त जवाब! ..what है ca-cert.ca?
अय्यर

@ एरैट: यह आपकी कुंजी का सीए प्रमाणपत्र हिस्सा है। - मेरे पास उत्तर में एक टाइपो है, सही कर रहा हूँ ... - आप इसे
आज़माने के

2
-nodesजब -exportउपयोग किया जाता है, तो इसे अनदेखा कर दिया जाता है, यह इस मामले के लिए प्रलेखित नहीं है (ओपनस मैन पेज देखें, -nodesकेवल PKCS # 12 से पीईएम से निर्यात करते समय सूचीबद्ध है)। आपका अंतिम कॉल अभी भी निर्यात पासवर्ड के लिए मुझे संकेत देता है। और अगर मैं सिर्फ रिटर्न मारता हूं, तो मुझे PKCS # 12 फ़ाइल मिलती है जिसका पासवर्ड एक खाली स्ट्रिंग है और पासवर्ड के बिना कोई भी नहीं है। जब मैं तब करता हूं तब भी openssl pkcs12 -in "NewPKCSWithoutPassphraseFile"यह मुझे एक आयात पासवर्ड के लिए संकेत देता है। मैं सिर्फ रिटर्न मार सकता हूं और वह काम करता है लेकिन अगर कोई पासवर्ड नहीं था, तो यह भी संकेत नहीं देगा।
मेकी

35

सबसे सरल उपाय जो मैंने पाया है

अस्थायी pem फ़ाइल में निर्यात करें

openssl pkcs12 -in protected.p12 -nodes -out temp.pem
#  -> Enter password

Pem को p12 में बदलें

openssl pkcs12 -export -in temp.pem  -out unprotected.p12
# -> Just press [return] twice for no password

अस्थायी प्रमाणपत्र निकालें

rm temp.pem

मैं इस दृष्टिकोण के लिए एक नकारात्मक पहलू नहीं देखता।
मैट बेकमैन

कुछ टूल के लिए पासवर्ड की आवश्यकता होती है। उदाहरण के लिए keytool -v -list -storetype pkcs12 -keystore unprotected.p12, एक चेतावनी का उत्सर्जन करेगा और प्रमाणपत्र को सूचीबद्ध नहीं करेगा। तो यह OpenVPN के लिए काम कर सकता है, लेकिन किसी और चीज़ के लिए नहीं।
mivk

@mivk तुम्हारा क्या मतलब है? कुछ उपकरणों के लिए पासवर्ड से सुरक्षित कुंजी की आवश्यकता होती है?
कोएन।

1
ज़रूर, लेकिन सवाल पासवर्ड को हटाने के बारे में है, उन अनुप्रयोगों के बारे में नहीं जिन्हें सेट करने के लिए पासवर्ड की आवश्यकता होती है।
कोएन।

2
आपका समाधान PKCS # 12 w / oa पासवर्ड नहीं बनाता है, लेकिन एक पासवर्ड है जो "" (एमटीपी स्ट्रिंग) है, जो समान नहीं है।
मेकी

5

यह बिना किसी अस्थायी फ़ाइल के एक चरण में आसानी से किया जा सकता है:

openssl pkcs12 -in "PKCSFile" -nodes | openssl pkcs12 -export -out "PKCSFile-Nopass"

पासवर्ड के साथ इंपोर्ट पासवर्ड प्रॉम्प्ट का जवाब दें। एक्सपोर्ट पासवार्ड का उत्तर <CR> के साथ दिया गया है

किया हुआ।

ध्यान दें कि यह किसी भी मध्यवर्ती प्रमाणपत्र की संख्या को संभालता है जो बंडल में हो सकता है ...

मैं दृढ़ता से परिणामी फ़ाइल के साथ देखभाल करने की सलाह देता हूं; ओम्स्क को पहले 377 पर सेट करना एक अच्छा विचार होगा (गैर-यूनिक्स: इसका मतलब है कि केवल मालिक ही उस फ़ाइल को पढ़ सकता है जो बनाई गई है।) मुझे लगता है कि यह 2 चरण है, यदि आपका डिफॉल्ट उमस्क अनुमन्य है ...


2

अब, निजी कुंजी:

openssl pkcs12 -nocerts -in "YourPKCSFile" -out private.key -password pass:PASSWORD -passin pass:PASSWORD -passout pass:TemporaryPassword

अब पासफ़्रेज़ निकालें:

openssl rsa -in private.key -out "NewKeyFile.key" -passin pass:TemporaryPassword

2 चरणों द्वारा प्रतिस्थापित किया जा सकता है

openssl pkcs12 -nocerts -in "YourPKCSFile" -out private.key -nodes

0

इनमें से किसी ने मेरे लिए काम नहीं किया। अंत में मैं डॉटनेट कोड पर लौट आया जिसने पहली बार काम किया।

class Script
{
    static public void Main(string[] args)
    {
                if (args.Length < 3 || args.Contains("/?"))
                {
                    MainHelp(args);
                    return;
                }
       string _infile = args[0],
                        _outfile = args[2];
                string _password = args[1], _outpassword = (args.Length > 3) ? args[3] : "";
                Console.WriteLine(String.Format("{0} -> {1} with ({2} -> {3})", _infile, _outfile, _password, _outpassword));
                System.Security.Cryptography.X509Certificates.X509Certificate2 cert = null;
                Console.WriteLine(String.Format("Load {0} with {2}", _infile, _outfile, _password, _outpassword));
                cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(_infile, _password, X509KeyStorageFlags.Exportable);
                Console.WriteLine(String.Format("Export {1} with {3}", _infile, _outfile, _password, _outpassword));
                System.IO.File.WriteAllBytes(_outfile, cert.Export(System.Security.Cryptography.X509Certificates.X509ContentType.Pfx, _outpassword));
                Console.WriteLine(String.Format("Export complete", _infile, _outfile, _password, _outpassword));
    }

     static public void MainHelp(string[] args)
    {
            Console.WriteLine("Usage pfxremovepwd [inpfx] [inpwd] [outpfx] [optional outpwd]");
            return;
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.