অতীতে শেষ-তারিখ সহ স্ব-স্বাক্ষরিত শংসাপত্র তৈরি করুন


24

আমি অতীতে শেষ-তারিখগুলি সহ নির্বিচারে শুরু- এবং শেষ-তারিখগুলি সহ ফ্লাইতে স্ব-স্বাক্ষরিত শংসাপত্রগুলি তৈরি করতে চাই । আমি স্ট্যান্ডার্ড সরঞ্জামগুলি ব্যবহার করতে পছন্দ করব, উদাহরণস্বরূপ, ওপেনএসএসএল, তবে যে কাজটি হয়ে যায় তা দুর্দান্ত হবে।

স্ট্যাক ওভারফ্লো প্রশ্ন এক দিনেরও কম সময়ের সাথে ওপেনসেল শংসাপত্র কীভাবে তৈরি করবেন? অনুরূপ প্রশ্ন জিজ্ঞাসা করে, তবে আমি চাইছি আমার শংসাপত্রটি স্বাক্ষরিত হোক।

আপনি যদি ভাবছিলেন তবে স্বয়ংক্রিয় পরীক্ষার জন্য শংসাপত্রগুলির প্রয়োজন।

উত্তর:


32

অতীতে আপনার শংসাপত্র তৈরির দুটি উপায় রয়েছে। হয় সময় নকল (1) (2), বা শংসাপত্র স্বাক্ষর করার সময় সময় ব্যবধান সংজ্ঞা (3)।

1) প্রথমত: সময়টি নষ্ট করার বিষয়ে: একটি প্রোগ্রামকে এটি সিস্টেম থেকে আলাদা তারিখের দিকে ভাবিয়ে তুলতে, দেখুন libfaketimeএবংfaketime

এটি ডেবিয়ান এ ইনস্টল করতে:

sudo apt-get install faketime

আপনি কমান্ডের faketimeআগে ব্যবহার করবেন openssl

ব্যবহারের উদাহরণের জন্য:

$faketime 'last friday 5 pm' /bin/date
Fri Apr 14 17:00:00 WEST 2017
$faketime '2008-12-24 08:15:42' /bin/date
Wed Dec 24 08:15:42 WET 2008

থেকে man faketime:

প্রদত্ত কমান্ডটি বিশ্বাস করে ট্রিক হবে যে বর্তমান সিস্টেম সময় টাইমস্ট্যাম্পে নির্দিষ্ট করা হয়েছে। প্রাচীর ঘড়ি এই তারিখ এবং সময় থেকে চলতে থাকবে অন্যথায় নির্দিষ্ট না করা (উন্নত বিকল্পগুলি দেখুন)। প্রকৃতপক্ষে, ফেকটাইম লাইবফেকটাইমের জন্য একটি সহজ মোড়ক, যা একটি ছোট লাইব্রেরি লোড করতে LD_PRELOAD প্রক্রিয়া ব্যবহার করে যা টাইম (2) এবং fstat (2) এর মতো সিস্টেমে কলগুলিকে বাধা দেয়।

সুতরাং উদাহরণস্বরূপ, আপনার ক্ষেত্রে, আপনি খুব ভাল 2008 সালের তারিখটি সংজ্ঞায়িত করতে পারেন, এবং তারপরে 2010 সাল পর্যন্ত 2 বছর মেয়াদ সহ একটি শংসাপত্র তৈরি করতে পারেন।

faketime '2008-12-24 08:15:42' openssl ... 

পার্শ্ব নোট হিসাবে, এই ইউটিলিটিটি ম্যাকোস সহ বেশ কয়েকটি ইউনিক্স সংস্করণে যে কোনও ধরণের প্রোগ্রামের (একটি কমান্ড লাইনের সাথে একচেটিয়া নয়) র‌্যাপার হিসাবে ব্যবহার করা যেতে পারে।

স্পষ্টতা হিসাবে, কেবলমাত্র এই পদ্ধতিতে লোড করা বাইনারিগুলি (এবং তাদের শিশুরা) তাদের সময় পরিবর্তন করেছে এবং জাল সময়টি সিস্টেমের বাকী বর্তমান সময়ের প্রভাব ফেলবে না।

2) @ উইজার্ড অনুসারে, আপনার কাছে datefudgeপ্যাকেজটিও রয়েছে যা ব্যবহারে খুব অনুরূপ faketime

পার্থক্য হিসাবে, datefudgeপ্রভাবিত করে না fstat(অর্থাত্ ফাইল সময় তৈরির পরিবর্তন করে না)। এটির নিজস্ব লাইব্রেরি, ডেটফজ.ও রয়েছে যা এটি LD_PRELOAD ব্যবহার করে লোড করে।

এটিতে এমনও একটি জায়গা রয়েছে -s static timeযেখানে অতিরিক্ত অতিরিক্ত সেকেন্ড কেটে গেলেও সময় উল্লেখ করা সর্বদা ফিরে আসে।

