使用 OpenSSL x509 命令修改证书主题

信息安全 证书 证书颁发机构 openssl
2021-08-25 23:58:53

我正在构建一个基于 OpenSSL 命令行工具的 CA。我不想使用该openssl ca工具及其基于文件的数据库,而是openssl x509直接使用该工具创建证书并分配一个随机序列。(我想自己管理撤销、连续出版物和政策。)

这一切都有效,问题是在颁发新证书时,主题行直接从 CSR 复制到证书中。我希望能够覆盖主题。不幸的是,该x509命令没有像该命令那样提供-subj <arg>参数ca

作为一种解决方法,我尝试重写 CSR 本身。我可以使用 轻松更改主题openssl req -in oldcsr.pem -subj "newsubj" -out newcsr.pem但是当然 CSR 签名不再有效,并openssl x509抱怨“签名与证书请求不匹配”。而且我没有找到一种简单的方法来忽略签名。

有没有办法在生成证书时覆盖 CSR 的主题,而不使用该openssl ca工具?

3个回答

我的例子:

生成自签名证书(和私钥)

$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -sha256 -keyout mydomain_rsa.PEM.key -out mydomain.PEM.csr -subj "/C=CN/O=Company Inc."
   Generating a 2048 bit RSA private key  
   ..........................+++  
   ........+++  
   writing new private key to 'mydomain_rsa.PEM.key'  
   -----  

查看主题

$ openssl x509 -noout -serial -subject -in mydomain.PEM.csr
  serial=CCC8F2F4B4BEDBAC
  subject= /C=CN/O=Company Inc.

修改主题

openssl req -x509 -in mydomain.PEM.csr -subj '/O=Company2 Inc.' -key mydomain_rsa.PEM.key -out new_mydomain.PEM.csr

查看新证书的主题

$ openssl x509 -noout -serial -subject -in new_mydomain.PEM.csr
  serial=A873BD71BCD0DFF7
  subject= /O=Company2 Inc

很晚而且真的很丑,但是......在 OpenSSL 1.1.0(2016 年发布,在这个 Q 之后几个月)中,你可以通过另一个方向来实现这一点

 # extract the pubkey from the real CSR
 openssl req -in realcsr -pubkey -out realpub
 # create a _fake_ CSR with the correct subject and any keypair 
 # (I use a throwaway for simplicity but if you have another you can use that) 
 openssl req -newkey rsa:512 -nodes -keyout fakekey -subj "/C=US/ST=Maine/L=Cabot Cove/CN=Jessica Fletcher" -out fakecsr
 # issue a cert for the subject from the fake CSR but the real pubkey!
 openssl x509 -req -in fakecsr -force_pubkey realpub -CA ca_cert_and_key -out newcert 
 # add other options as needed e.g. -outform pem -$hash -days 30 -set_serial 1234 -extfile extns 

我的例子:

第一个带有新私钥的证书

openssl req -new -newkey rsa:2048 -nodes -sha256 -days 365 -keyout certificateExample.key -out certificateExample.csr
openssl x509 -req -in certificateExample.csr -signkey certificateExample.key -out certificateExample.cer

第二个证书,带有旧的私钥

openssl req -new -sha256 -days 365 -key certificateExample.key -subj /O=Contoso -out certificateExampleContoso.csr
openssl x509 -req -in certificateExampleContoso.csr -signkey certificateExample.key -out certificateExampleContoso.cer

查看主题名称

openssl x509 -noout -serial -subject -in certificateExampleContoso.cer
serial=C6E02EB9402CEABD
subject=O = Contoso

关键是使用新的主题名称生成新的证书签名请求 (CSR)。由于 CSR 本身已签名,因此您无法将旧 CSR“转换”为具有不同主题名称的新 CSR。这就是我使用新主题名称生成新 CSR 的原因。