পেম কীকে ssh-rsa ফর্ম্যাটে রূপান্তর করুন


142

আমার কাছে derফরমেটে একটি শংসাপত্র রয়েছে , এটি থেকে এই আদেশটি দিয়ে আমি একটি সর্বজনীন কী উত্পন্ন করি:

openssl x509 -inform der -in ejbcacert.cer -noout -pubkey > pub1key.pub

যার ফলাফল:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7vbqajDw4o6gJy8UtmIbkcpnk
O3Kwc4qsEnSZp/TR+fQi62F79RHWmwKOtFmwteURgLbj7D/WGuNLGOfa/2vse3G2
eHnHl5CB8ruRX9fBl/KgwCVr2JaEuUm66bBQeP5XeBotdR4cvX38uPYivCDdPjJ1
QWPdspTBKcxeFbccDwIDAQAB
-----END PUBLIC KEY-----

আমি কীভাবে এইরকম পাবলিক কী পেতে পারি? হয় শংসাপত্র থেকে না এই পাবলিক কী থেকে?

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC7vbqajDw4o6gJy8UtmIbkcpnkO3Kwc4qsEnSZp/TR+fQi62F79RHWmwKOtFmwteURgLbj7D/WGuNLGOfa/2vse3G2eHnHl5CB8ruRX9fBl/KgwCVr2JaEuUm66bBQeP5XeBotdR4cvX38uPYivCDdPjJ1QWPdspTBKcxeFbccDw==

এটি এই আদেশের সাথে প্রাপ্ত হয়েছিল:

ssh-keygen -y -f private_key1.pem > public_key1.pub

14
আপনি "এই আদেশটি দিয়ে এটি প্রাপ্ত হয়েছিল" তে আপনি যেভাবে পোস্ট করেছেন তা নীচের উত্তরগুলির চেয়ে আমার চেয়ে ভাল কাজ করেছে।
Yoav Shapira

7
@YoavShipra। হ্যাঁ তবে পুরো প্রশ্নটি হ'ল তিনি কেবল সর্বজনীন কী ব্যবহার করে রূপান্তর করতে চান। হতে পারে তার ব্যক্তিগত কী নেই এবং তার কাছে কেবল সর্বজনীন কী রয়েছে এবং তিনি পিইএম ফর্ম্যাট থেকে এসএস-আরএসএ ফর্ম্যাটে রূপান্তর করতে চান।
deltamind106

10
এডাব্লুএস থেকে একটি .pem দেওয়া, আপনি উপরে যে আদেশটি ssh-keygen -y -f private_key1.pem > public_key1.pubদিয়েছেন তা আমার পক্ষে দুর্দান্ত কাজ করেছে।
Kzqai

1
সমস্ত ভুল উত্তর। এটি ssh-keygen -i -m PKCS8 -f public-key.pem
সঠিকটি

3
সৌন্দর্য দর্শকের চোখে পড়ে । আমাদের লক্ষ্য রাখতে হবে যে একটি পেম কী পাবলিক কী বা প্রাইভেট কী বা উভয়ই ধারক করতে পারে; এনক্রিপ্ট করা বা নাও হতে পারে; প্লাস বিভিন্ন বিন্যাস সহ। এছাড়াও বিকল্পের অর্থ / এর -mজন্য পৃথক । সুতরাং আমার বন্ধুরা, দয়া করে নিশ্চিত হন যে আপনি কী চান এবং আপনার কী আছে তা জানেন । :-)-i-e
ryenus

উত্তর:


129

স্টাফ সংকলন করতে হবে না। আপনি একই সাথে এটি করতে পারেন ssh-keygen:

ssh-keygen -f pub1key.pub -i

ওপেনএসএল ফর্ম্যাটে সর্বজনীন কীটি ওপেনএসএইচ ফর্ম্যাটে পড়বে pub1key.pubএবং এটিকে আউটপুট করবে।

দ্রষ্টব্য : কিছু ক্ষেত্রে আপনাকে ইনপুট ফর্ম্যাটটি নির্দিষ্ট করতে হবে:

ssh-keygen -f pub1key.pub -i -mPKCS8

Ssh-keygen ডক্স থেকে (ম্যান ssh-keygen থেকে):

-m কী_ফর্ম্যাট -i (আমদানি) বা -e (রফতানি) রূপান্তর বিকল্পগুলির জন্য একটি মূল বিন্যাস নির্দিষ্ট করুন। সমর্থিত মূল ফর্ম্যাটগুলি হ'ল: "আরএফসি 4716" (আরএফসি 4716 / এসএসএইচ 2 পাবলিক বা প্রাইভেট কী), "পিকেসিএস 8" (পিইএম পিকেসিএস 8 পাবলিক কী) বা "পিইএম" (পিইএম পাবলিক কী)। ডিফল্ট রূপান্তর বিন্যাসটি হ'ল "আরএফসি 4716"।


