यह समस्या MinGW / MSYS के लिए विशिष्ट है जो आमतौर पर विंडोज पैकेज के लिए Git के हिस्से के रूप में उपयोग की जाती है ।
इसका समाधान -subj
अग्रणी //
(डबल फ़ॉरवर्ड स्लैश) के साथ तर्क को पास करना है और फिर \
कुंजी / मूल्य जोड़े को अलग करने के लिए (बैकस्लैश) का उपयोग करना है। ऐशे ही:
"//O=Org\CN=Name"
यह तब openssl
अपेक्षित रूप में जादुई रूप से पारित हो जाएगा :
"/O=Org/CN=Name"
तो विशिष्ट प्रश्न का उत्तर देने के लिए, आपको -subj
अपनी स्क्रिप्ट में निम्नलिखित के लिए लाइन बदलनी चाहिए ।
-subj "//C=GB\ST=someplace\L=Provo\O=Achme\CN=${FQDN}"
आपको बस इतना ही चाहिए।
यह कैसा जादू है?
उन लोगों के बारे में जानने के लिए जो यहां चल रहे हैं, मैं इस रहस्य को समझा सकता हूं। कारण यह है कि MSYS यथोचित मानता है कि स्लैश वाले तर्क वास्तव में पथ हैं। और जब उन तर्कों को एक निष्पादन योग्य के लिए पारित किया जाता है जिन्हें विशेष रूप से MSYS (जैसे openssl
इस मामले में) के लिए संकलित नहीं किया गया है, तो यह POSIX पथ को Win32 पथ में बदल देगा । इस रूपांतरण के नियम काफी जटिल हैं क्योंकि MSYS इंटरऑपरेबिलिटी के लिए सबसे आम परिदृश्यों को कवर करने की पूरी कोशिश करता है। यह भी बताता है कि openssl
विंडोज़ कमांड प्रॉम्प्ट ( cmd.exe
) से उपयोग करना ठीक काम करता है, क्योंकि कोई जादुई रूपांतरण नहीं किया जाता है।
आप इस तरह रूपांतरण का परीक्षण कर सकते हैं।
$ cmd //c echo "/CN=Name"
"C:/Program Files (x86)/Git/CN=Name"
हम echo
MSYS के साथ आने वाले निष्पादन योग्य का उपयोग नहीं कर सकते हैं क्योंकि यह MSYS के लिए संकलित किया गया था, इसके बजाय हम echo
अंतर्निहित का उपयोग करेंगे cmd
। ध्यान दें कि चूंकि cmd
स्विचेस /
(विंडोज़ कमांड्स के लिए आम) के साथ शुरू होता है, इसलिए हमें इसे डबल स्लैश के साथ संभालना होगा। जैसा कि हम आउटपुट में देख सकते हैं कि तर्क को विंडोज़ पथ में विस्तारित किया गया था और यह स्पष्ट हो जाता है कि openssl
वास्तव में यह दावा क्यों करता है Subject does not start with '/'.
।
आइए देखते हैं कुछ और रूपांतरण।
$ cmd //c echo "//CN=Name"
/CN=Name
डबल स्लैश बनाता है MSYS का मानना है कि तर्क एक विंडोज़ शैली स्विच है जिसके परिणामस्वरूप /
केवल (कोई पथ रूपांतरण नहीं) होता है। आपको लगता है कि इसके साथ हम स्लैश का उपयोग अधिक महत्वपूर्ण / मूल्य जोड़े को जोड़ने के लिए कर सकते हैं। चलो कोशिश करते हैं कि।
$ cmd //c echo "//O=Org/CN=Name"
//O=Org/CN=Name
अचानक शुरू में डबल स्लैश को कम नहीं किया गया है। ऐसा इसलिए है क्योंकि अब, शुरुआती डबल स्लैश के बाद एक स्लैश के साथ, MSYS को लगता है कि हम एक UNC पथ (जैसे // सर्वर / पथ) का संदर्भ दे रहे हैं। यदि यह इसके लिए पारित किया गया था openssl
तो पहली कुंजी / मान को छोड़ देगा Subject Attribute /O has no known NID, skipped
।
इस व्यवहार की व्याख्या करने वाले MinGW विकि से प्रासंगिक नियम इस प्रकार है:
- 2 या अधिक / के साथ शुरू होने वाले तर्क को एक बची हुई विंडोज शैली स्विच माना जाता है और इसे प्रमुख / हटाए गए और सभी \ / में बदल दिया जाएगा।
- सिवाय इसके कि अगर / के अग्रणी ब्लॉक / के बाद कोई तर्क UNC पथ माना जाता है और प्रमुख / हटाया नहीं जाता है।
इस नियम में हम उस विधि को देख सकते हैं जिसका उपयोग हम अपने इच्छित तर्क को बनाने के लिए कर सकते हैं। चूँकि \
शुरू होने वाले तर्क में सभी //
को सादे में बदल दिया जाएगा /
। चलो कोशिश करते हैं कि बाहर।
$ cmd //c echo "//O=Org\CN=Name"
/O=Org/CN=Name
और जैसा कि हम देख सकते हैं कि यह काम करता है।
आशा है कि यह जादू को थोड़ा कम करेगा।
cat -vet /path/to/script
, और देखें कि क्या लाइनें '^ M $' (विंडोज़-शैली) या सिर्फ '$' (यूनिक्स-शैली) के साथ समाप्त होती हैं।