如何生成有效期少于一天的openssl证书?

44

我正在尝试在Linux中使用以下OpenSSL命令创建由CA签名的终端实体证书:

# openssl genrsa -des3 -out clientkey.pem 2048
# openssl req -new -key clientkey.pem -out clientcert.csr
# cp clientkey.pem clientkey.pem.org
# openssl rsa -in clientkey.pem.org -out clientkey.pem
# openssl x509 -req -days 1 -in clientcert.csr -out clientcert.pem -CA cacert.pem -CAkey cakey.pem -CAcreateserial

是否可以指定以小时为单位的过期时间,而不是天数?我需要生成具有1小时过期时间的证书进行一些测试。

Openssl命令似乎支持一些选项来指定开始日期和结束日期,但我无法弄清如何使用它。(我假设enddate可能支持指定日期和时间)。

#openssl x509 -req -startdate 120814050000Z -enddate 120814060000Z -in clientcert.csr -out clientcert.pem -CA cacert.pem -CAkey cakey.pem -CAcreateserial

unknown option 120814050000Z
usage: x509 args
.
.
-startdate      - notBefore field
-enddate        - notAfter field
.
.
-days arg       - How long till expiry of a signed certificate - def 30 days

2
答案解决了你的问题吗?如果是,你应该尝试将这个问题标记为“已回答”。 - James Selvakumar
5个回答

44

x509命令的-startdate和-enddate选项是显示选项。您可以使用ca命令设置特定的开始和结束时间来签署证书。

尝试这样做:

openssl ca -config /etc/openssl.cnf -policy policy_anything -out clientcert.pem -startdate 120815080000Z -enddate 120815090000Z -cert ca.pem -keyfile cakey.pem -infiles clientcert.csr

我成功地将起始日期和结束日期设定为过去的值,也可以正常工作。 - arcain
6
我找不到任何方法使这个命令工作而不需要一个巨大、正确构建的openssl.cnf文件。这似乎很荒谬,因为如果我不需要覆盖日期,我可以使用简单的x509命令。有没有办法在不使用配置文件的情况下使其工作? - Max
那应该是被接受的解决方案。 - Tobias von Falkenhayn

19

第一步: 安装faketime

sudo apt-get install faketime

步骤二。 在当前日期前一天生成过期的证书。

faketime 'last friday 5 pm' /bin/bash -c 'openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 6 -nodes'

步骤三 验证证书有效期日期

$ openssl x509 -noout -text -in cert.pem
Certificate
    Data:
        Version: 3 (0x2)
        Serial Number: 10001009279078968790 (0x8acab8f3a2e32dd6)
    Signature Algoritm: sha256WithRsaEncryption
        Issuer: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd
        Validity:
            Not Before: May 15 17:00:03 2020 GMT
            Not After : May 21 17:00:03 2020 GMT
        Subject: C=AU, ST=Some-State, Internet Widgits Pty Ltd
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
...

4
请不要使用图像来提供信息,如果可以使用文本,请使用文本。 - Kalle Richter
1
太棒了!我成功创建了一个过期的证书用于测试!谢谢。 - Prasath Rajan

7

这里有另一种我发现可行的方法:

比如说我想测试我的证书在10分钟后过期

当前日期是2月17日
当前时间是下午4:40

首先我将系统日期设置为前一天:2月16日
然后将系统时钟调整到10分钟后:下午4:50

我使用openssl x509来创建证书,使其在1天后过期,实际上意味着在今天 2月17日 过期。

openssl x509 -req -days 1 -in clientcert.csr -signkey cert.key -out ssl.crt

我随后重置了系统时钟和时间到实际日期和时间,一切就完成了!你现在有一个将在10分钟内过期的证书!

显然这不是正规操作方式,但它非常简单易行,适用于创建用于开发的自签名证书。

24
调整时钟是一种糟糕的做法。想象一下你的脚本在服务器上运行 - 移动时间会导致事情混乱。 - mafonya
4
调整应用程序时间的另一种选择是使用faketime,如此处所述:https://unix.stackexchange.com/questions/359225/create-self-signed-certificate-with-end-date-in-the-past,也许可以尝试? - Trevor McCasland
1
这是一种糟糕的做法,但如果您需要生成一些一次性过期证书,那么这也比下面给出的“正确”答案容易1000倍左右。 - Max
这种做法是有时有地儿是恰当的。回答应该明确指出,在任何CI/CD或其他过程中运行的脚本中都不应包含此类操作。更改本地系统上的日期和时间需要手动完成,然后再改回来(或在您设置的任何计划下与时间服务器同步)。我有一个场景,需要一个已过期的自签名证书通过我的单元测试。这种方法意味着我今天就可以完成,而不是将到期日期设为1天, 然后等待2天进行测试。 - Tone
我喜欢这种方法,除了我会创建一个新的虚拟机,在虚拟机内部更改时钟,从虚拟机内发出我的证书,然后销毁虚拟机。其他时候,我也会考虑使用 faketime 作为替代方案。 - John

4
尝试使用 gossl,它允许以不同的时间单位指定证书有效性的开始日期和持续时间。
我开发了这个工具来解决命令行openssl的限制。该工具是轻量级的,使用Go实现,没有依赖性,并且在MIT许可下发布。

那个链接不再带我到软件包。这是同样的软件吗?https://github.com/yakuter/gossl - undefined

-5

您可以将 -days 选项设置为 0:

openssl x509 -req -days 0 -in clientcert.csr -signkey cert.key -out ssl.crt

这将创建一个证书,其中notBeforenotAfter等于当前时间(即您的证书将立即过期)。


14
这个不起作用,当我尝试时,出现了一个错误,说“req: Non-positive number "0" for -days”。 - Kredns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接