$ datefudge --static "2007-04-01 10:23" sh -c "sleep 3; date -R"
Sun, 01 Apr 2007 10:23:00 +0100

3) সময় নকল করার পাশাপাশি আরও সহজভাবে আপনি ওপেনএসএসএল-তে শংসাপত্র স্বাক্ষর করার সময় শংসাপত্রের বৈধতার প্রারম্ভিক এবং শেষের পয়েন্টটিও সংজ্ঞায়িত করতে পারেন ।

আপনার প্রশ্নের সাথে আপনি যে প্রশ্নটি যুক্ত করেছেন তার ভ্রান্ত ধারণাটি হ'ল অনুরোধের সময় (সিএসআর অনুরোধে) শংসাপত্রের বৈধতা সংজ্ঞায়িত হয় না, তবে এটি স্বাক্ষর করার সময়।

openssl caস্ব-স্বাক্ষরিত শংসাপত্র তৈরি করতে ব্যবহার করার সময় বিকল্পগুলি যুক্ত করুন -startdateএবং -enddate

এই দুটি অপশনের তারিখের ফর্ম্যাট openssl/crypto/x509/x509_vfy.c, ওপেনসেল সূত্র অনুসারে , ASN1_TIME ওরফে ASN1UTCTime: ফর্ম্যাটটি অবশ্যই YYMMDDHHMMSSZ বা YYYYMMDDHHMMSSZ হওয়া উচিত।

উদ্ধৃতি openssl/crypto/x509/x509_vfy.c:

int X509_cmp_time(const ASN1_TIME *ctm, time_t *cmp_time)
{
    static const size_t utctime_length = sizeof("YYMMDDHHMMSSZ") - 1;
    static const size_t generalizedtime_length = sizeof("YYYYMMDDHHMMSSZ") - 1;
    ASN1_TIME *asn1_cmp_time = NULL;
    int i, day, sec, ret = 0;

    /*
     * Note that ASN.1 allows much more slack in the time format than RFC5280.
     * In RFC5280, the representation is fixed:
     * UTCTime: YYMMDDHHMMSSZ
     * GeneralizedTime: YYYYMMDDHHMMSSZ
     *
     * We do NOT currently enforce the following RFC 5280 requirement:
     * "CAs conforming to this profile MUST always encode certificate
     *  validity dates through the year 2049 as UTCTime; certificate validity
     *  dates in 2050 or later MUST be encoded as GeneralizedTime."
     */

এবং পরিবর্তন লগ (2038 বাগ?) থেকে - এই পরিবর্তন লগটি কেবল অতিরিক্ত পাদটীকা হিসাবে, কারণ এটি কেবলমাত্র সরাসরি API ব্যবহার করে তাদের উদ্বেগ করে।

1.1.0e এবং 1.1.1 এর মধ্যে পরিবর্তনগুলি [এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স]

*) জেড-এর সাথে পূর্বনির্ধারিত ASN.1 প্রকারগুলি INT32, UINT32, INT64, UINT64 এবং রূপগুলি যুক্ত করুন These এগুলি লং এবং জেডএলং প্রতিস্থাপন এবং আকার নিরাপদ হওয়ার জন্য বোঝানো হয়েছে। লং এবং জেডএলং এর ব্যবহারকে নিরুৎসাহিত করা হয়েছে এবং ওপেনএসএসএল ১.২.০ এ অবমূল্যায়নের জন্য নির্ধারিত হয়েছে।

সুতরাং, ২০০৮ সালের ১ লা জানুয়ারি থেকে ২০১০ সালের জানুয়ারী পর্যন্ত একটি শংসাপত্র তৈরি করা এইভাবে করা যেতে পারে:

openssl ca -config /path/to/myca.conf -in req.csr -out ourdomain.pem \
-startdate 200801010000Z -enddate 201001010000Z

অথবা

openssl ca -config /path/to/myca.conf -in req.csr -out ourdomain.pem \
-startdate 0801010000Z -enddate 1001010000Z

-startdateএবং -enddateদেখা না opensslসূত্র ও পরিবর্তনের লগ; @ গুন্টবার্ট যেমন উল্লেখ করেছে, মূল man opensslপৃষ্ঠায় উপস্থিত না হয়েও তারা এতে উপস্থিত রয়েছে man ca:

-startdate date
       this allows the start date to be explicitly set. The format of the date is
       YYMMDDHHMMSSZ (the same as an ASN1 UTCTime structure).

   -enddate date
       this allows the expiry date to be explicitly set. The format of the date is
       YYMMDDHHMMSSZ (the same as an ASN1 UTCTime structure).

উদ্ধৃতি openssl/CHANGE:

0.9.3 এ এবং 0.9.4 এর মধ্যে পরিবর্তনসমূহ [09 আগস্ট 1999]

