Openssl 为什么签名证书需要“-CAcreateserial”参数?

Openssl 为什么签名证书需要“-CAcreateserial”参数?,openssl,ssl-certificate,Openssl,Ssl Certificate,比如说, opensslx509\ -请求-sha256\ -“365”天\ -CAcreateserial\ -CA“CA.crt”-CAkey“CA.key”-passin“pass:abcd”\ -在“csr.csr”-extfile“ext.ext”中\ -输出“c.crt”` 它还创建一个文件ca.srl,其中包含已签名证书的序列号 如果缺少-CAcreateserial参数并输出错误,则上述操作将不起作用: /test/ca.srl: No such file or directo

比如说,

opensslx509\
-请求-sha256\
-“365”天\
-CAcreateserial\
-CA“CA.crt”-CAkey“CA.key”-passin“pass:abcd”\
-在“csr.csr”-extfile“ext.ext”中\
-输出“c.crt”`
它还创建一个文件
ca.srl
,其中包含已签名证书的序列号

如果缺少
-CAcreateserial
参数并输出错误,则上述操作将不起作用:

/test/ca.srl: No such file or directory
140413509251520:error:06067099:digital envelope routines:EVP_PKEY_copy_parameters:different parameters:../crypto/evp/p_lib.c:93:
140413509251520:error:02001002:system library:fopen:No such file or directory:../crypto/bio/bss_file.c:72:fopen('/test/ca.srl','r')
140413509251520:error:2006D080:BIO routines:BIO_new_file:no such file:../crypto/bio/bss_file.c:79:
这个参数不是用来输出一个序列号的文件,而序列号可以通过下面的命令获取吗

opensslx509\
-在“c.crt”中\
-中午\
-连载

那有什么意义呢?如果需要,为什么不在内部创建文件,而是将其保存在存储器中?

第二个命令的
-serial
选项只输出现有证书的序列号。但是,当您对证书进行签名时,CA需要为每个证书生成一个唯一的序列号,在此之前,
-serial
还没有要输出的序列号

由于每个证书的序列号对于每个颁发者都需要是唯一的,因此颁发者需要跟踪它以前使用过的序列号,以确保它不会重复使用任何序列号。OpenSSL为您提供了一种使用序列号文件跟踪此情况的简单方法。当您指定
-CAcreateserial
时,它会将序列号
01
分配给已签名的证书,然后使用其中的下一个序列号(
02
)创建此序列号文件。在以后的签名操作中,您应该使用带有该文件名的
-CAserial
,而不是
-CAcreateserial
,OpenSSL将为每个签名的证书增加该文件中的值。通过这种方式,您可以使用一个颁发者证书对一组证书进行签名,并且它们的所有序列号都是唯一的

如果您使用多个颁发者证书,则可以为每个证书使用单独的序列号文件

请注意,虽然这种方法有效,但它不适合生产使用,因为有。

多亏了作者的回答,我创建了一些方法来说明这个问题

可能的脚本结果:

  --------------------------------------------------------------------------------
 |         A new {serial #1} generated | 310BD94F916BDF47913249966B85A9F7771D746A |
 |         A new {serial #2} generated | 0AC91627E4E99612D3CC7D99BB9793445CEDB36B |
 |   Used the same {serial #2} 5 times | 0AC91627E4E99612D3CC7D99BB9793445CEDB370 |
 | Used the same {serial #2} 256 times | 0AC91627E4E99612D3CC7D99BB9793445CEDB470 |
  --------------------------------------------------------------------------------

有趣的是
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
serial上会发生什么。它会溢出到零吗?@F8ER:如果你每秒生成100000000个证书,并且你在大爆炸时开始生成它们,那么到现在为止,你已经有大约2^88个证书了。你引用的数字是2^160-1。如果你从1开始,你不必担心像那样的数字溢出。一个序列不是纯粹随机的吗?它可能是一个随机数(我相信如果你把
-CAcreateserial
-CA
结合起来,它就会是),但是,即使它是纯粹随机的,它甚至远接近最大值的几率也是天文数字。我不确定OpenSSL在这里使用什么范围来计算随机数,但如果最高有效位为0,而所有其他位都为1,例如,您仍将有2^159个剩余值。如果您对此感到担心,只需验证生成的数字。可能值得注意的是,如果存在串行文件,则会忽略
-CAcreateserial