क्या ssh कुंजी का उपयोग करके किसी फ़ाइल पर हस्ताक्षर करना संभव है?


36

मैं SSH (OpenSSH 5.5p1 लिनक्स पर, सटीक होने के लिए) का उपयोग करता हूं। मेरे पास एक कुंजी है, जिस पर मेरे पास एक पासफ़्रेज़ है। मैं कंप्यूटर सामान में सामान्य लॉगिंग के लिए इसका उपयोग करता हूं।

क्या मैं इसका उपयोग फाइलों पर हस्ताक्षर करने के लिए भी कर सकता हूं?

जैसा कि मैं इसे समझता हूं, SSH कुंजी एक RSA (या DSA) कुंजी है, और SSH लॉगिन प्रक्रिया के दौरान, इसका उपयोग सर्वर पर भेजे गए संदेशों पर हस्ताक्षर करने के लिए किया जाता है। तो सिद्धांत रूप में और व्यवहार में, इसका उपयोग चीजों पर हस्ताक्षर करने के लिए किया जा सकता है - वास्तव में, इसका एकमात्र उद्देश्य है।

लेकिन जहां तक ​​मैं देख सकता हूं, एक मनमानी फ़ाइल पर हस्ताक्षर करने के लिए कुंजी का उपयोग करने का कोई तरीका नहीं है (जैसा कि आप पीजीपी के साथ कहेंगे)। क्या ऐसा करने का कोई तरीका है?


OpenSSH डेटा प्रोटोकॉल के रूप में Ed25519 का उपयोग नहीं करता है ? सिर्फ उपकरणों की बात लगती है।
पाब्लो ए

जवाबों:


24

अकेले OpenSSH उपकरणों के साथ ऐसा करने का कोई तरीका नहीं हो सकता है।

लेकिन यह OpenSSL टूल्स के साथ काफी आसानी से किया जा सकता है। वास्तव में, इसे करने के कम से कम दो तरीके हैं। नीचे दिए गए उदाहरणों में, ~/.ssh/id_rsaआपकी निजी कुंजी है।

एक तरीका dgst का उपयोग कर रहा है :

openssl dgst -sign ~/.ssh/id_rsa some-file

अन्य का उपयोग कर रहा है pkeyutl :

openssl pkeyutl -sign -inkey ~/.ssh/id_rsa -in some-file

ये दोनों मानक उत्पादन के लिए एक द्विआधारी हस्ताक्षर लिखते हैं। dgst एक -hexविकल्प लेता है एक पाठात्मक प्रतिनिधित्व को मुद्रित करेगा, जिसमें हस्ताक्षर के रूप के बारे में कुछ विवरण होंगे। pkeyutl एक -hexdumpविकल्प लेता है जो थोड़ा कम उपयोगी है। दोनों आरएसए और डीएसए चाबियाँ दोनों स्वीकार करेंगे। मुझे नहीं पता कि आउटपुट का प्रारूप क्या है। दोनों कमांड अलग-अलग फॉर्मेट तैयार करते हैं। मैं धारणा है कि मिल pkeyutl की तुलना में अधिक आधुनिक माना जाता है dgst

उन हस्ताक्षरों को सत्यापित करने के लिए:

openssl dgst -verify $PUBLIC_KEY_FILE -signature signature-file some-file

तथा:

openssl pkeyutl -verify -inkey $PUBLIC_KEY_FILE -sigfile signature-file -in some-file

समस्या यहाँ है $PUBLIC_KEY_FILE। ओपनएसएसएल ओपनएसएसएच के सार्वजनिक कुंजी प्रारूप को नहीं पढ़ सकता है, इसलिए आप इसका उपयोग नहीं कर सकते id_rsa.pub। आपके पास कुछ विकल्प हैं, कोई भी आदर्श नहीं है।

यदि आपके पास 5.6 या बाद के ओपनएसएसएच का एक संस्करण है, तो आप स्पष्ट रूप से ऐसा कर सकते हैं:

ssh-keygen -e -f ~/.ssh/id_rsa.pub -m pem

जो PEM प्रारूप में मानक आउटपुट के लिए सार्वजनिक कुंजी लिखेगा, जिसे OpenSSL पढ़ सकता है।

यदि आपके पास निजी कुंजी है, और यह RSA कुंजी है, तो आप इससे सार्वजनिक कुंजी निकाल सकते हैं (मुझे लगता है कि PEM- एन्कोडेड निजी कुंजी फ़ाइल में सार्वजनिक कुंजी की एक प्रति शामिल है, क्योंकि सार्वजनिक कुंजी को प्राप्त करना संभव नहीं है स्वयं निजी कुंजी से), और उसका उपयोग करें:

openssl rsa -in ~/.ssh/id_rsa -pubout

मुझे नहीं पता कि क्या कोई डीएसए समकक्ष है। ध्यान दें कि इस दृष्टिकोण के लिए निजी कुंजी के स्वामी से कुछ सहयोग की आवश्यकता होती है, जिसे सार्वजनिक कुंजी को निकालना होगा और इसे भेजने वाले को सत्यापित करना होगा।

अंत में, आप सार्वजनिक कुंजी को ओपनएसएसएच से ओपनएसएसएस प्रारूप में बदलने के लिए लार्स नामक एक पायथन कार्यक्रम का उपयोग कर सकते हैं ।


