web-dev-qa-db-ja.com

OpenSSL x509コマンドを使用した証明書サブジェクトの変更

OpenSSLコマンドラインツールに基づいてCAを構築しています。ただし、openssl caツールとそのファイルベースのデータベースを使用したくないので、代わりにopenssl x509ツールを直接使用して証明書を作成し、ランダムシリアルを割り当てます。 (失効、シリアル、ポリシーを自分で管理したい。)

これはすべて機能します。問題は、新しい証明書を発行するときに、件名行がCSRから証明書に直接コピーされることです。件名を上書きできるようにしたい。残念ながら、x509コマンドは、caコマンドのように-subj <arg>パラメーターを提供しません。

回避策として、CSR自体を書き直そうとしました。 openssl req -in oldcsr.pem -subj "newsubj" -out newcsr.pemを使用して、件名を簡単に変更できます。しかしもちろん、CSR署名はもう有効ではなく、openssl x509は「署名が証明書要求と一致しなかった」と不平を言います。そして、私は署名を無視する簡単な方法を見つけませんでした。

openssl caツールを使用せずに、証明書の生成時にCSRの件名を上書きする方法はありますか?

4
Danilo Bargen

私の例:

自己署名証明書(および秘密鍵)を生成)

$ 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
2
user155678

非常に遅く、really醜いですが... OpenSSL 1.1.0(2016年にリリースされ、このQの数か月後)では、otherを実行することでこれを達成できます。方向:

 # 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 
1

私の例:

新しい秘密鍵を持つ最初の証明書

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

2番目の証明書、古い秘密鍵

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を生成しました。

0
robbie fan