*) ফিক্স-স্টার্টেট এবং -অনডেট (যা অনুপস্থিত ছিল) 'সিএ' প্রোগ্রামের পক্ষে যুক্তি।

পিএস আপনি স্ট্যাকএক্সচেঞ্জ থেকে যে প্রশ্নটির উল্লেখ করেছেন তার উত্তর হিসাবে : সাধারণত সিস্টেমের সময় পরিবর্তন করা বিশেষত উত্পাদন ব্যবস্থায় খারাপ ধারণা হয়; এবং এই উত্তরের পদ্ধতিগুলির সাথে ব্যবহার করার সময় আপনাকে মূল সুবিধার দরকার নেই।


1
+1 টি। আমি জানতাম যে আমি যা লিখেছি তার চেয়ে আরও ভাল কিছু নিয়ে আসবেন :)
সেলেদা

2
অনুরূপ একটি প্রোগ্রাম বলা হয় datefudge
উইজার্ড

@ ওয়েজার্ড ধন্যবাদ, প্রকৃতপক্ষে আমি এটি ডেবিয়ায় পেয়েছি; আকর্ষণীয়ভাবে যথেষ্ট, ম্যানুয়ালটিতে বলা হয়েছে যে এটি সময় (২) এর মতো ফাংশনগুলিতে সিস্টেম কলগুলিকে পরিবর্তন করেও এটি fstat (2) কে প্রভাবিত করে না।
রুই এফ রিবেইরো

1
উভয়ই faketimeএবং datefudgeআমার ডেবিয়ান জেসি সিস্টেমে খুব সুন্দরভাবে কাজ করে।
rlandster

1
ওটিওএইচ: এই তারিখগুলি কোথায় সেট করবেন তা সন্ধানের জন্য +5 !
গুন্টবার্ট

8

আমি প্রায় অবাক হয়েছি যে সুস্পষ্ট জিনিসটি কাজ করে: যেখানে opensslএকটি যুক্তি হিসাবে শংসাপত্রটি বৈধ হওয়া উচিত যে দিনগুলি গ্রহণ করে, কেবল একটি নেতিবাচক সংখ্যা সরবরাহ করুন!

openssl req -x509 -newkey rsa:4096 \
    -keyout key.pem -out cert.pem -days -365

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


ভাল, সত্যি বলতে কি, আপনি নেতিবাচক দিনগুলি ব্যবহার করতে পারেন তা আমার কোনও ধারণা ছিল না।
রুই এফ রিবেইরো

আপনি কি শুরুর তারিখ নির্দিষ্ট করতে পারবেন না?
ফ্রিসফটওয়্যার সার্ভার 21

@ ফ্রিসফটওয়্যারস সার্ভারস সিএসআরে আপনি পারবেন না; আমার উত্তরের শেষ অংশটি দেখুন
রুই এফ রিবেইরো

আরও আন্তঃস্মরণীয়ভাবে এখনও, কোড বার্ফ এমন শংসাপত্রটি খুঁজে পাবে না? বিটিডব্লিউ, আমি আমার উত্তরটি প্রসারিত করেছি
রুই এফ রিবেইরো

3

অথবা আপনি এই অল্প অজগর প্রোগ্রামের মতো কিছু ব্যবহার করতে পারেন ... (সাবধানতা প্রয়োগ করা হবে)

এটি অতীতের 10 বছর (-10 * 365 * 24 * 60 * 60 সেকেন্ড -10 বছর) এবং মেয়াদোত্তীর্ণ সময় 5 বছর অতীতে প্রারম্ভকালীন সময়ের সাথে একটি কী (টেস্ট.কি) এবং একটি শংসাপত্র (test.crt) তৈরি করে (-5 * 365 * 24 * 60 * 60)।

দয়া করে মনে রাখবেন এটি একটি ন্যূনতম প্রদর্শনের প্রোগ্রাম, সুতরাং এটি কোনও এক্সটেনশান সেট করতে বিরক্ত করে না (যেমন বেসিক কনট্রেনটস) এবং স্থির সিরিয়াল ব্যবহার করে।

#!/usr/bin/env python

from OpenSSL import crypto

key = crypto.PKey()
key.generate_key(crypto.TYPE_RSA, 2048)
cert = crypto.X509()
cert.get_subject().CN = "Test"
cert.set_serial_number(666)
cert.gmtime_adj_notBefore(-10*365*24*60*60)
cert.gmtime_adj_notAfter(-5*365*24*60*60)
cert.set_issuer(cert.get_subject())
cert.set_pubkey(key)
cert.sign(key, 'sha384')

open("test.crt", "wb").write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))
open("test.key", "wb").write(crypto.dump_privatekey(crypto.FILETYPE_PEM, key))

কোডটিতে প্রয়োজনীয় X.509 মানক ক্ষেত্র নেই বলে মনে হচ্ছে।
রুই এফ রিবেইরো

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