OpenSSLとかのメモ
自分用
もくじ
そもそもSSL通信って何
共通鍵暗号って
暗号化と復号化に同じ鍵を使う。二人だけの共通鍵を作って使う感じ。『AED』はこれの暗号化方式の一種。
相手ごとに鍵をいちいち作る必要があるけど、処理が速い。
ただ、鍵の受け渡し自体を盗聴されたらアウト。
公開鍵暗号って
暗号化と復号化に別の鍵を使う。暗号化は公開鍵で、復号は秘密鍵で行う。『RSA』はこれの暗号化方式の一種。
- 受信側で公開鍵と秘密鍵を生成する。
- 受信側から送信側に公開鍵を送る。
- 送信側は、公開鍵で送信内容を暗号化して送る。
安全だけど処理が遅いらしい。
SSL通信って
SSL通信では、最初だけ公開鍵暗号を、それ以降は共通鍵暗号を使ってやりとりすることで、二つのいいとこどりをしている。
- クライアントからサーバーに接続要求する。
- サーバーはクライアントに公開鍵つきの証明書を送る。
- クライアントはブラウザのルート証明書を使って、サーバーから送られてきた証明書が本物かどうか確認する。
- クライアントは共通鍵を作って、公開鍵で共通鍵を暗号化して、サーバーに送る。
- サーバーは送られてきたものを秘密鍵で復号して、共通鍵を手に入れる。
- あとは共通鍵で通信する。
電子署名って何
前提として
- 公開鍵と秘密鍵は同じ構造なので、どちらを使っても暗号化はできる。
- 公開鍵で暗号化した文章は、秘密鍵で復号化できる。
- 秘密鍵で暗号化した文章は、公開鍵で復号できる。
つまり、ある公開鍵で復号できる暗号文を作れる人は、対応する秘密鍵を持ってることになる。
これにより、少なくとも (公開鍵が本物かどうかはともかく) その文章を作ったのが秘密鍵の持ち主であることが判る。
ただのメモ
- PEM、DERは鍵のフォーマットの名前。何の鍵かということではない。
- RSAでは秘密鍵から公開鍵を作れるので、間違えて相手に秘密鍵を渡しちゃうと危険。
- CSRを作るとき、色々聞かれる。Chromeにインポートするとかなら、CommonNameはちゃんと書いた方がいい。
- Chromeにオレオレ証明書取り込むときは、証明書の管理→インポート→証明書ストアに『信頼されたルート証明機関』を選ぶ。
オレオレ証明書の作り方
# パスなしの秘密鍵を作る
openssl genrsa 2048 > private_key.pem
# 秘密鍵から、公開鍵を含むCSRを作る
openssl req -new -key private_key.pem > server.csr
# 公開鍵を含むCSRに自分の秘密鍵で署名して、証明書を作る (有効期限10年)
openssl x509 -days 3650 -req -signkey private_key.pem < server.csr > server.crt
Chrome対応のオレオレ証明書の作り方
SANがいるらしい
爆速でChrome対応オレオレ証明書を作成する - 動かざることバグの如し
openssl genrsa 2048 > private_key.pem
openssl req -new -key private_key.pem > server.csr
echo subjectAltName=DNS:*.hoge.piyo > san.ext
openssl x509 -days 3650 -req -signkey private_key.pem < server.csr > server.crt -extfile san.ext
このあと、DER形式に変換しないと取り込めない。変換方法は次項。
openssl コマンドメモ
# パスなし秘密鍵作成
openssl genrsa 2048 > private_key.pem
# パスあり秘密鍵作成
openssl genrsa 2048 -des3 -sha256 > private_key.pem
# 秘密鍵の内容確認
openssl rsa -text < private_key.pem
# 鍵をパスフレーズで暗号化する (3DES)
openssl genrsa -aes128 -out key.pem 1024
# 鍵のパスを解く
openssl rsa < key.pem > key.pem
# PEM→DER
openssl x509 < key.pem -inform PEM > key.der -outform DER
# DER→PEM
openssl x509 < key.der -inform DER > key.pem -outform PEM