কীভাবে একটি পিইএম ফাইল বিভক্ত করবেন


37

দ্রষ্টব্য: এটি আসলে কোনও প্রশ্ন নয় কারণ আমি ইতিমধ্যে উত্তরটি খুঁজে পেয়েছি তবে যেহেতু আমি এখানে এটি সহজে খুঁজে পাইনি আমি এটি পোস্ট করব যাতে এটি অন্যের উপকার করতে পারে।

প্রশ্ন: অ্যাপাচি / মোড_এসএসএল নির্দেশিকা এসএসএলসিএরসিটিফিট ফাইল দ্বারা ব্যবহৃত কনট্যাকেটেড পিএম ফাইলটি কীভাবে পড়বেন ?

উত্তর (মূল) ( উত্স ):

cat $file|awk 'split_after==1{n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print > "cert" n ".pem"}'

শেষে যদি ফাঁকা লাইন থাকে তবে এটি খালি ফাইলটি ছেড়ে দিতে পারে openssl pkcs7 -outform PEM -in my-chain-file -print_certs। এটি রোধ করতে, প্রিন্ট করার আগে লাইনের দৈর্ঘ্য পরীক্ষা করুন:

cat $file|awk 'split_after==1{n++;split_after=0}
   /-----END CERTIFICATE-----/ {split_after=1}
   {if(length($0) > 0) print > "cert" n ".pem"}' 

উত্তর 29/03/2016 :

স্লাগচিউয়ার উত্তর অনুসরণ করা , এর csplitসাথে আরও পরিষ্কার বিকল্প হতে পারে:

csplit -f cert- $file '/-----BEGIN CERTIFICATE-----/' '{*}'

এটি বোবা প্রশ্ন হতে পারে, তবে কেন আমার পেম ফাইলটি বিভক্ত করা দরকার?
আশ্বানি আগরওয়াল

6
@ আশওয়ানি আগরওয়াল আপনি যখন কোনও পিইএম ফাইল বিভক্ত করতে চান যখন এতে বেশ কয়েকটি শংসাপত্র থাকে এবং আপনি বিশদ opensslবিশ্লেষণের জন্য একটি শংসাপত্রের মতো সরঞ্জামগুলির সাথে স্বতন্ত্রভাবে শংসাপত্রগুলি পরীক্ষা করতে চান ।
Law29

অধিকন্তু, কিছু সরঞ্জাম বা সার্ভারগুলি সার্ট এবং কী সহ একটি সংযুক্ত ফাইল চায়, অন্যরা তাদের আলাদা করতে চায়।
ক্যাপচার্যাগ

খালি ফাইলটি রোধ করার জন্য আমাকে সিএসপি্লিট কমান্ড লাইনে '% ----- শুরু করবো সার্টিফিকেট -----%' যুক্ত করতে হয়েছিল। ম্যান পৃষ্ঠাটি যা সুনির্দিষ্ট করে তা মিলছে বলে মনে হচ্ছে: csplit -f ./tmp/cert- 'ফাইল'% ----- শুরু করুন শংসাপত্র -----% '' / ----- শুরু করুন শংসাপত্র ----- / '' {*} '
ক্রেগ হিকস

2
খালি ফাইল না রেখে "csplit -z" ব্যবহার করুন।
পল এম

উত্তর:


23

আরজিক স্নিপেট বিভিন্ন অংশগুলি বের করার জন্য কাজ করে তবে আপনার এখনও কোন বিভাগটি কী / সার্ট / চেইন তা জানতে হবে। আমার একটি নির্দিষ্ট বিভাগ বের করার দরকার ছিল এবং এটি ওপেনএসএসএল মেলিংলিস্টে পেয়েছি: http://openssl.6102.n7.nabble.com/Convers-pem-to-crt-and-key-files-tp47681p47697.html

# Extract key
openssl pkey -in foo.pem -out foo-key.pem