3
ssh-keygen: অবৈধ বিকল্প - এম
mbonnin

1
প্রশ্ন অন্যভাবে যায়।
131

4
ভবিষ্যতের ওয়েব সন্ধানকারীদের জন্য, এটি যদি আপনার পক্ষে কাজ করে না, মূল প্রশ্নের মন্তব্যগুলি আমার পক্ষে কাজ করেছে।
ক্রিস্টোপলাস

17
আমার ক্ষেত্রে, -m PKCS8প্রয়োজনীয় ছিল
ইয়ান হান্টার

1
$ ssh-keygen -f mykey.pub -i key_from_blob: invalid format decode blob failed.
বাসটিয়ান ভয়েগ্ট

53

স্ক্রিপ্ট বা অন্যান্য 'কৌশল' দরকার নেই: opensslএবংssh-keygen যথেষ্ট are আমি কীগুলির কোনও পাসওয়ার্ড ধরে নিচ্ছি না (যা খারাপ)।

একটি আরএসএ জোড়া তৈরি করুন

নিম্নলিখিত সমস্ত পদ্ধতি একই ফর্ম্যাটে একটি আরএসএ কী জুটি দেয়

  1. ওপেনসেল সহ ( ম্যান জেনার্সা )

    openssl genrsa -out dummy-genrsa.pem 2048
    

    দ্বারা OpenSSL v1.0.1 সালে genrsa ছাপিয়ে হয় দ্বারা genpkeyতাই এই এটি (না নতুন পথ মানুষ genpkey ):

    openssl genpkey -algorithm RSA -out dummy-genpkey.pem -pkeyopt rsa_keygen_bits:2048
    
  2. এসএস-কিজেন সহ

    ssh-keygen -t rsa -b 2048 -f dummy-ssh-keygen.pem -N '' -C "Test Key"
    

DER কে PEM এ রূপান্তর করা হচ্ছে

আপনার যদি DER ফর্ম্যাটে কোনও আরএসএ কী জুড়ি থাকে, আপনি নীচের ফর্ম্যাট রূপান্তরকে অনুমতি দেওয়ার জন্য এটি পিইমে রূপান্তর করতে চাইতে পারেন:

জেনারেশন:

openssl genpkey -algorithm RSA -out genpkey-dummy.cer -outform DER -pkeyopt rsa_keygen_bits:2048

রূপান্তর:

openssl rsa -inform DER -outform PEM -in genpkey-dummy.cer -out dummy-der2pem.pem

পিইএম ফর্ম্যাট করা আরএসএ জোড়া থেকে পাবলিক কীটি বের করুন

  1. পিইএম ফর্ম্যাটে:

    openssl rsa -in dummy-xxx.pem -pubout
    
  2. ওপেনএসএসএইচ ভি 2 ফর্ম্যাটে দেখুন :

    ssh-keygen -y -f dummy-xxx.pem
    

মন্তব্য

ওএস এবং সফ্টওয়্যার সংস্করণ:

[user@test1 ~]# cat /etc/redhat-release ; uname -a ; openssl version
CentOS release 6.5 (Final)
Linux test1.example.local 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
OpenSSL 1.0.1e-fips 11 Feb 2013

তথ্যসূত্র:


//, এটি কি ssh-rsaফর্ম্যাটে কী তৈরি করে? ভাল রেফারেন্স, বিটিডাব্লু।
নাথান বাসানিজ

@ নাথানবাশানিজ, হ্যাঁ ("পিইএম ফর্ম্যাট করা আরএসএ জুটি থেকে পাবলিক কী বের করুন", পয়েন্ট ২ দেখুন): একবার পেম ফর্ম্যাটে শংসাপত্র পেলে: এসএসএসের ফাইলের জন্য উপযুক্ত ফিট ssh-keygen -y -f dummy-xxx.pemতৈরি করে । ssh-rsa AAAA[...]==authorized_keys
থমাস

ভাল তথ্যবহুল টুকরো ... তবে আমি মনে করি না যে এটি সত্যই প্রশ্নের উত্তরটি দেয় এবং উপরেরটি আরও সংক্ষিপ্ত অংশ হিসাবে।
ওগ্রে কোডগুলি

23

আমার নিজের প্রশ্নের উত্তর দিতে, ওপেনসেল মেলিং তালিকায় পোস্ট করার পরে এটি পেয়েছে:

