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