अतीत में अंतिम तिथि के साथ स्व-हस्ताक्षरित प्रमाण पत्र बनाएं


24

मैं मनमाने ढंग से प्रारंभ और अंतिम-तिथियों सहित अंत की तारीख, फिरते स्व-हस्ताक्षरित प्रमाण पत्र बनाने के लिए चाहते हैं अतीत । मैं मानक उपकरण, जैसे, ओपनएसएसएल का उपयोग करना पसंद करूंगा, लेकिन कुछ भी जो काम करता है वह बहुत अच्छा होगा।

स्टैक ओवरफ्लो प्रश्न एक दिन से कम समय की समाप्ति के साथ ओपनसेल प्रमाणपत्र कैसे उत्पन्न करें? एक समान प्रश्न पूछता है, लेकिन मैं चाहता हूं कि मेरा प्रमाण पत्र स्व-हस्ताक्षरित हो।

यदि आप सोच रहे थे, तो स्वचालित परीक्षण के लिए प्रमाण पत्र आवश्यक हैं।

जवाबों:


32

आपके पास अतीत में प्रमाण पत्र बनाने के दो तरीके हैं। प्रमाण पत्र (3) पर हस्ताक्षर करते समय या तो समय (1) (2), या समय अंतराल को परिभाषित करना।

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) जैसा कि @Wyzard बताता है, आपके पास वह datefudgeपैकेज भी है जो उपयोग में बहुत समान है faketime

अंतर के रूप में, datefudgeप्रभावित नहीं करता है fstat(यानी फ़ाइल समय निर्माण नहीं बदलता है)। इसका स्वयं का पुस्तकालय, datefudge.so भी है, जो 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 या YYYYMMDDHMMSSZ होना चाहिए।

उद्धरण 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."
     */

और CHANGE लॉग (2038 बग?) से - यह परिवर्तन लॉग केवल एक अतिरिक्त फ़ुटनोट के रूप में है, क्योंकि यह केवल API का उपयोग करने वालों को चिंतित करता है।

1.1.0e और 1.1.1 के बीच परिवर्तन [xx XXX xxxx]

*) ASN.1 प्रकार INT32, UINT32, INT64, UINT64 और Z के साथ उपसर्ग जोड़ें। ये LONG और ZLONG को बदलने और आकार के सुरक्षित होने के लिए हैं। लोंग और ज़्लॉन्ग का उपयोग हतोत्साहित किया जाता है और ओपनएसएसएल 1.2.0 में वंचित करने के लिए निर्धारित है।

इसलिए, 1 जनवरी 2008 से 1 जनवरी 2010 तक 1 प्रमाण पत्र बनाना, निम्नानुसार किया जा सकता है:

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; जैसा कि @guntbert ने उल्लेख किया है, जबकि वे मुख्य 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.3a और 0.9.4 के बीच परिवर्तन [09 अगस्त 1999]

*) फिक्स -स्टार्टडेट और -डेटडेट (जो गायब था) 'सीए' प्रोग्राम के लिए तर्क।

पुनश्च के रूप में के चुने हुए जवाब के लिए सवाल आप StackExchange से संदर्भ: यह आम तौर पर एक है बुरा विचार विशेष रूप से उत्पादन प्रणालियों में, सिस्टम का समय बदलने के लिए; और इस उत्तर में विधियों के साथ आपको उपयोग करते समय रूट विशेषाधिकारों की आवश्यकता नहीं है।


1
+1। मुझे पता था कि किसी ने मेरे लिखे से बेहतर कुछ के साथ आएगा :)
सेलाडा

2
इसी तरह का एक कार्यक्रम भी कहा जाता है datefudge
वायज़ार्ड

@Wyzard धन्यवाद, वास्तव में मैंने इसे डेबियन में पाया; दिलचस्प रूप से पर्याप्त है, मैनुअल कहता है कि जबकि यह समय (2) जैसे फ़ंक्शन के लिए सिस्टम कॉल भी बदलता है, यह fstat (2) को प्रभावित नहीं करता है।
रुई एफ रिबेरो

1
दोनों faketimeऔर datefudgeमेरे डेबियन जेसी सिस्टम पर खूबसूरती से काम करते हैं।
रैलस्टार

1
OTOH: +5 यह जानने के लिए कि उन तिथियों को कहाँ सेट करना है!
गुंटबर्ट

8

मुझे यह जानकर लगभग आश्चर्य हुआ कि स्पष्ट बात काम करती है: जबकि opensslतर्क के रूप में उन दिनों की संख्या होती है जिनके लिए प्रमाण पत्र मान्य होना चाहिए, बस एक नकारात्मक संख्या की आपूर्ति करें!

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

ध्यान दें कि यह वास्तव में कुछ बहुत ही अजीब परिणाम देता है: एक प्रमाण पत्र जिसकी समाप्ति टाइमस्टैम्प इसकी शुरुआत-वैधता टाइमस्टैम्प से पहले होती है । मैं वास्तव में अनुशंसा नहीं करता कि आप इसे अपने स्वचालित परीक्षण के लिए उपयोग करें, क्योंकि यह अजीब है। आप शायद स्टार्ट-ऑफ-वैधता टाइमस्टैम्प के साथ-साथ बैक-डेट करने का एक तरीका चाहते हैं।


ठीक है, निष्पक्ष होने के लिए, मुझे नहीं पता था कि आप नकारात्मक दिनों का उपयोग कर सकते हैं।
रुई एफ रिबेरो

क्या आप प्रारंभ तिथि निर्दिष्ट नहीं कर सकते?
FreeSoftwareServers

@FreeSoftwareServers CSR में आप नहीं कर सकते हैं; मेरे उत्तर का अंतिम भाग देखें।
रुई एफ रिबेरो

अधिक अंतर-रूप से अभी तक, इस तरह के प्रमाण पत्र को खोजने के लिए कोड बारफ नहीं होगा? btw, मैंने अपने जवाब का विस्तार किया
रुई एफ रिबेरो

3

या आप इस छोटे अजगर कार्यक्रम की तरह कुछ का उपयोग कर सकते हैं ... (caveats लागू)

यह एक कुंजी (test.key) और एक प्रमाण पत्र (test.crt) बनाता है जिसमें स्थापना के समय के 10 वर्ष पूर्व के समय में (-10 * 365 * 24 * 60 * 60 सेकंड में -10 वर्ष होते हैं) और समाप्ति के समय में 5 वर्ष। (-5 * 365 * 24 * 60 * 60)।

कृपया ध्यान दें कि यह एक न्यूनतम प्रदर्शन कार्यक्रम है, इसलिए यह किसी भी एक्सटेंशन को सेट करने के लिए परेशान नहीं करता है, (जैसे basicConstraints) और आवश्यक सीरियल का उपयोग करता है।

#!/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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.