为什么签署证书需要“-CAcreateserial”参数?
Why does signing a certificate require `-CAcreateserial` argument?
例如,
openssl x509 \
-req -sha256 \
-days "365" \
-CAcreateserial \
-CA "ca.crt" -CAkey "ca.key" -passin "pass:abcd" \
-in "csr.csr" -extfile "ext.ext" \
-out "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:
那个参数不是用来输出一个序列号的文件吗,无论如何都可以通过下面的命令获得?
openssl x509 \
-in "c.crt" \
-noout \
-serial
那有什么意义呢?如果需要,为什么不在内部创建文件,而是将其保存在存储设备上?
第二个命令的 -serial
选项只输出现有证书的序列号。但是当您签署证书时,CA 需要为每个证书生成一个唯一的序列号,并且在它这样做之前,还没有 -serial
的序列号可以输出。
由于每个证书的序列号对于每个颁发者来说都必须是唯一的,因此颁发者需要跟踪它以前使用过的序列号,以确保它不会重复使用任何序列号。 OpenSSL 为您提供了一种使用序列号文件跟踪此情况的简单方法。当您指定 -CAcreateserial
时,它会将序列号 01
分配给签名证书,然后使用下一个序列号 (02
) 创建此序列号文件。在未来的签名操作中,您应该使用 -CAserial
和该文件的名称,而不是 -CAcreateserial
,并且 OpenSSL 将为每个签名的证书递增该文件中的值。这样,你就可以用一个发行者证书签署一堆证书,它们的序列号都是唯一的。
如果您使用多个颁发者证书,则可以为每个证书使用单独的序列号文件。
请注意,虽然此方法有效,但不适合生产使用,因为 some problems with using strictly sequentially increasing certificate serial numbers。
感谢 's answer, I created some script 这可能会证明问题。
一个可能的脚本结果:
--------------------------------------------------------------------------------
| 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 |
--------------------------------------------------------------------------------
例如,
openssl x509 \
-req -sha256 \
-days "365" \
-CAcreateserial \
-CA "ca.crt" -CAkey "ca.key" -passin "pass:abcd" \
-in "csr.csr" -extfile "ext.ext" \
-out "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:
那个参数不是用来输出一个序列号的文件吗,无论如何都可以通过下面的命令获得?
openssl x509 \
-in "c.crt" \
-noout \
-serial
那有什么意义呢?如果需要,为什么不在内部创建文件,而是将其保存在存储设备上?
第二个命令的 -serial
选项只输出现有证书的序列号。但是当您签署证书时,CA 需要为每个证书生成一个唯一的序列号,并且在它这样做之前,还没有 -serial
的序列号可以输出。
由于每个证书的序列号对于每个颁发者来说都必须是唯一的,因此颁发者需要跟踪它以前使用过的序列号,以确保它不会重复使用任何序列号。 OpenSSL 为您提供了一种使用序列号文件跟踪此情况的简单方法。当您指定 -CAcreateserial
时,它会将序列号 01
分配给签名证书,然后使用下一个序列号 (02
) 创建此序列号文件。在未来的签名操作中,您应该使用 -CAserial
和该文件的名称,而不是 -CAcreateserial
,并且 OpenSSL 将为每个签名的证书递增该文件中的值。这样,你就可以用一个发行者证书签署一堆证书,它们的序列号都是唯一的。
如果您使用多个颁发者证书,则可以为每个证书使用单独的序列号文件。
请注意,虽然此方法有效,但不适合生产使用,因为 some problems with using strictly sequentially increasing certificate serial numbers。
感谢
一个可能的脚本结果:
--------------------------------------------------------------------------------
| 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 |
--------------------------------------------------------------------------------