Sunday, 10 October 2021

s/mime 用の gpgsm を使った自己署名鍵の作り方と使い方

install

   brew install gpg


鍵の生成

X.509 subject name を聞かれるので用意しておく。

    C=JP, ST=Okinawa, L=Ginowan, O=Univerisy of the Ryukyus, OU=Faculty of Engineering, CN=kono@ie.u-ryukyu.ac.jp

以下のコマンドを実行すると pem 形式の鍵が作られる。パスワードを要求されるので三回入れる。

    % gpgsm --generate-key -o kono-cr.pem
    gpgsm (GnuPG) 2.3.2; Copyright (C) 2021 Free Software Foundation, Inc.
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    Please select what kind of key you want:
       (1) RSA
       (2) Existing key
       (3) Existing key from card
    Your selection? 1
    What keysize do you want? (3072) 
    Requested keysize is 3072 bits
    Possible actions for a RSA key:
       (1) sign, encrypt
       (2) sign
       (3) encrypt
    Your selection? 1
    Enter the X.509 subject name: C=JP, ST=Okinawa, L=Ginowan, O=Univerisy of the Ryukyus, OU=Faculty of Engineering, CN=kono@ie.u-ryukyu.ac.jp
    Enter email addresses (end with an empty line):
    > kono@cr.ie.u-ryukyu.ac.jp
    > 
    Enter DNS names (optional; end with an empty line):
    > 
    Enter URIs (optional; end with an empty line):
    > 
    Create self-signed certificate? (y/N) y
    These parameters are used:
        Key-Type: RSA
        Key-Length: 3072
        Key-Usage: sign, encrypt
        Serial: random
        Name-DN: C=JP, ST=Okinawa, L=Ginowan, O=Univerisy of the Ryukyus, OU=Faculty of Engineering, CN=kono@ie.u-ryukyu.ac.jp
        Name-Email: kono@cr.ie.u-ryukyu.ac.jp
    Proceed with creation? (y/N) y
    Now creating self-signed certificate.  This may take a while ...
    gpgsm: about to sign the certificate for key: &469055AB822ADC3CF2BAACB99F75EF5879284FDE
    gpgsm: certificate created
    Ready.

kono-cr.pem が作られる。中身は

    -----BEGIN CERTIFICATE-----
    MIIFDjCCA3agAwIBAgIIaquhrzh3ue4wDQYJKoZIhvcNAQELBQAwgZYxHzAdBgNV
       ....
    T8ReSdO/npRqfx+6u7WcEuJdhmdUR6ILCu0U2ueNvfIjaMF80aiNnCQH+3IVV0AM
    f0E=
    -----END CERTIFICATE-----

みたいな感じ。


pem の確認

    % file kono-cr.pem 
    kono-cr.pem: PEM certificate

確かに pem だ。詳しく見るには openssl を使って

    openssl x509  -text -noout -in kono-cr.pem | more

で見ることができます。gpgsm では以下の用に import してから見る。


秘密鍵のimport

これを gpgsm に import すると使えるようになる。

    % gpgsm --import kono-cr.pem 
    gpgsm: total number processed: 1
    gpgsm:               imported: 1

これを macOSの Mail.app で使うには

    % gpgsm  -o secret-gpg-key.p12   --export-secret-key-p12  0xkeyid 

としてから、open secret-gpg-key.p12 して、KeyChain.app から trust してやれば良い。

ただし、brew の gpgsm (GnuPG) 2.3.2 は壊れているので、gpgsm (GnuPG) 2.3.2-beta105 を自分で build して使う。github のは少しファイルが足りないが、

    wget https://gnupg.org/ftp/gcrypt/gnupg/gnupg-2.3.2.tar.bz2

から足りないのを補えばいける。


秘密鍵のlist

    % gpgsm --list-secret       
    /Users/kono/.gnupg/pubring.kbx
    ------------------------------
               ID: 0x4BB8BEDD
              S/N: 6AABA1AF3877B9EE
            (dec): 7686414962976602606
           Issuer: /CN=kono@ie.u-ryukyu.ac.jp/OU=Faculty of Engineering/O=Univerisy of the Ryukyus/L=Ginowan/ST=Okinawa/C=JP
          Subject: /CN=kono@ie.u-ryukyu.ac.jp/OU=Faculty of Engineering/O=Univerisy of the Ryukyus/L=Ginowan/ST=Okinawa/C=JP
              aka: kono@cr.ie.u-ryukyu.ac.jp
         validity: 2021-10-09 22:41:34 through 2063-04-05 17:00:00
         key type: rsa3072
        key usage: digitalSignature nonRepudiation keyEncipherment dataEncipherment
     chain length: unlimited
         sha1 fpr: 58:50:69:9C:DC:96:30:F5:9C:6D:C6:B0:25:22:32:86:4B:B8:BE:DD
         sha2 fpr: E6:6C:E5:B4:B8:00:48:8B:13:14:9F:2B:D5:99:82:88:32:E1:B2:6E:1F:68:92:D0:91:BA:0B:D4:53:97:4E:BB


gpgsm での署名と検証

draft を用意する。

  gpgsm --sign -b  -o gpg.sign draft
 -b でハッシュを別に生成できる。
  gpgsm --verify  gpg.sign draft

この二つを MIME multi-part でまとめれば良いはず。

もらったメールを gpgsm で検証するには mhn ではなく手動で展開してコマンドを実行すれば良いはず。


gpgsm での暗号化

署名とファイルと二つ必要で、それを mime multi part してくれることはないので、自分でやる。

暗号化と署名

 % gpgsm --recipient kono@cr.ie.u-ryukyu.ac.jp -a -o draft.enc.gpgsm -e  draft 
 % gpgsm --sign -a -o draft.sign.gpgsm  draft.enc.gpgsm       

検証
 % gpgsm --verify -a draft.draft.sign.gpgsm  draft.enc.gpgsm 

復号
 % gpgsm -d  draft.enc.gpgsm 

そうじゃなくて、

 % gpgsm --recipient kono@cr.ie.u-ryukyu.ac.jp -a -o draft.enc.p7m -e  draft
 % gpgsm -d  draft.enc.p7m 

で良いらしい。

No comments: