Skip to content

Commit

Permalink
Merge pull request #62 from ddddddO/verify_server_sert
Browse files Browse the repository at this point in the history
verify server certificate
ddddddO authored Sep 8, 2024

Verified

This commit was signed with the committer’s verified signature.
Aaronontheweb Aaron Stannard
2 parents 4b60f7d + b8897a3 commit 26ed04a
Showing 3 changed files with 44 additions and 12 deletions.
27 changes: 16 additions & 11 deletions cmd/debugging/tls-server/README.md
Original file line number Diff line number Diff line change
@@ -1,32 +1,37 @@
- ref: https://zenn.dev/satoken/articles/golang-tls1_2#%E4%B8%8B%E6%BA%96%E5%82%99

1. このディレクトリ配下で、以下を一度実行(Raspberry Pi)
1. [TARGET] このディレクトリ配下で、以下を一度実行(Raspberry Pi)
```console
$ mkcert my-tls.com localhost 127.0.0.1
```

1. リモート上のこのディレクトリ配下で以下(Raspberry Pi)
1. [LOCAL] TARGET ホストで mkcert 実行で生成されたルート証明書(`rootCA.pem`)を、LOCAL ホストに追加する(一度だけ. [対応時のIssue](https://github.com/ddddddO/packemon/issues/53))
- [TARGET] [mkcert で生成されたルート証明書](https://github.com/FiloSottile/mkcert?tab=readme-ov-file#installing-the-ca-on-other-systems)
- `mkcert -CAROOT` で、ルート証明書のパスわかる
- [LOCAL] [ルート証明書の追加手順](https://qiita.com/msi/items/9cb90271836386dafce3#ubuntu-1804)

1. [TARGET] このディレクトリ配下で以下(Raspberry Pi)
```console
$ go run main.go
```

1. Wireshark起動(WSL)
1. [LOCAL] Wireshark 起動(WSL)
```console
$ sudo tcpdump -U -i eth0 -w - | /mnt/c/Program\ Files/Wireshark/Wireshark.exe -k -i -
```

- `tcp.port == 10443` でfilter

1. TLS1.2の通信(WSL)をWireshakで確認できる
```console
$ echo | openssl s_client -4 -tls1_2 -cipher AES128-GCM-SHA256 -connect 192.168.10.110:10443
```

1. packemon の debug mode で、TCP 3way handshake ~ TLS handshake ~ TLS Application data の送受信までを以下コマンドで確認できる
1. [LOCAL] packemon の debug mode で、TCP 3way handshake ~ TLS handshake ~ TLS Application data の送受信までを以下コマンドで確認できる
```console
$ sudo go run cmd/packemon/*.go --send --debug --proto tcp-tls-handshake
```

- `func SendTCP3wayAndTLShandshake` (packemon/internal/debugging/networkinterface.go) の `srcPort` を実行毎に変更すること
- [LOCAL] `func SendTCP3wayAndTLShandshake` (packemon/internal/debugging/networkinterface.go) の `srcPort` を実行毎に変更すること

- [TARGET] `debugging/tls-server` 実行中に出力されるログ (`CLIENT_RANDOM 000000...`) を、ローカルの適当なファイル (`C:\packemon\key.log` とか) にコピペして、Wiresharkの「編集 > 設定 > Protocols > TLS」の「(Pre)-Master-Secret log filename」にそのファイルパスを設定後に、再度上記コマンド実行で、暗号化されているメッセージが復号されて見られる

- `debugging/tls-server` 実行中に出力されるログ (`CLIENT_RANDOM 000000...`) を、ローカルの適当なファイル (`C:\packemon\key.log` とか) にコピペして、Wiresharkの「編集 > 設定 > Protocols > TLS」の「(Pre)-Master-Secret log filename」にそのファイルパスを設定後に、再度上記コマンド実行で、暗号化されているメッセージが復号されて見られる
1. [debug] [LOCAL] OpenSSL で、TLS1.2の通信(WSL)を Wireshak で確認できる
```console
$ echo | openssl s_client -4 -tls1_2 -cipher AES128-GCM-SHA256 -connect 192.168.10.110:10443
```
2 changes: 1 addition & 1 deletion internal/debugging/send_tcp3way_tlshandshake.go
Original file line number Diff line number Diff line change
@@ -16,7 +16,7 @@ TCP 3way handshake途中にカーネルが自動でRSTパケット送るとそ
サーバのtls-serverを再起動してこの関数を実行すると成功する。tls-server停止直後、こちらにfin/ackを送ってる(clientがそれまでこの関数を実行していた時の送信元ポート宛てに)
*/
func (dnw *debugNetworkInterface) SendTCP3wayAndTLShandshake(firsthopMACAddr [6]byte) error {
var srcPort uint16 = 0xa272
var srcPort uint16 = 0xa287
var dstPort uint16 = 0x28cb // 10443
// var srcIPAddr uint32 = 0xac184fcf // 172.23.242.78 / 旧PC
var srcIPAddr uint32 = 0xac163718 // 172.22.55.24 / 新PC
27 changes: 27 additions & 0 deletions tls.go
Original file line number Diff line number Diff line change
@@ -214,6 +214,33 @@ func (c *Certificate) Validate() error {
}
log.Printf("certificate num: %d\n", len(certs))
c.certs = certs

ospool, err := x509.SystemCertPool()
if err != nil {
return err
}

log.Println("start verify server certificate")
for i := len(c.certs) - 1; i >= 0; i-- {
opts := x509.VerifyOptions{}
if len(c.certs[i].DNSNames) == 0 {
opts.Roots = ospool
} else {
opts.Roots = ospool
opts.DNSName = c.certs[i].DNSNames[0]

log.Printf("\tDNS name in server certificate: %s\n", c.certs[i].DNSNames[0])
}

if _, err := c.certs[i].Verify(opts); err != nil {
log.Println("\tfailed to verify server certificate")
return err
}
if i > 0 {
ospool.AddCert(c.certs[1])
}
}
log.Println("finish verify server certificate")
return nil
}

0 comments on commit 26ed04a

Please sign in to comment.