ওপেনএসএসএল পাবলিক কী থেকে ওপেনএসএসএইচ পাবলিক কীতে রূপান্তর করতে এখানে সি কোড রয়েছে। আপনি এই লিঙ্কটি থেকে কোডটি ধরতে পারেন এবং এটি নিজেই সংকলন করতে পারেন:

static unsigned char pSshHeader[11] = { 0x00, 0x00, 0x00, 0x07, 0x73, 0x73, 0x68, 0x2D, 0x72, 0x73, 0x61};

static int SshEncodeBuffer(unsigned char *pEncoding, int bufferLen, unsigned char* pBuffer)
{
   int adjustedLen = bufferLen, index;
   if (*pBuffer & 0x80)
   {
      adjustedLen++;
      pEncoding[4] = 0;
      index = 5;
   }
   else
   {
      index = 4;
   }
   pEncoding[0] = (unsigned char) (adjustedLen >> 24);
   pEncoding[1] = (unsigned char) (adjustedLen >> 16);
   pEncoding[2] = (unsigned char) (adjustedLen >>  8);
   pEncoding[3] = (unsigned char) (adjustedLen      );
   memcpy(&pEncoding[index], pBuffer, bufferLen);
   return index + bufferLen;
}

int main(int argc, char**  argv)
{
   int iRet = 0;
   int nLen = 0, eLen = 0;
   int encodingLength = 0;
   int index = 0;
   unsigned char *nBytes = NULL, *eBytes = NULL;
   unsigned char* pEncoding = NULL;
   FILE* pFile = NULL;
   EVP_PKEY *pPubKey = NULL;
   RSA* pRsa = NULL;
   BIO *bio, *b64;

   ERR_load_crypto_strings(); 
   OpenSSL_add_all_algorithms();

   if (argc != 3)
   {
      printf("usage: %s public_key_file_name ssh_key_description\n", argv[0]);
      iRet = 1;
      goto error;
   }

   pFile = fopen(argv[1], "rt");
   if (!pFile)
   {
      printf("Failed to open the given file\n");
      iRet = 2;
      goto error;
   }

   pPubKey = PEM_read_PUBKEY(pFile, NULL, NULL, NULL);
   if (!pPubKey)
   {
      printf("Unable to decode public key from the given file: %s\n", ERR_error_string(ERR_get_error(), NULL));
      iRet = 3;
      goto error;
   }

   if (EVP_PKEY_type(pPubKey->type) != EVP_PKEY_RSA)
   {
      printf("Only RSA public keys are currently supported\n");
      iRet = 4;
      goto error;
   }

   pRsa = EVP_PKEY_get1_RSA(pPubKey);
   if (!pRsa)
   {
      printf("Failed to get RSA public key : %s\n", ERR_error_string(ERR_get_error(), NULL));
      iRet = 5;
      goto error;
   }

   // reading the modulus
   nLen = BN_num_bytes(pRsa->n);
   nBytes = (unsigned char*) malloc(nLen);
   BN_bn2bin(pRsa->n, nBytes);

   // reading the public exponent
   eLen = BN_num_bytes(pRsa->e);
   eBytes = (unsigned char*) malloc(eLen);
   BN_bn2bin(pRsa->e, eBytes);

   encodingLength = 11 + 4 + eLen + 4 + nLen;
   // correct depending on the MSB of e and N
   if (eBytes[0] & 0x80)
      encodingLength++;
   if (nBytes[0] & 0x80)
      encodingLength++;

   pEncoding = (unsigned char*) malloc(encodingLength);
   memcpy(pEncoding, pSshHeader, 11);

   index = SshEncodeBuffer(&pEncoding[11], eLen, eBytes);
   index = SshEncodeBuffer(&pEncoding[11 + index], nLen, nBytes);

   b64 = BIO_new(BIO_f_base64());
   BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
   bio = BIO_new_fp(stdout, BIO_NOCLOSE);
   BIO_printf(bio, "ssh-rsa ");
   bio = BIO_push(b64, bio);
   BIO_write(bio, pEncoding, encodingLength);
   BIO_flush(bio);
   bio = BIO_pop(b64);
   BIO_printf(bio, " %s\n", argv[2]);
   BIO_flush(bio);
   BIO_free_all(bio);
   BIO_free(b64);

error:
   if (pFile)
      fclose(pFile);
   if (pRsa)
      RSA_free(pRsa);
   if (pPubKey)
      EVP_PKEY_free(pPubKey);
   if (nBytes)
      free(nBytes);
   if (eBytes)
      free(eBytes);
   if (pEncoding)
      free(pEncoding);

   EVP_cleanup();
   ERR_free_strings();
   return iRet;
}