# Extract all the certs
openssl crl2pkcs7 -nocrl -certfile foo.pem |
  openssl pkcs7 -print_certs -out foo-certs.pem

# Extract the textually first cert as DER
openssl x509 -in foo.pem -outform DER -out first-cert.der

চমৎকার কমান্ড সেট :) আমি এটি ভবিষ্যতের ব্যবহারের জন্য রাখব, তবে উপরে আমার ব্যবহারের ক্ষেত্রে, আমি কেবলমাত্র 50+ সিএ সার্টস ==> কোনও পিকে বা চেইন নেই এমন একটি সার্টি-ফাইল ফাইল নিয়ে কাজ করছি
Cerber

2
আমি মনে করি এটি অ্যাডক সমাধানের চেয়েও উন্নত, ওপেনসেলকে পার্সিং করতে দিন + আপনি রূপান্তরটি পান।
মরিচা

আমি দুঃখিত তবে কেবল পিকে আদেশটি সঠিক is দ্বিতীয় এবং তৃতীয় আপনার বিজ্ঞাপনটি করবেন না - তারা অন্য কিছু করে। কিছু ক্ষেত্রে ফলাফল ভাল হয় এটি গ্রাহকদের মধ্যে রহস্যজনক আচরণ তৈরি করতে পারে। কিছুটা সম্পাদনা করেছেন।
kubanczyk

এইভাবে পাঠ্যগতভাবে তৃতীয় শংসাপত্র পাওয়ার কীভাবে কোনও ধারণা?
ফ্লিকফার্লি

15

এর আগে স্ট্যাকওভারফ্লোতে উত্তর দেওয়া হয়েছিল :

awk '
  split_after == 1 {n++;split_after=0}
  /-----END CERTIFICATE-----/ {split_after=1}
  {print > "cert" n ".pem"}' < $file

29/03/2016 সম্পাদনা করুন : @ স্লাগচিউয়ার উত্তর দেখুন


শুধুমাত্র লিনাক্সে কাজ করে, ফ্রিবিএসডি-তে ব্যর্থ হয়।
মাইকেল-ও

3
এর দ্বারা অনুপ্রাণিত হয়ে আমি একটি জড়িত স্ক্রিপ্ট তৈরি করেছি যা শংসাপত্রগুলি
জিনকো

15

splitকমান্ড সবচেয়ে সিস্টেমে উপলব্ধ, এবং তার আবাহন সম্ভবত সহজ মনে রাখা হয়।

আপনার যদি এমন কোনও ফাইল থাকে collection.pemযা আপনি individual-*ফাইলগুলিতে বিভক্ত করতে চান তবে ব্যবহার করুন:

split -p "-----BEGIN CERTIFICATE-----" collection.pem individual-

আপনার না থাকলে splitআপনি চেষ্টা করতে পারেন csplit:

csplit -f individual- collection.pem '/-----BEGIN CERTIFICATE-----/' '{*}'

2
দুঃখিত, আমার সিস্টেমে কোনওটিই -p( ব্যস্তবক্স, ফেডোরা, সেন্টো) বিভাজনে কোনও বিকল্প দেখায় না ( যে ম্যানপেজগুলি আমি পড়ি না )। হতে পারে আপনি একটি বিশেষ বাইনারি / প্যাকেজ ব্যবহার করছেন
সারবার

1
@ সার্বার এর csplitপরিবর্তে চেষ্টা করতে পারেন ... (উপরে সম্পাদনা দেখুন)
স্কুইডপিকলস

1
সঙ্গে কাজ করে ভাল csplit!
সারবার

ফ্রিবিএসডি-তে আমি সিএসপ্লিট থেকে পেয়েছি: csplit: *}: bad repetition count(তবে বিভাজনটি কাজ করে বলে মনে হচ্ছে)
গুইনেথ

4

যদি আপনি একটি বহু-শংসাপত্র PEM বান্ডেল থেকে একটি একক শংসাপত্র পেতে চান, চেষ্টা করুন:

