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.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
  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