初心者向けOpenSSLの使い方~鍵生成から署名作成まで~


はじめに

OpenSSLの使い方についての備忘録です.
主にOpenSSLにできることや詳しい使い方について書きたいと思います.

OpenSSLとは

OpenSSL(オープン・エスエスエル)は、SSLプロトコル・TLSプロトコルの、オープンソースで開発・提供されるソフトウェアである。
wikipedia

OpenSSLにできること

以下は man openssl に書かれていることです.

  • OpenSSLの説明

    • OpenSSLは、Secure Sockets Layer (SSLv2/v3)とTransport Layer Security (TLS v1)の ネットワークプロトコルと、それらが要求する関連暗号標準を実装した暗号化ツールキット です。
    • opensslプログラムは、OpenSSLの暗号化ライブラリの各種暗号化機能をシェルから利用する ためのコマンドラインツールです。
  • OpenSSLの機能

    • 秘密鍵,公開鍵,各種パラメーターの生成及び管理
    • 公開鍵暗号
    • CSRs, CRLs 及び X.509 証明書の生成(X.509の説明は)
    • メッセージダイジェスト(ハッシュ値の生成)
    • 文書の暗号化と復号(平文化)
    • SSL/TLSクライアント・サーバのテスト
    • S/MIME署名または暗号化されたメールの取り扱い
    • タイムスタンプの依頼・生成・確認
ハッシュ化コマンド
$ openssl list -digest-commands
blake2b512        blake2s256        gost              md4
md5               rmd160            sha1              sha224
sha256            sha3-224          sha3-256          sha3-384
sha3-512          sha384            sha512            sha512-224
sha512-256        shake128          shake256          sm3
暗号化コマンド
$ openssl list -cipher-commands
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb
aes-256-cbc       aes-256-ecb       aria-128-cbc      aria-128-cfb
aria-128-cfb1     aria-128-cfb8     aria-128-ctr      aria-128-ecb
aria-128-ofb      aria-192-cbc      aria-192-cfb      aria-192-cfb1
aria-192-cfb8     aria-192-ctr      aria-192-ecb      aria-192-ofb
aria-256-cbc      aria-256-cfb      aria-256-cfb1     aria-256-cfb8
aria-256-ctr      aria-256-ecb      aria-256-ofb      base64
bf                bf-cbc            bf-cfb            bf-ecb
bf-ofb            camellia-128-cbc  camellia-128-ecb  camellia-192-cbc
camellia-192-ecb  camellia-256-cbc  camellia-256-ecb  cast
cast-cbc          cast5-cbc         cast5-cfb         cast5-ecb
cast5-ofb         des               des-cbc           des-cfb
des-ecb           des-ede           des-ede-cbc       des-ede-cfb
des-ede-ofb       des-ede3          des-ede3-cbc      des-ede3-cfb
des-ede3-ofb      des-ofb           des3              desx
rc2               rc2-40-cbc        rc2-64-cbc        rc2-cbc
rc2-cfb           rc2-ecb           rc2-ofb           rc4
rc4-40            seed              seed-cbc          seed-cfb
seed-ecb          seed-ofb          sm4-cbc           sm4-cfb
sm4-ctr           sm4-ecb           sm4-ofb
公開鍵アルゴリズム
$ openssl list -public-key-algorithms
Name: OpenSSL RSA method
        Type: Builtin Algorithm
        OID: rsaEncryption
        PEM string: RSA
Name: rsa
        Alias for: rsaEncryption
Name: OpenSSL PKCS#3 DH method
        Type: Builtin Algorithm
        OID: dhKeyAgreement
        PEM string: DH
Name: dsaWithSHA
        Alias for: dsaEncryption
・・・割愛

下準備

$ cat /etc/os-release
 Ubuntu 18.04.5 LTS
$ openssl verion
 OpenSSL 1.1.1  11 Sep 2018
$ sudo yum -y install openssl(入っていない場合)
$ mkdir ~/ssl
$ cd ~/ssl

鍵の生成

秘密鍵の生成
$ openssl genrsa -out private-key.pem 2048
公開鍵の生成
$ openssl rsa -in private-key.pem -pubout -out public-key.pem

-outformオプションを付けると.derファイルで生成できる(指定しなければデフォルトで.pemになる)

ファイル拡張子について

  • エンコーディングを表す拡張子

    • .der(Distinguished Encoding Rules)
      • 秘密鍵や証明書をバイナリー化したもの
    • .pem(Private Enhanced Mail)
      • バイナリーデータをBase64エンコーディングしたもの
      • ---BIGIN から始まり ---ENDで終わるテキストファイル
  • ファイルの中身を表す拡張子

    • .crt
      • 証明書のこと.中身がテキストならPEM形式、バイナリならDER形式の場合が多い
    • .cer
      • .crtと同じ.主にMicrosoftが使う
    • .key

鍵の中身の確認

$ openssl rsa -in private(public)-key.pem -text -noout

.derファイルの場合

$ openssl rsa -in private(public)-key.der -inform der -text -noout

公開鍵暗号を行う

メッセージファイルの作成

$ echo hoge > text.txt

暗号化

$ openssl rsautl -encrypt -pubin -inkey public-key.pem -in text.txt -out text.encrypted

rsautlとは"RSA utility"のこと.

暗号化したファイルの確認

$ hexdump text.encrypted

復号

$ openssl rsautl -decrypt -inkey private-key.pem -in text.encrypted

復号した内容をファイルにおこしたい場合は-out [ファイル名]を付ける.

デジタル署名の仕組み

デジタル署名は、ハッシュ関数と公開鍵暗号方式を組み合わせて電子的な署名を作成します.
署名者は送付するメッセージをハッシュ値にし、ハッシュ値を秘密鍵で暗号化して「署名」を作成します.
受信者は署名者の公開鍵でその署名が正しいかどうかを検証します.

デジタル署名の処理手順は以下のとおり.

1.送信者が公開鍵と秘密鍵を生成する.
2.送信者は受信者に公開鍵を送付する.
3.送信者は受信者に送付するメッセージに対してハッシュ値を算出する.
4.送信者はハッシュ値を秘密鍵を使用して暗号化する.
5.送信者はメッセージと暗号化されたハッシュ値(デジタル署名)を受信者に送信する.
6.受信者は暗号化されたハッシュ値(デジタル署名)を、送信者から入手した公開鍵を使用して復号する.
7.受信者は受信したメッセージを基にハッシュ値を算出する.
8.受信者は復号されたハッシュ値と、算出されたハッシュ値を比較して、一致すれば正しいデータであると判断する.

署名作成

$ openssl dgst -sha256 -sign private-key.pem text.txt > text.sign

署名検証

$ openssl dgst -sha256 -verify public-key.pem -signature text.sign text.txt
Verified OK

署名(text.sign)が先,メッセージ(text.txt)が後にする.でないと検証が通らない.

検証が通らない場合の結果

$ openssl dgst -sha256 -verify public-key.pem -signature text.sign other.txt
Verification Failure
Exit 1

デジタル署名とデジタル証明書の違い

ここは自分でも結構ごっちゃになるので書いておきます.

デジタル署名

署名したい文書(メッセージ)に対して"ハッシュ化"と"秘密鍵による暗号化"を行ったもの.
デジタル署名の性質は以下.
・送信者の証明
・改ざん防止
・否認防止

送りたいメッセージのハッシュ値に対して,送信者の秘密鍵で暗号化するのがデジタル署名

デジタル証明書

デジタル証明書とは、第三者機関である「認証局(CA: Certification Authority)」によって発行される電子式の身分証明書.
認証された公開鍵に対してデジタル署名を施す.
公開鍵の正当性を証明する役割を持つことから、「公開鍵証明書」とも呼ばれている.
デジタル証明書は、ITU-T勧告の「X.509」で定義されている.

公開鍵に対して認証局の秘密鍵で暗号化するのがデジタル証明書

脆弱性について

OpenSSLは頻繁に脆弱性が報告されていますが,今はまだ人に教えられるほど詳しくないので別記事として投稿できればと思います.

一応参考までに
JVN-Japan Vulnerability Note

参考