OpenSSLを用いてWindows向けコード署名証明書を作成する方法
主題
OpenSSLを用いてWindows用コード署名用電子証明書を作成する手順を説明したい。
背景
microsoftは、Appleと違ってコード署名用電子証明書を開発者のためにサポートする仕組みを持っていない。にもかかわらず、コード署名用電子証明書を必要とするシーンはMS Officeのマクロに至るまであり、用途は広い。
一方で、正式なコード署名用電子証明書は価格が高く、自分の身近に展開するだけの場合、その費用が問題視される。k9pcaというソフトウェアがあるが、これは、まさに、この用途のために開発されたと言って良いだろう。
筆者は最近、OpenSSLでも同様のことができることを知った。もう一つ言えば、それまでWinXP用と記憶していたk9pcaも、バージョンアップしてWindows10に対応していた。
本稿ではk9pcaではなく、OpenSSLを用いてWindows用コード署名用電子証明書を作成する手順を説明したい。
手順
以下に手順を述べる。
-
OpenSSLのビルドとインストール
curl -LO https://www.openssl.org/source/openssl-1.1.1w.tar.gz tar xf openssl-1.1.1w.tar.gz cd openssl-1.1.1w ./config --openssldir=/usr/local/ssl make && sudo make install
-
CA証明書の作成
-
CAの秘密鍵の作成
RSA秘密鍵を作成する。openssl genrsa 2048 > rootCA.key
-
証明書署名要求の作成
秘密鍵から証明書署名要求(CSR)を作成する。openssl req -new \ -key rootCA.key -utf8 > rootCA.csr
上記コマンドを入力すると、国コード、住んでいる場所、組織名、名前、E-mailアドレスなどを対話式で入力することになる。以下に筆者の例を示す。
You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) []:JP State or Province Name (full name) []:Fukushima-Ken Locality Name (eg, city) []:Iwaki-Shi Organization Name (eg, company) []:桃源老師工房 Organizational Unit Name (eg, section) []:桃源老師工房 Common Name (eg, fully qualified host name) []:桃源老師工房 Email Address []:xanadu6291@xxxxxx.jp Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:xxxxxxxx
-
証明書の作成(認証局による公開鍵への自己署名)
証明書署名要求に秘密鍵で署名する(自己署名)。openssl x509 -req \ -in rootCA.csr \ -signkey rootCA.key \ -days 1826 \ -out rootCA.crt
-
-
コード署名用証明書の作成
-
秘密鍵の作成
RSA秘密鍵を作成する。openssl genrsa 2048 > Tougenroushi_Factory.key
-
証明書署名要求の作成
証明書署名要求を作成する。openssl req -config openssl.cfg \ -new -key Tougenroushi_Factory.key -utf8 \ -reqexts v3_req \ -out Tougenroushi_Factory.csr
ここで、openssl.cfgの内容は以下の通り。
[req] input_password = xxxxxxxx req_extensions = v3_req distinguished_name = req_distinguished_name [req_distinguished_name] countryName = Country Name countryName_default = JP stateOrProvinceName = State stateOrProvinceName_default = Fukushima-Ken localityName = City localityName_default = Iwaki-Shi organizationName = Organization organizationName_default = . organizationUnitName = Department organizationalUnitName_default = . commonName = Common Name commonName_default = xxxxxxxxxxxxxxxx emailAddress = Email emailAddress_default = xanadu6291@xxxxxx.jp [ v3_req ] # Extensions to add to a certificate request subjectKeyIdentifier=hash basicConstraints = CA:FALSE keyUsage = digitalSignature extendedKeyUsage = codeSigning, msCodeInd, msCodeCom nsCertType = client, email, objsign # section for the "default_ca" option [ca] default_ca = my_ca_default
また、v3_req.cfgの内容は、以下の通り。
# Extensions to add to a certificate request subjectKeyIdentifier=hash basicConstraints = CA:FALSE keyUsage = digitalSignature extendedKeyUsage = codeSigning, msCodeInd, msCodeCom
国コード、住んでいる場所、組織名、名前、E-mailアドレスなどを、対話式で入力する。
You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name [JP]:JP State [Fukushima-Ken]:Fukushima-Ken City [Iwaki-Shi]:Iwaki-Shi Organization [.]:桃源老師工房 Common Name [xxxxxxxxxxxxx]:桃源老師 Email [xanadu6291@xxxxxx.jp]:xanadu6291@xxxxxx.jp
-
証明書の作成(認証局による公開鍵への署名)
証明書を作成する(CAの秘密鍵で証明書署名要求に署名する)openssl x509 -req -days 1826 \ -in Tougenroushi_Factory.csr \ -CA rootCA.crt -CAkey rootCA.key \ -extfile v3_req.cfg \ -set_serial 01 \ -out Tougenroushi_Factory.crt
証明書と秘密鍵をまとめてp12形式で保管する。
openssl pkcs12 -export \ -out Tougenroushi_Factory.p12 \ -inkey Tougenroushi_Factory.key \ -in Tougenroushi_Factory.crt
-
-
証明書のインストール
できあがったCA証明書と、コード署名用証明書(p12形式)は、それぞれ以下の手順でインストールする。 -
配布
正式のコード署名証明書と違い、コード署名した作成物と、証明書をセットで配布することになる。証明書は上記手順で配布先にもインストールすること。
参考記事
以上。
この投稿へのトラックバック
トラックバックはありません。
- トラックバック URL
この投稿へのコメント