簡単なところからちょっと応用的なところまでまとめる。
#sslとは?
secure socket layerの略。
インターネット上で通信を暗号化する技術。
何を暗号化するのか?
passwordや暗証番号など。
どのような技術を用いているか。
- 公開鍵暗号
- 共通鍵暗号
- ハッシュ
証明書作成
証明書発行の手順
- サーバ管理者が秘密鍵ファイルを(server.key)を作成。
- サーバ管理者が秘密鍵ファイルから、公開鍵(public key)と電子署名を組み合わせて、証明書要求ファイルを作成する。サーバ管理者はこの証明書要求ファイルを認証局に送付する。
- 認証局は自分の秘密鍵で、証明書要求ファイルに署名し、サーバ証明書(server.crt)を作成し、返却する。
CSRとは
certificate signing requestまたはcertification requestの略。
内容は以下のものからなる。
- 公開鍵
- 申請者の署名
- 識別名
識別名とは
common name
organization
など証明書要求を作る際に入力する項目のこと。
実際に確認してみる。確認の際にはまずcat等のコマンドで
作成したCSRの内容をコピーし,下記のように
$openssl req -text -noout
と打った後にコピーしたCSRの内容をペーストすると見れる。
$ openssl req -text -noout
-----BEGIN CERTIFICATE REQUEST-----
MIICtjCCAZ4CAQAwcTELMAkGA1UEBhMCSlAxDjAMBgNVBAgTBVRva3lvMRIwEAYD
VQQHEwlNaW5hdG8ta3UxFjAUBgNVBAoTDVNTTCBUZXN0IENvcnAxFDASBgNVBAsT
C3Rlc3QtMjAxNjA1MRAwDgYDVQQDEwd0ZXN0LmpwMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEA0FKYiv6u5sSAMln/y7PStD094/om343VPcwQJEHAnqg3
UKPbwZXJYpd8D6TJk7dLA3Wv3XHuTvN8SGJZu+L2jK7jcwpy9wm1iSwnkzWzlZus
jV97rMxWTmdarAC4M4B/WEAmn2I8+b+h1TL8Si14Q5JY/YLIsgXXGoQKFUL1Egx3
5Qex8NPJ3OkkM5ISIJrJU+BMg/0tNLEe5wLIP1aLxBsmezaGTi3OnJvfC2vfDeej
07yjtAYiHjD1jkWFCjNtWAblxNlTFMGPT5FfFolpRhBXM/7gKgGyUQxB/w+0xZFp
/oKNShd8xsnu6RWFZ2f7iLtN4BlOQMQqT/f5zTIdlwIDAQABoAAwDQYJKoZIhvcN
AQEFBQADggEBAI2wOElmUhebghfw9wXcqXiQekjk/FEfNBO7N8e+AAxOfQRkkyXB
pzqVSAbK9MxbGW3tuB2wC8var1/G6a2RntIEypXDz+cR2+sWxoH3OfQ9bT8f/5xL
TCJ5azM1O/zu3P+gbM3iytZi8D/Vw7UlpyhHMplUaueaYxvMdhrBu+InrBBv3IvJ
M4spFzZrEzGqpUrQ+2WMHGr6867+Td0J2qkpZFIkGoOdsVg/igqD6hkiOsh5PjBW
SufIOsqol5pCynbESWdvM9mLLI/3tNpig0dZMwGKEIRnZDwIjl9kCqDqvGORHOWp
X9cwvVtTZNUQAZHjCiYt/Tjlp9ovUJMaCMs=
-----END CERTIFICATE REQU
Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=JP, ST=Tokyo, L=Minato-ku, O=SSL Test Corp, OU=test-201605, CN=test.jp
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (2048 bit)
Modulus (2048 bit):
00:d0:52:98:8a:fe:ae:e6:c4:80:32:59:ff:cb:b3:
d2:b4:3d:3d:e3:fa:26:df:8d:d5:3d:cc:10:24:41:
c0:9e:a8:37:50:a3:db:c1:95:c9:62:97:7c:0f:a4:
c9:93:b7:4b:03:75:af:dd:71:ee:4e:f3:7c:48:62:
59:bb:e2:f6:8c:ae:e3:73:0a:72:f7:09:b5:89:2c:
27:93:35:b3:95:9b:ac:8d:5f:7b:ac:cc:56:4e:67:
5a:ac:00:b8:33:80:7f:58:40:26:9f:62:3c:f9:bf:
a1:d5:32:fc:4a:2d:78:43:92:58:fd:82:c8:b2:05:
d7:1a:84:0a:15:42:f5:12:0c:77:e5:07:b1:f0:d3:
c9:dc:e9:24:33:92:12:20:9a:c9:53:e0:4c:83:fd:
2d:34:b1:1e:e7:02:c8:3f:56:8b:c4:1b:26:7b:36:
86:4e:2d:ce:9c:9b:df:0b:6b:df:0d:e7:a3:d3:bc:
a3:b4:06:22:1e:30:f5:8e:45:85:0a:33:6d:58:06:
e5:c4:d9:53:14:c1:8f:4f:91:5f:16:89:69:46:10:
57:33:fe:e0:2a:01:b2:51:0c:41:ff:0f:b4:c5:91:
69:fe:82:8d:4a:17:7c:c6:c9:ee:e9:15:85:67:67:
fb:88:bb:4d:e0:19:4e:40:c4:2a:4f:f7:f9:cd:32:
1d:97
Exponent: 65537 (0x10001)
Attributes:
a0:00
Signature Algorithm: sha1WithRSAEncryption
8d:b0:38:49:66:52:17:9b:82:17:f0:f7:05:dc:a9:78:90:7a:
48:e4:fc:51:1f:34:13:bb:37:c7:be:00:0c:4e:7d:04:64:93:
25:c1:a7:3a:95:48:06:ca:f4:cc:5b:19:6d:ed:b8:1d:b0:0b:
cb:da:af:5f:c6:e9:ad:91:9e:d2:04:ca:95:c3:cf:e7:11:db:
eb:16:c6:81:f7:39:f4:3d:6d:3f:1f:ff:9c:4b:4c:22:79:6b:
33:35:3b:fc:ee:dc:ff:a0:6c:cd:e2:ca:d6:62:f0:3f:d5:c3:
b5:25:a7:28:47:32:99:54:6a:e7:9a:63:1b:cc:76:1a:c1:bb:
e2:27:ac:10:6f:dc:8b:c9:33:8b:29:17:36:6b:13:31:aa:a5:
4a:d0:fb:65:8c:1c:6a:fa:f3:ae:fe:4d:dd:09:da:a9:29:64:
52:24:1a:83:9d:b1:58:3f:8a:0a:83:ea:19:22:3a:c8:79:3e:
30:56:4a:e7:c8:3a:ca:a8:97:9a:42:ca:76:c4:49:67:6f:33:
d9:8b:2c:8f:f7:b4:da:62:83:47:59:33:01:8a:10:84:67:64:
3c:08:8e:5f:64:0a:a0:ea:bc:63:91:1c:e5:a9:5f:d7:30:bd:
5b:53:64:d5:10:01:91:e3:0a:26:2d:fd:38:e5:a7:da:2f:50:
93:1a:08:cb
デジタル署名
## デジタル署名で何ができるか?
- 改ざんやなりすましの検知
- 否認の防止
具体的に発生する行為は?
- メッセージの署名の作成
- メッセージの署名を検証
どのようにして行うか?
- 署名は署名者が秘密鍵を用いて行う。(=秘密鍵で暗号化する。)
- 署名の検証は検証者たちが公開鍵を用いて行う。(=公開鍵で復号化する。)
*基本的にメッセージに対して直接署名することはない。
(メッセージのハッシュ値に対して行う。)
よって
メッセージ⇨ハッシュ関数を通してハッシュ値作成⇨秘密鍵で署名がフローになる。
公開鍵暗号とデジタル署名の鍵の使い方について
秘密鍵 | 公開鍵 | |
---|---|---|
公開鍵暗号 | 受信者が復号化に使う | 送信者たちが暗号化に使う |
デジタル署名 | 署名者が署名の作成に使う | 検証者たちが検証に使う |
鍵は誰が持つ? | 個人が持つ | 必要な人は誰でも持っていて良い |
認証局
認証局(certification authority:CA)は証明書の管理を行う人。
発行された証明書の内容は以下のようなものが含まれる。
- 申請者(運営者情報)
- 発行者(認証局)情報
- 申請者の公開鍵
- 認証局の署名
中間証明書とルート証明書の違い
SSL接続する時ブラウザは下層から順に証明書をたどり、最上位のルート証明書までは確認して検証する。
具体的には認証局はサーバ証明書を発行するとともに、認証局の証明書も送られてくる。
もしその認証局も他の認証局から署名を受けている場合、さらにその署名を受けた認証局の証明書もつけて
送られてくる。
最終的には一番上位に位置するルート認証局と呼ばれる認証局の証明書が必ず送られてくる。
ルート証明書はあらかじめブラウザに組み込まれているので、それを照合することによって、
正当性を確認する。
ルート証明書の見方
chromeの場合で説明。
- ブラウザの設定をクリック
- 詳細設定を表示をクリック
- HTTPS/SSLの証明書の管理をクリック
暗号化
暗号化までの手順
- ユーザーがhttpsから始まるURLのリンクにアクセス
- アクセスされたwebサーバはwebブラウザにサーバ証明書を送る。証明書にはサーバの公開鍵が入っている。
- クライアントはサーバ証明書を受け取り認証を行う。
- 認証が済むとクライアントは共通鍵をサーバの公開鍵を使って暗号化する。
- サーバは自身の秘密鍵を使って共通鍵を取り出す。
認証について
クライアントはwebサーバにアクセスし、サーバ証明書を送ってもらう。
- ルート証明書の正当性の確認
送られてきた証明書にはルート証明書の署名が付いているので、ブラウザに組み込まれている署名と比較し、ルート証明書が問題ないことを確認する。 - サーバ証明書の正当性の確認
ルート認証局の署名をルート認証局の公開鍵で復号したデータとサーバ証明書のハッシュ値が一致するかを確認する。
図で見ると以下のような流れになる。
一方向性ハッシュ関数
何ができるか?
完全性を証明できる。
つまり、書き換えられたりしていないかの確認ができる。
性質
- ハッシュ値から元のメッセージを推測するのは困難
- メッセージが1ビット異なると全く異なるハッシュ値が生成される。
一方向性ハッシュ関数の例
- MD4,MD5(MD:MEssageDigestの略)
- SHA-1,SHA-256
# 証明書署名要求ファイルの作成方法
##秘密鍵の作成
opensslコマンドを用いて鍵を作成する。
$ openssl genrsa -rand `echo $RANDOM` 2048 > test-`date "+%Y%m"`.pem
0 semi-random bytes loaded
Generating RSA private key, 2048 bit long modulus
...................+++
................................................+++
e is 65537 (0x10001)
#確認
$ ls
test-201605.pem
CSRキーを作成
Country等を標準入力する。
Corp名等はテストのため適当に作成。
#CSRキー作成
$ openssl req -new -key test-201605.pem -out CSR-test-`date "+%Y%m"`.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Minato-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:SSL Test Corp
Organizational Unit Name (eg, section) []:test-201605
Common Name (e.g. server FQDN or YOUR name) []:test.jp
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
#確認
$ ls
CSR-test-201605.pem test-201605.pem