#はじめに
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は、Secure Sockets Layer (SSLv2/v3)とTransport Layer Security (TLS v1)の
-
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
- 鍵
- .crt
##鍵の中身の確認
$ 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
#参考