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

Menu


openssl での自己署名鍵の生成

以下のファイルを smime.cnf として用意します。

    [req]
    distinguished_name = req_distinguished_name
    [req_distinguished_name]
    countryName = Country Name (2 letter code)
    countryName_default = JP
    countryName_min = 2
    countryName_max = 2
    stateOrProvinceName = State or Province Name (full name)
    stateOrProvinceName_default = Okinawa
    stateOrProvinceName_default = Some-State
    localityName = Locality Name (eg, city)
    0.organizationName = Organization Name (eg, company)
    0.organizationName_default = University of Ryukyus
    organizationalUnitName = Organizational Unit Name (eg, section)
    commonName = Common Name (e.g. server FQDN or YOUR name)
    commonName_max = 64
    emailAddress = Email Address
    emailAddress_max = 64
    [smime]
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    subjectAltName = email:copy
    extendedKeyUsage = emailProtection

さらに以下の sh script を作る

    #!/bin/sh
    export OPENSSL_CONF=smime.cnf
    openssl genrsa -aes256 -out ca.key 4096
    openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
    openssl genrsa -aes256 -out smime_test_user.key 4096
    openssl req -new -key smime_test_user.key -out smime_test_user.csr
    openssl x509 -req -days 3650 -in smime_test_user.csr -CA ca.crt -CAkey ca.key -set_serial 1 -out smime_test_user.crt -addtrust emailProtection -addreject clientAuth -addreject serverAuth -trustout 
    openssl pkcs12 -export -in smime_test_user.crt -inkey smime_test_user.key -out smime_test_user.p12
    openssl pkcs12 -in smime_test_user.p12  -out smime_test_user.pem

たくさんパスワードを聞かれる。 smime_test_user.crt が生成された pem 。

   openssl x509  -text -noout -in smime_test_user.crt | more
   openssl x509  -text -noout -in smime_test_user.pem | more

これを gpgsm --import することはできないらしい。

    % gpgsm --import smime_test_user.pem
    gpgsm: self-signed certificate has a BAD signature: Bad signature
    gpgsm: basic certificate checks failed - not imported

いくつか tool があり変換できるらしい。pem2openpgp とか。

けど、結論的には gpgsm で生成する方が楽。


openssl での署名

draft を用意します。
    % openssl smime -sign -in draft -text -out draft.signed -signer smime_test_user.pem 

これを
   % openssl smime -verify  -noverify  -in draft.singed

で検証できます。 自己署名の検証には -noverify が必須。

署名は mime multi part encoding される。

  Content-Type: text/plain

が追加されてしまう。

これを使って、受け取ったs/mimeメールの検証は可能


暗号化

smime-key.pem が相手で、smime_test_user.pemが自分のだとする。本来はsmime-key.pemには公開鍵しか入ってない。

  openssl smime -encrypt -des3 -in signed.mail.out -out signed.mail.encrypt smime-key.pem
  openssl smime -sign -in signed.mail.encrypt  -signer smime_test_user.pem  -out sign.txt

検証
    openssl smime -verify -in sign.txt -CAfile smime-key.pem -out  sign_verify.txt
    Verification successful

解読
    openssl smime -decrypt -recip smime_test_user.pem -inkey smime_test_user.pem -in sign_verify.txt -out plain.txt

cf. https://qiita.com/yamori813/items/ed263a99e825c54975c1

Shinji KONO / Tue Jan 18 13:22:13 2022