2
যদি কেউ এই (আমি ছিল) কীভাবে সংকলন করবেন তা ভাবছেন, এখানে সংকলক কলটি এসেছে: gcc -o pubkey2ssh pubkey2ssh.c -lcrypto
Andreas

কোথায় পাব argv হয় উপর আছে [2] থেকে ... আমি শুধু একটি ----- BEGIN আরএসএ সর্বজনীন কী ----- MIGJAoGBAMC62xWiOZYlhUhmk + + JESy5eZunwGoG9kSHUMn67iBNZLEsR2qN44J1B TOtZRuEsSAKxu7alFlJVu5aSGbUvin3DusYAsl5sZjTf9VZgJHsVycOrtChC1tUi WMAWfv2BLTmK4zBEC33riEBLeX8Trphp3YbIMtzqV81ZrzHZbSnrAgMBAAE = ----- END টি আরএসএ পাবলিক KEY-- আছে (ssh_key_description) --- এর কোনও বিবরণ নেই
ব্র্যাডেন

@braden। সাধারণত এটি চাবির মালিকের ইমেল ঠিকানা। তবে আপনি যা চান তার বর্ণনা দিতে পারেন।
deltamind106

একটি পিএইচপি বাস্তবায়ন এখানে github.com/131/yks/blob/master/class/stds/crypt.php#L346
131

নীচের @ এমকালকোভের উত্তরটি লিনাক্স কমান্ড লাইন সরঞ্জাম ব্যবহার করে রূপান্তর করে। এটির জন্য কেবল শিরোনামগুলি সরানো এবং ইনপুট হিসাবে লাইনগুলিকে একত্রিত করে সার্বজনীন কী পেম ফাইল দরকার।
অ্যালেক্সানড্রয়েড

13
ssh-keygen -i -m PKCS8 -f public-key.pem

3
আমার পক্ষে কাজ করেনি: "do_convers_from_pkcs8: key.pem একটি স্বীকৃত পাবলিক কী ফর্ম্যাট নয়"। কাজটি কী ছিল "ssh-keygen -y -f key.pem" যা ਅਧਿਕਾਰিত_কিজের জন্য প্রয়োজনীয় ssh-rsa পাঠ্য প্রিন্ট করে।
কার্ট

1
এটি কাজ করছে নাdo_convert_from_pkcs8: TEST.pem is not a recognised public key format
জিন্না বালু

আমার পরে openssl genrsa -out newkey.pem 2048এবংopenssl rsa -in newkey.pem -outform PEM -pubout -out newkeypublic.pem
xirix


6

আমি দিয়েছিলাম

ssh-keygen -i -f sh sshkeysfile >> অনুমোদিত_কিজ

ক্রেডিট এখানে যায়


1
আপনি কেন ভিক্টরকে উপরে creditণ দেননি? তিনি আপনাকে প্রায় 8 মাস আগে একই কমান্ডটি দিয়েছিলেন।
jww

1
@jww ভিক্টরের জবাবের সম্পাদনা লগ থেকে আপনি দেখতে পাবেন যে মূলত উত্তরটি কিছুটা আলাদা ছিল, আমি ধরে
নিলাম

4

নিম্নলিখিত স্ক্রিপ্টটি বেস 64-এনকোডড ডিইআর ফর্ম্যাটে ci.jenkins-ci.org পাবলিক কী শংসাপত্রটি গ্রহণ করবে এবং এটিকে একটি ওপেনএসএইচ পাবলিক কী ফাইলে রূপান্তর করবে। এই কোডটি ধরে নিয়েছে যে একটি 2048-বিট আরএসএ কী ব্যবহৃত হয়েছে এবং এই আয়ান বয়ডের উত্তর থেকে অনেকগুলি আঁকবে । আমি জেনকিনস উইকির এই নিবন্ধটিতে মন্তব্যগুলিতে কীভাবে কাজ করে তা আরও কিছুটা ব্যাখ্যা করেছি ।

echo -n "ssh-rsa " > jenkins.pub
curl -sfI https://ci.jenkins-ci.org/ | grep X-Instance-Identity | tr -d \\r | cut -d\  -f2 | base64 -d | dd bs=1 skip=32 count=257 status=none | xxd -p -c257 | sed s/^/00000007\ 7373682d727361\ 00000003\ 010001\ 00000101\ / | xxd -p -r | base64 -w0 >> jenkins.pub
echo >> jenkins.pub

