お勉強
Linuxのお勉強(OpenSSLを使ってみる)
セキュリティがらみをなんとなく。
とりあえずはじめにOpenSSLを。
ダウンロードとかインストールは適当に。
OpenSSLで出来ること
- 公開鍵&秘密鍵ペアの生成
- 公開鍵による暗号化
- 秘密鍵による署名
- 認証局の作成
- 認証局による公開鍵証明書の作成
- 認証局による公開鍵の失効証明書の作成
- 共通鍵による暗号化
- Diffie-Hellman パラメータの作成
このくらい?
OpenSSLで作成できる公開鍵&秘密鍵のペアについて
RSA鍵とDSA鍵が作れる。
RSA鍵は暗号化、署名ともに出来る。
DSA鍵は署名のみできる。
RSA秘密鍵の生成
RSA鍵の生成は
openssl genrsa 2048 -out rsa.key
みたいな感じ。 2048は鍵長。鍵長を指定しないと標準値が使われます。
標準は512bitとか1024bitとかですが
最近だと 2048bit以上が推奨なのかな?わかりません。
-out に続けて作成する鍵のファイル名。
-out が無いと標準出力に鍵が出力されます。
それをコピーしてテキストファイルに貼り付けても良いし、
openssl genrsa 2048 > rsa.key
こんな感じでリダイレクトを使ってファイルに書き出すのも良い気がする。
DSA秘密鍵の生成
DSA鍵の生成は
DSAPARAM というパラメータを作成して、そのパラメータを使って作成するので
まずパラメータの作成から
openssl dsaparam -out dsa.param 2048
みたいな感じ。
-out に続けて生成するパラメータのファイル名。
2048はbit数。
openssl dsaparam 2048 > dsa.param
こんな感じでリダイレクトを使ってファイルに書き出すのも。
そんなこんなで パラメータが出来たらいよいよ鍵の作成
openssl gendsa -out dsa.key dsa.param
こんな感じ。
-out に続けて作成する鍵のファイル名。
dsa.paramで作成したパラメータを指定。
openssl gendsa dsa.param > dsa.key
これもこんな感じでリダイレクトを使って出力できますね。
鍵の暗号化
ちなみに、このままだと秘密鍵は特に暗号化もされていませんので、
ファイルが盗まれたら即使われてしまいます。
そこで、鍵にパスワードを利用した暗号化を施すこともできます。
鍵を作成するときに
openssl genrsa -aes256 2048
openssl gendsa -aes256 dsa.param
とかやると作成する鍵を暗号化できます。
このコマンドを実行するとパスフレーズ(パスワード)を聞かれますので
2回同じパスワードを入力してください。
すると、次からこの鍵を使うときにパスワードが要求されるようになります。
でも、鍵ファイルが盗まれたら素直に破棄して作り直しましょう。
ここでは暗号化に AES256 を使っていますが
- des,des3
- idea
- seed
- aes128,aes192,aes256
- camellia128,camellia192,camellia256
あたりが使えます。(OpenSSLのバージョンによって違うかも)
openssl dsa -in dsa.key -aes256 -out dsa-crypt.key
openssl rsa -in rsa.key -aes256 -out rsa-crypt.key
みたいなことをするとパスワードがないキーにパスワードを設定したり
パスワードを更新することができます。
公開鍵の作成
公開鍵の作成は、先ほど作成した秘密鍵を使って
openssl rsa -in rsa.key -pubout -out rsa.pub
openssl dsa -in dsa.key -pubout -out dsa.pub
で出来ます。
これも-in -out はリダイレクトを使えるので
openssl rsa -pubout < rsa.key > rsa.pub
openssl dsa -pubout < dsa.key > dsa.pub
みたいな書き方もできます。
実際は公開鍵ではなく、公開鍵証明書を利用するケースが多い気がしますね。
RSA鍵を利用した暗号化/復号化
RSA鍵では任意のデータを暗号化/復号化できます。
公開鍵で暗号化、秘密鍵で復号化します。
openssl rsautl -encrypt -pubin -inkey rsa.pub -in normaldata -out encryptdata
こんな感じで暗号化
openssl rsautl -decrypt -inkey rsa.key -in encryptdata -out decryptdata
こんな感じで復号化
rsa.pub と rsa.key は公開鍵&秘密鍵 のペアです。
normaldata と decryptdata は同じもののはずです。
RSA鍵を利用した暗号化/復号化2
上記とは逆に
秘密鍵で暗号化、公開鍵で複合化をします。
openssl rsautl -sign -inkey rsa.key -in normaldata -out cryptdata
こんな感じで暗号化。
openssl rsautl -verify -pubin -inkey rsa.pub -in cryptdata -out decryptda
こんな感じで復号化。
normaldata と decryptdata は同じもののはずです。
ハッシュ値を使った署名/検証
RSA鍵、DSA鍵どちらでもできます。
openssl dgst -md5 -sign -inkey rsa.key -in normaldata -out normaldata.sign
openssl dgst -md5 -sign -inkey dsa.key -in normaldata -out normaldata.sign
こんな感じで署名作成
openssl dgst -md5 -verify -pubin -inkey rsa.pub -signature normaldata.sign -in normaldata
openssl dgst -md5 -verify -pubin -inkey dsa.pub -signature normaldata.sign -in normaldata
こんな感じで署名検証
ここでも-in -out はリダイレクトを使っても良いです。
署名に使えるハッシュは
というところみたいです。