公開鍵暗号の体系を完全に理解した
はい、鍵交換アルゴリズム、署名アルゴリズム、暗号アルゴリズム、暗号モード、ハッシュ の5つのセット(暗号スイート)を指定して通信を暗号化する。それが、俺が知っている暗号体系の全てです。
でですね、openVPNでクライアントとサーバの通信を暗号化しますよね。 その時に色々と証明書を発行すると思うんですよ。ただ、俺はどの証明書がどのように用いられるのかが全くわかっていなかった。 だから、今回、改めてopenVPNでクライアントとサーバを構築する際の証明書の役割などを確認したいと思う。
過去の僕の記事
basic client site to site routeing
いつも参考にしている記事
では追っていきましょう
- 認証局 (CA) の設立 ここから始まっているっぽいんだよね。
$ ./easyrsa init-pki
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: path/to/easy-rsa/easyrsa3/pki
- CA証明書の生成
$ ./easyrsa build-ca
パスフレーズが聞かれる。
ここで、秘密鍵と公開鍵がすでに生成されている。認証局のね
- サーバ証明書の生成
$ ./easyrsa build-server-full server nopass
ここで、CA証明書を生成したときのパスフレーズを再び入力する。 これでおそらく、サーバの公開鍵に署名がされる。(CSRも済んでいる)
- DH鍵の生成 ここでDH鍵が生成されるのか。なぜだ??TLSでのDH鍵は毎回違うものが使われるのではないのか!? なるほど、chatGPTに聞いたのであっているかはわからんが、この段階で生成されるものは、DHパラメータ(素数と生成元)だね。 これは納得だね。 つまり、
y = g ^ (x) mod p
の、pとgが生成される。で、サーバとクライアントはお互い適当にxを選ぶわけですわ。はい完全理解。 ちなみに、ecdhを使って鍵交換をすることもできます。
- 証明書失効リストの生成(こちら、参照しているページでは間違っているので注意が必要)
$ ./easyrsa gen-crl
こちらも、CAの秘密鍵で署名するわけですね。
- クライアント用秘密鍵の生成
$ cd easy-rsa/easyrsa3
$ ./easyrsa build-client-full username
はい、ここでクライアントの証明書と秘密鍵を生成するわけですね。 で、証明書はCAが認証する必要があるので、再びパスフレーズを入れる感じになります。
openvpnサーバの設定はこうなります。
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
crl-verify crl.pem
ifconfig-pool-persist ipp.txt
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "route 10.8.0.0 255.255.255.0"
push "dhcp-option DNS 8.8.8.8"
client-to-client
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn-status.log
log /var/log/openvpn.log
log-append /var/log/openvpn.log
verb 3
素晴らしい。
通信が始まる瞬間
鍵交換 サーバがあらかじめ用意しておいたg,pをクライアントに渡すわけですね。 で、お互い公開鍵を生成して、相手に渡すわけです。この時点ではまだ、サーバは通信相手が 許可されたクライアントなのかの判断がついていないわけですね。恐ろしいですわ。
公開鍵への署名(お互い) で、相手がCAによって許可された相手であることを確認するために、自分の公開鍵に署名するわけですね。 自分の秘密鍵で。お互いですよね。お互い自分の秘密鍵で署名するわけです。
公開鍵の検証 そして、お互い、相手の公開鍵(証明書)で検証するんですよね。この公開鍵はCAによって認証されていることがCAの証明書を見ればわかるけですね。 で、改竄がないかを確認できると。 お互い、相手の存在を確認できましたと。mTLS。
共通鍵の生成 ここまで来れば、DHでプリマスターしクレットを交換できているわけなので、 PRFでマスターしクレットの生成、からの共通鍵の生成。でいけるわけですわ。
openVPNは素晴らしい
何をやっているのか理解できるとマジで楽しい。いい勉強材料でした。 あざした。