1
मैं केवल यह नोट करना चाहूंगा कि "निजी कुंजी से सार्वजनिक कुंजी प्राप्त करना संभव नहीं है" यह सच नहीं है। व्यवहार में (अर्थात, सभी क्रिप्टोकरंसी में जो वास्तव में उपयोग किए जाते हैं) सार्वजनिक कुंजी आसानी से अधिकांश समय निजी कुंजी से ली जाती है।
कीर्लगिन

@kirelagin: मुझे नहीं पता था कि। क्या आप मुझे बता सकते हैं, या मुझे लिंक कर सकते हैं, कि कैसे किया जा सकता है?
टॉम एंडरसन

1
मुझे यकीन नहीं है कि इस विषय पर कुछ विशेष पढ़ना है ... चलो इसके बारे में बस सोचते हैं। किसी भी असतत लॉग आधारित क्रिप्टोकरंसी (ElGamal) को लें। इस स्थिति में, निजी कुंजी (समूह आकार, जनरेटर, शक्ति) और सार्वजनिक कुंजी है (समूह आकार, जनरेटर, जनरेटर ^ पावर)। तो, लॉग मुश्किल है, लेकिन शक्ति नहीं है, आप बस इसकी गणना करते हैं।
किर्लगिन

आरएसए के मामले में यह उलटा वास्तव में मुश्किल है, लेकिन यहां स्थिति थोड़ी अलग है। सार्वजनिक कुंजी है (n, d) और निजी कुंजी है (n, d ^ (- 1) mod phi (n))। Inverting d भी मुश्किल होगा अगर आपने phi (n) को स्टोर नहीं किया है, लेकिन यहाँ ट्रिक है: लगभग हर कोई e = 65537 का उपयोग करता है (जब आप एक कुंजी उत्पन्न करते हैं तो इस डिफ़ॉल्ट को बदलने का विकल्प होता है, लेकिन मैंने कभी नहीं देखा है इसका उपयोग करने वाला कोई भी व्यक्ति क्योंकि इसका कोई व्यावहारिक अर्थ नहीं है), इसलिए किसी निजी से सार्वजनिक कुंजी प्राप्त करना तुच्छ है।
किर्लगिन

एलिप्टिक घटता के साथ यह वास्तव में असतत लॉग और पावर के साथ ही है, inverting आसान है। उस ने कहा, मैं अन्य क्रिप्टोकरंसी के बारे में निश्चित नहीं हूं, लेकिन वे तीन ऐसे हैं जो व्यवहार में उपयोग किए जाते हैं।
किर्लगिन

10

@ टॉम के जवाब ने मुझे शुरू करने में मदद की, लेकिन बॉक्स से बाहर काम नहीं किया।

ये कमांड काम करेंगे:

  • ओपनएसएसएल 1.0.1 14 मार्च 2012
  • OpenSSH_5.9p1

पाइकल का उपयोग करना

# openssl pkeyutl -sign -inkey ~/.ssh/id_sample -in $1 > $1.sig
# ssh-keygen -e -f ~/.ssh/id_sample.pub -m PKCS8 > pub
# openssl pkeyutl -verify -pubin -inkey pub -in $1 -sigfile $1.sig
Signature Verified Successfully

Dgst का उपयोग करना

# openssl dgst -sign ~/.ssh/id_sample $1 > $1.sig
# ssh-keygen -e -f ~/.ssh/id_sample.pub -m PKCS8 > pub
# openssl dgst -verify pub -signature $1.sig $1
Verified OK

पीकुटल संस्करण केवल छोटे आकार की फाइलों पर हस्ताक्षर कर सकता है। जबकि dgst मनमाने ढंग से बड़ी फ़ाइलों पर हस्ताक्षर कर सकता है, क्योंकि यह परिणाम पर हस्ताक्षर करने से पहले एक पाचन लेता है।


मेरे लिए भी स्टीफन.ज़ जवाब ने काम किया। पहले मैं कुछ देर तक टॉम के जवाब के साथ खेलता रहा और आखिर में स्टीफन को मिला। धन्यवाद स्टीफन .z!
ग्रेज़गोरज़ वियरज़ोवेकी

PS यहाँ मैंने अपने स्निपेट साझा किए हैं: gist.github.com/gwpl/2c7636f0b200cbfbe82cc9d4f6338585
22

क्या आपने फ़ाइल के केवल हैश पर हस्ताक्षर करने के लिए pkeyutl का उपयोग करने की कोशिश की?
Gaia

-3

उन हस्ताक्षरों को सत्यापित करने के लिए - आसान समाधान:

यह सुनिश्चित करने का आसान तरीका है कि हस्ताक्षरित दस्तावेज़ एक ही है, डिजिटल हस्ताक्षर फ़ाइल को फिर से बनाना है और फिर यह जांचने के लिए कि क्या दो हस्ताक्षर फ़ाइलें समान हैं, का उपयोग करें।


3
आप हैश की सोच रहे हैं , सिग्नेचर की नहीं । समान, लेकिन समान नहीं: हैश केवल पुष्टि करता है कि फ़ाइल परिवर्तित नहीं हुई; एक हस्ताक्षर यह भी आया कि यह कहां है।
पिस्कवर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.