ওএমজি এটিই সেরা উত্তর! এবং এটি কাজ করে! (আমাকে কেবল স্থিতি = কোনওটি স্ট্যাটাস = নক্সফার সহ প্রতিস্থাপন করতে হবে)। "বেস 64৪" দিয়ে শুরু করে কেবল দ্বিতীয় কমান্ডটি ব্যবহার করুন এবং এটির শিরোনামগুলি ছড়িয়ে দেওয়া এবং সমস্ত লাইন এক সাথে সংযুক্ত করে ইনপুটটিতে একটি পিইএম ফাইল দিন। ধন্যবাদ @ এমকালকভ!
আলেকজান্দ্রয়েড

2048-বিট কী ধরে ধরে উপরের কমান্ডগুলি নোট করুন এবং ভিন্ন আকারের একটি কী দেওয়া হলে সঠিকভাবে কাজ করবে না।
আলেকজান্দ্রয়েড

1

FWIW, এই BASH স্ক্রিপ্টটি প্রথম আর্গুমেন্ট হিসাবে একটি PEM- বা DER- ফর্ম্যাট X.509 শংসাপত্র বা ওপেনএসএসএল পাবলিক কী ফাইল (পিইএম ফর্ম্যাট) নেবে এবং একটি ওপেনএসএইচ আরএসএ পাবলিক কী অবজ্ঞা করবে। এটি উপরে @ এমকালকোভের উত্তরে প্রসারিত হয়। আবশ্যকতা হয় cat, grep, tr, dd, xxd, sed, xargs, file, uuidgen, base64, openssl(1.0+), এবং অবশ্যই bashopenssl(অন্তর্ভুক্ত base64) ব্যতীত অন্য যে কোনও আধুনিক লিনাক্স সিস্টেমে বেস ইনস্টলের অংশ হওয়ার গ্যারান্টিযুক্ত, সম্ভবত xxd(যা ফেডোরা vim-commonপ্যাকেজে দেখায় )। যদি কেউ এটিকে পরিষ্কার করে সুন্দর করে তৈরি করতে চান তবে ক্যাভিয়েট প্রভাষক।

#!/bin/bash
#
# Extract a valid SSH format public key from an X509 public certificate.
#

# Variables:
pubFile=$1
fileType="no"
pkEightTypeFile="$pubFile"
tmpFile="/tmp/`uuidgen`-pkEightTypeFile.pk8"

# See if a file was passed:
[ ! -f "$pubFile" ] && echo "Error, bad or no input file $pubFile." && exit 1

# If it is a PEM format X.509 public cert, set $fileType appropriately:
pemCertType="X$(file $pubFile | grep 'PEM certificate')"
[ "$pemCertType" != "X" ] && fileType="PEM"

# If it is an OpenSSL PEM-format PKCS#8-style public key, set $fileType appropriately:
pkEightType="X$(grep -e '-BEGIN PUBLIC KEY-' $pubFile)"
[ "$pkEightType" != "X" ] && fileType="PKCS"

# If this is a file we can't recognise, try to decode a (binary) DER-format X.509 cert:
if [ "$fileType" = "no" ]; then
        openssl x509 -in $pubFile -inform DER -noout
        derResult=$(echo $?)
        [ "$derResult" = "0" ] && fileType="DER"
fi

# Exit if not detected as a file we can use:
[ "$fileType" = "no" ] && echo "Error, input file not of type X.509 public certificate or OpenSSL PKCS#8-style public key (not encrypted)." && exit 1

# Convert the X.509 public cert to an OpenSSL PEM-format PKCS#8-style public key:
if [ "$fileType" = "PEM" -o "$fileType" = "DER" ]; then
        openssl x509 -in $pubFile -inform $fileType -noout -pubkey > $tmpFile
        pkEightTypeFile="$tmpFile"
fi

# Build the string:
# Front matter:
frontString="$(echo -en 'ssh-rsa ')"

# Encoded modulus and exponent, with appropriate pointers:
encodedModulus="$(cat $pkEightTypeFile | grep -v -e "----" | tr -d '\n' | base64 -d | dd bs=1 skip=32 count=257 status=none | xxd -p -c257 | sed s/^/00000007\ 7373682d727361\ 00000003\ 010001\ 00000101\ / | xxd -p -r | base64 -w0 )"

# Add a comment string based on the filename, just to be nice:
commentString=" $(echo $pubFile | xargs basename | sed -e 's/\.crt\|\.cer\|\.pem\|\.pk8\|\.der//')"

# Give the user a string:
echo $frontString $encodedModulus $commentString

# cleanup:
rm -f $tmpFile
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.