web-dev-qa-db-ja.com

証明書リクエストの作成時に「Not Before」の値を過去に設定する方法

現場には多くの組み込みTLSクライアントがあります。 TLSサーバーは認証される必要があります。

長時間の電源切断はこれらのデバイスのクロックをリセットする可能性があるため、有効期間が19700101000001Zから99991231235959Zの証明書を使用する必要があります。

opensslを使用して、このような有効期間の証明書要求を作成する方法は?

私は-days期間を設定するためのオプション、それだけでは十分ではありません。

15
SKi

「99991231235959Z」の有効期間が終了すると、「エポック」(1970年1月1日、00:00 UTC)以降の日付符号付き32ビット整数。この内部表現は 2038年1月 で失敗します。その運命の日付を超える有効期間を設定すると、一部の実装によって証明書が拒否される可能性があります。

また、長時間の電源切断が原因でデバイスのクロックがリセットされたのを目にした場合、ランダムな日付にリセットされないと思います。 「デフォルト」の日付にリセットされます。証明書の有効期間は8000年をカバーする必要はありませんが、現在の日(クロックが適切に調整されているデバイスの場合)と、電力が失われたときにクロックがリセットされるデフォルト値の前後の日数だけです。有効期間を1970年から2037年の範囲に設定すると、すべてのケースがカバーされ、内部表現(特定の実装で使用される場合)が32ビットの符号付き算術が適切な範囲に維持されます。

デバイスに正確なクロックがない場合、 [〜#を強制しない限り、信頼できるrevocationサポートが提供されないことに注意してください。 〜] ocsp [〜#〜] クライアントノンスを使用。


つまり、有効期間は 証明書リクエストではありません部分です。期間は、CAによって証明書が発行されたときに選択されます。

OpenSSLコマンドラインツール は、主にデバッグ用に設計されていますが、非常に大まかなCAとして使用できます。そのツールは「コマンド」を提供し、そのうちの2つはX-509証明書 x509 および req を作成できます。どちらも、-daysオプションである、有効期間を調整するための1つのオプションのみを提供します。 ソースコード を見ると、これは非常にはっきりとわかります。 apps/x509.c内:

            if ((x=X509_new()) == NULL) goto end;

            if (sno == NULL)
                    {
                    sno = ASN1_INTEGER_new();
                    if (!sno || !Rand_serial(NULL, sno))
                            goto end;
                    if (!X509_set_serialNumber(x, sno))
                            goto end;
                    ASN1_INTEGER_free(sno);
                    sno = NULL;
                    }
            else if (!X509_set_serialNumber(x, sno))
                    goto end;

            if (!X509_set_issuer_name(x,req->req_info->subject)) goto end;
            if (!X509_set_subject_name(x,req->req_info->subject)) goto end;

            X509_gmtime_adj(X509_get_notBefore(x),0);
            X509_time_adj_ex(X509_get_notAfter(x),days, 0, NULL);

このコードスニペットに示されているように、新しいX.509証明書構造が作成されます(および有効期間の開始と終了のデフォルトが現在の日付になります)。コードの最後の2行は、daysパラメーターを使用して有効期間を調整し、それ以外は何もしません

したがって、有効期間を任意の日付に調整する場合は、2つの可能性があります。

  • コンピューターの現在の日付を、使用したい開始日に設定します。これにより、opensslは、私たちが1970年代の初めにいると信じています。 -daysを24000程度に設定します。これはひどいハックで、ディスコ以前のコンピュータの時計を戻すのは難しいかもしれません(最新のコンピュータは [〜#〜] ntp [〜#〜] で自動的に時計を設定します)、そして、物事が壊れる可能性があります(例えば、クロックが2000年より前の場合、MacOS X 10.5コンピュータはWiFiに接続できません)。

  • コマンドラインツールとしてではなく、ライブラリとしてOpenSSLを使用して、プログラムで証明書を発行します(代替:OpenSSLソースコードを変更して、x509および/に必要なコマンドラインオプションを含めますまたはreq)。

13
Thomas Pornin

Thomas Porninが言ったように、証明書要求には日付が含まれていません。notBeforeおよびnotAfterの日付は、CAによって新しい証明書が作成(署名)されるときに設定されます。

openssl caツールを使用する場合は、-startdate dateおよび-enddate dateコマンドラインオプションを使用するか、default_startdateセクションのdefault_enddateおよび[ca]を使用して設定できます。設定ファイルの。

8
Hubert Kario