公開鍵暗号の体系を完全に理解した

はい、鍵交換アルゴリズム、署名アルゴリズム、暗号アルゴリズム、暗号モード、ハッシュ の5つのセット(暗号スイート)を指定して通信を暗号化する。それが、俺が知っている暗号体系の全てです。

でですね、openVPNでクライアントとサーバの通信を暗号化しますよね。 その時に色々と証明書を発行すると思うんですよ。ただ、俺はどの証明書がどのように用いられるのかが全くわかっていなかった。 だから、今回、改めてopenVPNでクライアントとサーバを構築する際の証明書の役割などを確認したいと思う。

過去の僕の記事

basic client site to site routeing

いつも参考にしている記事

qiita

では追っていきましょう

  1. 認証局 (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
  1. CA証明書の生成
$ ./easyrsa build-ca

パスフレーズが聞かれる。

ここで、秘密鍵と公開鍵がすでに生成されている。認証局のね

  1. サーバ証明書の生成
$ ./easyrsa build-server-full server nopass

ここで、CA証明書を生成したときのパスフレーズを再び入力する。 これでおそらく、サーバの公開鍵に署名がされる。(CSRも済んでいる)

  1. DH鍵の生成 ここでDH鍵が生成されるのか。なぜだ??TLSでのDH鍵は毎回違うものが使われるのではないのか!? なるほど、chatGPTに聞いたのであっているかはわからんが、この段階で生成されるものは、DHパラメータ(素数と生成元)だね。 これは納得だね。 つまり、
y = g ^ (x) mod p 

の、pとgが生成される。で、サーバとクライアントはお互い適当にxを選ぶわけですわ。はい完全理解。 ちなみに、ecdhを使って鍵交換をすることもできます。

  1. 証明書失効リストの生成(こちら、参照しているページでは間違っているので注意が必要)
$ ./easyrsa gen-crl

こちらも、CAの秘密鍵で署名するわけですね。

  1. クライアント用秘密鍵の生成
$ 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

素晴らしい。

通信が始まる瞬間

  1. 鍵交換 サーバがあらかじめ用意しておいたg,pをクライアントに渡すわけですね。 で、お互い公開鍵を生成して、相手に渡すわけです。この時点ではまだ、サーバは通信相手が 許可されたクライアントなのかの判断がついていないわけですね。恐ろしいですわ。

  2. 公開鍵への署名(お互い) で、相手がCAによって許可された相手であることを確認するために、自分の公開鍵に署名するわけですね。 自分の秘密鍵で。お互いですよね。お互い自分の秘密鍵で署名するわけです。

  3. 公開鍵の検証 そして、お互い、相手の公開鍵(証明書)で検証するんですよね。この公開鍵はCAによって認証されていることがCAの証明書を見ればわかるけですね。 で、改竄がないかを確認できると。 お互い、相手の存在を確認できましたと。mTLS。

  4. 共通鍵の生成 ここまで来れば、DHでプリマスターしクレットを交換できているわけなので、 PRFでマスターしクレットの生成、からの共通鍵の生成。でいけるわけですわ。

openVPNは素晴らしい

何をやっているのか理解できるとマジで楽しい。いい勉強材料でした。 あざした。