$ openssl crl2pkcs7 -nocrl -certfile INPUT.PEM | \
    openssl pkcs7 -print_certs | \
    awk '/subject.*CN=host.domain.com/,/END CERTIFICATE/'
  • প্রথম দুটি opensslকমান্ড একটি পিইএম ফাইল প্রক্রিয়া করবে এবং প্রতিটি সির্টের আগে প্রাক-পেনডেড "subject:"এবং "issuer:"লাইনগুলির সাথে এটিকে আবার স্পিট করবে । যদি আপনার পিইএম ইতিমধ্যে এইভাবে ফর্ম্যাট করা থাকে তবে আপনার চূড়ান্ত awkকমান্ডটি দরকার।
  • Awk কমান্ডটি সিএন (সাধারণ নাম) স্ট্রিংয়ের সাথে মিলে থাকা পৃথক পিইএম আউটপুট করবে।

উত্স 1 , উত্স 2


আমি আপনার উত্স এ দেখতে পাচ্ছি না। পাশেই, পিইএম বেস 64 এনকোডযুক্ত আপনি "সাবজেক্ট", "সিএন", ... এর মতো টেক্সট পাবেন না
জড়

1
হ্যাঁ, এটি প্রতিটি ধরণের পিইএমের জন্য কাজ করে না। যদি আপনি ওপেনসেল ব্যবহার করে পিইএম-তে কোনও P7B নিষ্কাশন করেন তবে এতে প্রতিটি শংসাপত্রের আগে তালিকাভুক্ত বিষয়বস্তু থাকবে। অথবা আপনি যে কোনও স্ট্রিং দিয়ে নিজের PEM ফাইলটি সেগমেন্টে পরিবর্তন করতে পারেন।
সেমিসিগিন্টি

যখন পিইএম "সাবজেক্ট" না থাকে তখন হ্যান্ডেল করার আপডেট হওয়া উত্তর
সে.এম.সিগিন্টি

3

এছাড়াও লক্ষণীয় যে পিইএম ফাইলগুলি কেবলমাত্র BEGIN/ ENDব্লকের অভ্যন্তরে কী / শংসাপত্রের সংকলন , সুতরাং এটি কেবল দুটি বা আকর্ষণীয় সত্তা সহ একটি একক ফাইল যদি কাটা / পেস্ট করা খুব সহজ ...


2

যদি আপনি পূর্ণ শৃঙ্খলা শংসাপত্রগুলি হ্যান্ডেল করে থাকেন (যেমন লেটেনক্রিপ্ট / সার্টবোট ইত্যাদি দ্বারা উত্পন্ন), যা শংসাপত্রের শিরোনাম এবং শংসাপত্র কর্তৃপক্ষ চেইনের, তবে আপনি ব্যাশ স্ট্রিং ম্যানিপুলেশন ব্যবহার করতে পারেন।

উদাহরণ স্বরূপ:

# content of /path/to/fullchain.pem
-----BEGIN CERTIFICATE-----
some long base64 string containing
the certificate
-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----
another base64 string
containing the first certificate
in the authority chain
-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----
another base64 string
containing the second certificate
in the authority chain
(there might be more...)
-----END CERTIFICATE-----

শংসাপত্র এবং শংসাপত্র কর্তৃপক্ষ চেইনগুলিকে ভেরিয়েবলগুলিতে বের করতে:

# load the certificate into a variable
FULLCHAIN=$(</path/to/fullchain.pem)
CERTIFICATE="${FULLCHAIN%%-----END CERTIFICATE-----*}-----END CERTIFICATE-----"
CHAIN=$(echo -e "${FULLCHAIN#*-----END CERTIFICATE-----}" | sed '/./,$!d')

ব্যাখ্যা:

