Akka Stream TLS 服务器日志记录和故障排除

Akka Stream TLS Server Logging & Troubleshooting

我正在使用 Akka Streams 创建一个使用 akka.stream.scaladsl.TLS 和客户端证书身份验证的 TCP 服务器。我正在努力创建一个回声服务器作为第一个概念证明。

与此同时,我是 Scala/Akka/Akka Streams 的新手,因此我在 Python 中创建了一个类似的服务器和 TCP 客户端,以提供工具来测试我在 Scala 中的工作。 Python server/client 可以使用客户端证书身份验证。连接到服务器时,客户端执行以下步骤:

我相信我已经使用 Akka Streams 和 akka.stream.scaladsl.TLS 完成了服务器,但是当我尝试使用我的 Python 客户端连接时,客户端永远不会通过使用 [=11= 连接到对等方].服务器成功绑定 TCP 连接并创建相应的 IncomingConnection 对象。 client/server 也永远不会超时(客户端只是坐着等待握手?)。

我最大的问题是我看不到来自我的 TLS BidiFlow 的信息,akka.stream.scaladsl.TLS。我不知道我卡在了握手的哪一步,这使得故障排除非常困难。

有什么办法可以在整个TLS握手过程中输出一些信息吗?好像所有的功能都被封装了,不知道有没有办法解决。

否则,我正在尝试使用 openssl 进行故障排除并得到以下信息:

bash$ openssl s_client -connect myserver.com:443 -state -debug
CONNECTED(00000003)
SSL_connect:before/connect initialization
write to 0x7fd914100080 [0x7fd915001000] (318 bytes => 318 (0x13E))
0000 - 16 03 01 01 39 01 00 01-35 03 03 e3 ff 5d fb 26   ....9...5....].&
0010 - 15 e3 32 89 37 e2 cb 95-f5 00 bd df 13 3d ae a6   ..2.7........=..
0020 - d7 37 db 4e 80 19 63 ad-d6 6c f1 00 00 98 cc 14   .7.N..c..l......
0030 - cc 13 cc 15 c0 30 c0 2c-c0 28 c0 24 c0 14 c0 0a   .....0.,.(.$....
0040 - 00 a3 00 9f 00 6b 00 6a-00 39 00 38 ff 85 00 c4   .....k.j.9.8....
0050 - 00 c3 00 88 00 87 00 81-c0 32 c0 2e c0 2a c0 26   .........2...*.&
0060 - c0 0f c0 05 00 9d 00 3d-00 35 00 c0 00 84 c0 2f   .......=.5...../
0070 - c0 2b c0 27 c0 23 c0 13-c0 09 00 a2 00 9e 00 67   .+.'.#.........g
0080 - 00 40 00 33 00 32 00 be-00 bd 00 45 00 44 c0 31   .@.3.2.....E.D.1
0090 - c0 2d c0 29 c0 25 c0 0e-c0 04 00 9c 00 3c 00 2f   .-.).%.......<./
00a0 - 00 ba 00 41 c0 11 c0 07-c0 0c c0 02 00 05 00 04   ...A............
00b0 - c0 12 c0 08 00 16 00 13-c0 0d c0 03 00 0a 00 15   ................
00c0 - 00 12 00 09 00 ff 01 00-00 74 00 0b 00 04 03 00   .........t......
00d0 - 01 02 00 0a 00 3a 00 38-00 0e 00 0d 00 19 00 1c   .....:.8........
00e0 - 00 0b 00 0c 00 1b 00 18-00 09 00 0a 00 1a 00 16   ................
00f0 - 00 17 00 08 00 06 00 07-00 14 00 15 00 04 00 05   ................
0100 - 00 12 00 13 00 01 00 02-00 03 00 0f 00 10 00 11   ................
0110 - 00 23 00 00 00 0d 00 26-00 24 06 01 06 02 06 03   .#.....&.$......
0120 - ef ef 05 01 05 02 05 03-04 01 04 02 04 03 ee ee   ................
0130 - ed ed 03 01 03 02 03 03-02 01 02 02 02 03         ..............
SSL_connect:unknown state

此时 openssl 挂起。

Akka TLS 支持在幕后使用内置的 Java TLS 支持,因此要获得 TLS 的调试输出,您必须为其启用调试。可以通过在启动时将系统 属性 传递给 JVM 来完成 -Djavax.net.debug=all

最终我发现 ssl-config 日志记录非常少,对解决我的问题没有帮助。它确实提供了一些调试信息,但不多。调试 TLS 握手更好的方法是在 运行 JVM 时使用 -Djavax.net.debug=all 标志。然而,即使这样也提供了不同的结果。例如,我收到的结果错误是服务器找不到匹配的密码套件。最终我解决了我的问题,因为我意识到在为我的 keystore/truststore 创建输入流时我指定的路径不正确。

遇到此问题的任何人请注意:如果您错误地指定了密钥库和信任库,则生成的输入流将为空,SSLContext.init 将愉快地使用它们并提供与 keystore/truststore!由于 SSLContext 中的错误处理不正确,这很难解决。