我正在使用Akka Streams通过具有客户端证书身份验证的akka.stream.scaladsl.TLS创建TCP服务器。我正在努力创建回显服务器作为概念的第一个证明。
同时,我是Scala / Akka / Akka Streams的新手,因此我在Python中创建了类似的服务器和TCP客户端,以提供工具来测试我在Scala中的工作。 Python服务器/客户端可以使用客户端证书身份验证来运行。连接到服务器时,客户端将执行以下步骤:
我相信我已经使用Akka Streams和akka.stream.scaladsl.TLS完成了服务器,但是当我尝试使用Python客户端进行连接时,客户端再也无法通过context.wrap_socket(sock, server_hostname=host)
连接到对等端了。服务器成功绑定了TCP连接并创建了相应的IncomingConnection对象。客户端/服务器也永远不会超时(客户端只是坐在那里等待握手?)。
最大的问题是我的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当时挂起。
答案 0 :(得分:0)
Akka TLS支持在幕后使用了内置的Java TLS支持,因此要获得TLS的调试输出,您必须为此启用调试。可以通过像启动-Djavax.net.debug=all
答案 1 :(得分:0)
最终,我发现ssl-config日志记录非常稀疏,并且无助于解决我的问题。它确实提供了一些调试信息,但没有太多。要调试TLS握手,更好的方法是在运行JVM时使用-Djavax.net.debug=all
标志。但是,即使这样提供的结果也好坏参半。例如,我收到的结果错误是服务器找不到匹配的密码套件。最终,我意识到,在为密钥库/信任库创建输入流时,我错误地指定了路径。
请注意以下事项:如果您错误地指定了密钥库和信任库,则结果输入流将为null,SSLContext.init将很乐意使用它们,并提供与密钥库/信任库无关的错误!由于SSLContext中的错误处理不正确,因此很难进行故障排除。