অ্যাজক বা ওপেনসেল ব্যবহার করার পরিবর্তে (যা শক্তিশালী সরঞ্জাম তবে সর্বদা উপলভ্য নয়, যেমন ডকার আল্পাইন চিত্রগুলিতে), আপনি ব্যাশ স্ট্রিং ম্যানিপুলেশন ব্যবহার করতে পারেন।

"${FULLCHAIN%%-----END CERTIFICATE-----*}-----END CERTIFICATE-----": ফুলচাইনের সামগ্রীর শেষে, দীর্ঘতম সাবস্ট্রিং ম্যাচটি ফিরে আসুন, তারপরে -----END CERTIFICATE-----এটি ছিটকে যাওয়ার সাথে সাথে কনক্যাট করুন । এর *পরে সমস্ত চরিত্রের সাথে মেলে -----END CERTIFICATE-----

$(echo -e "${FULLCHAIN#*-----END CERTIFICATE-----}" | sed '/./,$!d'): ফুলচাইনের সামগ্রীর শুরু থেকে, সংক্ষিপ্ততম স্ট্রিংয়ের ম্যাচটি ফিরিয়ে দিন, তারপরে নতুন লাইনগুলিকে অগ্রাহ্য করুন। একইভাবে, এর *আগে সমস্ত চরিত্রের সাথে মেলে -----END CERTIFICATE-----

একটি দ্রুত রেফারেন্সের জন্য (আপনি এখানে বাশে স্ট্রিং ম্যানিপুলেশন সম্পর্কে আরও জানতে পারেন ):

${VAR#substring}= ভিএআর এর সামগ্রীর শুরু থেকে সংক্ষিপ্ততম স্ট্রিং

${VAR%substring}= ভিএআর এর সামগ্রীর শেষে থেকে সংক্ষিপ্ততম স্ট্রিং

${VAR##substring}= ভিএআর এর সামগ্রীর শুরু থেকে দীর্ঘতম স্ট্রিং

${VAR%%substring}= ভিএআর এর সামগ্রীর শেষে থেকে দীর্ঘতম স্ট্রাস্টিং


কম বাশ সজ্ঞানের জন্য, আপনি যখন এই পরিবর্তনগুলি প্রতিধ্বনিত করেন তখন লাইনটি সংরক্ষণের জন্য ভেরিয়েবলকে চারপাশে ঘিরে ফেলুন আপনি যেভাবে দেখছেন সেভাবে তার বিরতি ঘটবে। আমার মনে আছে যখন এটি আমার কাছে এতটা স্পষ্ট ছিল না। ফ্যাবিও, বাশ স্ট্রিংয়ের কারসাজির মিষ্টি ব্যবহার!
ফ্লিকফার্লি

0

হুমম ... প্রায় একইভাবে আমি সমাধানটি প্রস্তুত করেছি (প্রস্তাবিত ওয়াই @ সার্বার হিসাবে) এই পরিস্থিতিটি বহু লোকের মনে হচ্ছে না। আমার সমাধান প্রায় একই যুক্তি অনুসরণ করে তবে আরও কয়েকটি বেসিক কমান্ড ব্যবহার করে:

আমার সমস্ত শংসাপত্রগুলি ফাইলে রয়েছে: certin.pem

c=0
while read line
  do
    if echo $line | grep END; then
    echo $line >> certout$c.pem
    c=`expr $c + 1`
    else
     echo $line
     echo $line >> certout$c.pem
    fi
done < /tmp/certin.pem

এটি মূলত "END" এর মুখোমুখি হওয়া অবধি কোনও ফাইলে লিখতে থাকে এবং তারপরে বর্ধিত উপায়ে অন্য কোনও ফাইলে লেখা শুরু করে। আপনার ইনপুট পেম ফাইলটিতে ( সার্টিটিন.পিএম ) কতগুলি শংসাপত্র রয়েছে তার উপর নির্ভর করে আপনার কাছে "এন" সংখ্যার আউটপুট ফাইল থাকবে ( certout0.pem, certout1.pem এবং তাই ..) ফাইল ।

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