OpenSSLを用いてWindows向けコード署名証明書を作成する方法

主題
OpenSSLを用いてWindows用コード署名用電子証明書を作成する手順を説明したい。

背景
microsoftは、Appleと違ってコード署名用電子証明書を開発者のためにサポートする仕組みを持っていない。にもかかわらず、コード署名用電子証明書を必要とするシーンはMS Officeのマクロに至るまであり、用途は広い。
一方で、正式なコード署名用電子証明書は価格が高く、自分の身近に展開するだけの場合、その費用が問題視される。k9pcaというソフトウェアがあるが、これは、まさに、この用途のために開発されたと言って良いだろう。
筆者は最近、OpenSSLでも同様のことができることを知った。もう一つ言えば、それまでWinXP用と記憶していたk9pcaも、バージョンアップしてWindows10に対応していた。
本稿ではk9pcaではなく、OpenSSLを用いてWindows用コード署名用電子証明書を作成する手順を説明したい。

手順
以下に手順を述べる。

  1. OpenSSLのビルドとインストール

                curl -LO https://www.openssl.org/source/openssl-1.1.1d.tar.gz
                tar xf openssl-1.1.1d.tar.gz
                cd openssl-1.1.1d
                ./Configure darwin64-x86_64-cc \
                shared enable-ec_nistp_64_gcc_128 \
                no-ssl2 no-ssl3 no-comp \
                --openssldir=/usr/local/openssl/
                make depend
                sudo make install
            
  2. CA証明書の作成

    1. CAの秘密鍵の作成
      RSA秘密鍵を作成する。

                          openssl genrsa 2048 > rootCA.key
                      
    2. 証明書署名要求の作成
      秘密鍵から証明書署名要求(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
                      
    3. 証明書の作成(認証局による公開鍵への自己署名)
      証明書署名要求に秘密鍵で署名する(自己署名)。

                          openssl x509 -req \
                          -in rootCA.csr \
                          -signkey rootCA.key \
                          -days 1826 \
                          -out rootCA.crt
                      
  3. コード署名用証明書の作成

    1. 秘密鍵の作成
      RSA秘密鍵を作成する。

                          openssl genrsa 2048 > Tougenroushi_Factory.key
                      
    2. 証明書署名要求の作成
      証明書署名要求を作成する。

                          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
                      
    3. 証明書の作成(認証局による公開鍵への署名)
      証明書を作成する(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
                      
  4. 証明書のインストール
    できあがったCA証明書と、コード署名用証明書(p12形式)は、それぞれ以下の手順でインストールする。

    • CA証明書
      ダブルクリックすると次の画面が開く。


      CA証明書のインストール

      証明書のインストールボタンを押すと表示されるダイアログで、インストール場所を信頼されたルート証明機関
      に設定する。
      インストール時に警告を受けるが無視する。

    • コード署名用証明書(p12形式)
      ダブルクリックすると、証明書のインストールダイアログが開く。すべてダイアログの通りにすれば良い。

  5. 配布
    正式のコード署名証明書と違い、コード署名した作成物と、証明書をセットで配布することになる。証明書は上記手順で配布先にもインストールすること。

参考記事

以上。

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL