在 Linux 上使用 stunnel 进行自签名证书

在 Linux 上使用 stunnel 进行自签名证书

我正在尝试通过 ubuntu 18.04 上的 stunnel 5.44 连接到应用程序。我正在使用适用于 Windows 和 MacOS 的设置的配置。客户端似乎由于使用自签名证书而拒绝授权。

以下是编辑后的配置:


[我的应用]

客户端 = 是

接受 = 10076

连接 = myserver.mydomain.com:10073

验证 = 4

CAfile = /etc/stunnel/stunnel.pem

证书 = /etc/stunnel/stunnel.pem


这是启动stunnel时的日志:


5月3日 08:53:54 kerzanoserv stunnel: LOG7[ui]: 允许的客户端数=500

5月3日 08:53:54 kerzanoserv stunnel:LOG5[ui]:x86_64-pc-linux-gnu 平台上的 stunnel 5.44

5 月 3 日 08:53:54 kerzanoserv stunnel: LOG5[ui]: 使用 OpenSSL 1.1.0g 编译/运行 2017 年 11 月 2 日

5 月 3 日 08:53:54 kerzanoserv stunnel:LOG5[ui]:线程:PTHREAD 套接字:POLL、IPv6、SYSTEMD TLS:ENGINE、FIPS、OCSP、PSK、SNI Auth:LIBWRAP

5月3日 08:53:54 kerzanoserv stunnel: LOG7[ui]: errno: (*__errno_location ())

5月3日 08:53:54 kerzanoserv stunnel:LOG5[ui]:从文件 /etc/stunnel/stunnel.conf 读取配置

5月3日 08:53:54 kerzanoserv stunnel:LOG5[ui]:未检测到UTF-8字节顺序标记

5 月 3 日 08:53:54 kerzanoserv stunnel:LOG5[ui]:FIPS 模式已禁用

5月3日 08:53:54 kerzanoserv stunnel: LOG7[ui]: 压缩已禁用

5 月 3 日 08:53:54 kerzanoserv stunnel:LOG7[ui]:从 /home/eoin/.rnd 中获取了 64 个随机字节

5 月 3 日 08:53:54 kerzanoserv stunnel:LOG7[ui]:向 /home/eoin/.rnd 写入 1024 个新的随机字节

5月3日 08:53:54 kerzanoserv stunnel: LOG7[ui]: PRNG 已成功播种

5月3日 08:53:54 kerzanoserv stunnel:LOG6[ui]:初始化服务 [ledbestDO]

5 月 3 日 08:53:54 kerzanoserv stunnel:LOG7[ui]:密码:HIGH:!DH:!aNULL:!SSLv2

5 月 3 日 08:53:54 kerzanoserv stunnel:LOG7[ui]:TLS 选项:0x02020004 (+0x02000000,-0x00000000)

5月3日 08:53:54 kerzanoserv stunnel:LOG6[ui]:从文件加载证书:/etc/stunnel/stunnel.pem

5月3日 08:53:54 kerzanoserv stunnel:LOG6[ui]:证书从文件加载:/etc/stunnel/stunnel.pem

5月3日 08:53:54 kerzanoserv stunnel:LOG6[ui]:从文件加载私钥:/etc/stunnel/stunnel.pem

5月3日 08:53:54 kerzanoserv stunnel:LOG6[ui]:从文件加载私钥:/etc/stunnel/stunnel.pem

5月3日 08:53:54 kerzanoserv stunnel: LOG7[ui]: 私钥检查成功

5月3日 08:53:54 kerzanoserv stunnel: LOG5[ui]: 配置成功

5月3日 08:53:54 kerzanoserv stunnel: LOG7[ui]: 绑定服务 [myapp]

5月3日 08:53:54 kerzanoserv stunnel:LOG7[ui]:已创建监听文件描述符(FD=7)

5 月 3 日 08:53:54 kerzanoserv stunnel:LOG7[ui]:在接受套接字上设置选项 SO_REUSEADDR

5月3日 08:53:54 kerzanoserv stunnel:LOG7[ui]:服务 [myapp] (FD=7) 绑定至 0.0.0.0:10076

5月3日 08:53:54 kerzanoserv stunnel:LOG7[main]:创建了 pid 文件 /var/run/stunnel4.pid

5月3日 08:53:54 kerzanoserv stunnel:LOG7[cron]:Cron线程已初始化


当我尝试通过此隧道通过 python 建立 websocket 连接时,以在 Windows 上运行的方式,我收到以下 stunnel 日志:


5月3日 09:29:56 kerzanoserv stunnel:LOG7[main]:找到1个就绪文件描述符

5月3日 09:29:56 kerzanoserv stunnel:LOG7[main]:FD=4 events=0x2001 revents=0x0

5月3日 09:29:56 kerzanoserv stunnel:LOG7[main]:FD=7 events=0x2001 revents=0x1

5 月 3 日 09:29:56 kerzanoserv stunnel:LOG7[main]:服务 [myapp] 已从 127.0.0.1:41880 接受(FD=3)

5 月 3 日 09:29:56 kerzanoserv stunnel:LOG7[0]:服务 [myapp] 已启动

5 月 3 日 09:29:56 kerzanoserv stunnel:LOG7[0]:在本地套接字上设置了选项 TCP_NODELAY

5月3日 09:29:56 kerzanoserv stunnel:LOG5[0]:服务[myapp]接受来自127.0.0.1:41880的连接

5月3日 09:29:56 kerzanoserv stunnel:LOG6[0]:s_connect:正在连接:10073

5月3日 09:29:56 kerzanoserv stunnel: LOG7[0]: s_connect: s_poll_wait:10073:等待 10 秒

5月3日 09:29:56 kerzanoserv stunnel:LOG5[0]:s_connect:已连接:10073

5月3日 09:29:56 kerzanoserv stunnel:LOG5[0]:服务[myapp]从192.168.1.26:36406连接远程服务器

5 月 3 日 09:29:56 kerzanoserv stunnel:LOG7[0]:在远程套接字上设置了选项 TCP_NODELAY

5 月 3 日 09:29:56 kerzanoserv stunnel:LOG7[0]:远程描述符 (FD=8) 已初始化

5月3日 09:29:56 kerzanoserv stunnel:LOG6[0]:SNI:发送服务器名称:myserver.mydomain.com

5 月 3 日 09:29:56 kerzanoserv stunnel:LOG6[0]:需要对等证书

5 月 3 日 09:29:56 kerzanoserv stunnel:LOG7[0]:TLS 状态(连接):SSL 初始化之前

5 月 3 日 09:29:56 kerzanoserv stunnel:LOG7[0]:TLS 状态(连接):SSLv3/TLS 写入客户端 hello

5 月 3 日 09:29:56 kerzanoserv stunnel:LOG7[0]:TLS 状态(连接):SSLv3/TLS 写入客户端 hello

5 月 3 日 09:29:56 kerzanoserv stunnel:LOG7[0]:TLS 状态(连接):SSLv3/TLS 读取服务器 hello

5 月 3 日 09:29:56 kerzanoserv stunnel:LOG7[0]:验证开始于深度 = 0:C = PL、ST = 马佐维亚省、L = 华沙、O = Stunnel Developers、OU = 临时 CA、CN = localhost

5月3日 09:29:56 kerzanoserv stunnel:LOG4[0]:CERT:预验证错误:自签名证书

5 月 3 日 09:29:56 kerzanoserv stunnel:LOG4[0]:深度 = 0 时被 CERT 拒绝:C = PL、ST = 马佐维亚省、L = 华沙、O = Stunnel Developers、OU = 临时 CA、CN = localhost

5 月 3 日 09:29:56 kerzanoserv stunnel:LOG7[0]:删除会话回调

5 月 3 日 09:29:57 kerzanoserv stunnel:LOG7[0]:TLS 警报(写入):致命:未知 CA

5 月 3 日 09:29:57 kerzanoserv stunnel:LOG3[0]:SSL_connect:1416F086:错误:1416F086:SSL 例程:tls_process_server_certificate:证书验证失败

5 月 3 日 09:29:57 kerzanoserv stunnel:LOG5[0]:连接重置:向 TLS 发送了 0 个字节,向套接字发送了 0 个字节

5 月 3 日 09:29:57 kerzanoserv stunnel:LOG7[0]:为会话连接地址释放应用程序特定数据

5 月 3 日 09:29:57 kerzanoserv stunnel:LOG7[0]:远程描述符 (FD=8) 已关闭

5月3日 09:29:57 kerzanoserv stunnel: LOG7[0]: 本地描述符 (FD=3) 已关闭

5月3日 09:29:57 kerzanoserv stunnel: LOG7[0]: 服务 [myapp] 完成 (剩余 0 个)


我不是 stunnel 或证书方面的专家,所以不确定发生了什么。我尝试将我的 .pem 文件作为受信任的证书添加到 /etc/ssl/certs/ 中,但这并没有解决问题。

这很令人恼火且难以理解,有人可以帮忙吗?

非常感谢,Kerzane。


这是我设置 verify = 0 时的日志输出:


5月3日 16:19:09 kerzanoserv stunnel:LOG7[main]:找到1个就绪文件描述符

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[main]:FD=4 events=0x2001 revents=0x0

5月3日 16:19:09 kerzanoserv stunnel:LOG7 [main]:FD = 7 events = 0x2001 revents = 0x1

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[main]:服务 [myapp] 已从 127.0.0.1:48238 接受(FD=3)

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:服务 [myapp] 已启动

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:在本地套接字上设置选项 TCP_NODELAY

5月3日 16:19:09 kerzanoserv stunnel:LOG5[0]:服务[myapp]接受来自127.0.0.1:48238的连接

5月3日 16:19:09 kerzanoserv stunnel:LOG6[0]:s_connect:连接*:10073

5月3日 16:19:09 kerzanoserv stunnel:LOG7[0]:s_connect:s_poll_wait *:10073:等待10秒

5月3日 16:19:09 kerzanoserv stunnel:LOG5[0]:s_connect:已连接*:10073

5月3日 16:19:09 kerzanoserv stunnel:LOG5[0]:服务[myapp]从192.168.1.26:42764连接远程服务器

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:在远程套接字上设置了选项 TCP_NODELAY

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:远程描述符 (FD=8) 已初始化

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG6[0]:SNI:发送服务器名称:myserver.mydomain.com

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG6[0]:不需要对等证书

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:TLS 状态(连接):SSL 初始化之前

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:TLS 状态(连接):SSLv3/TLS 写入客户端 hello

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:TLS 状态(连接):SSLv3/TLS 写入客户端 hello

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:TLS 状态(连接):SSLv3/TLS 读取服务器 hello

5月3日 16:19:09 kerzanoserv stunnel:LOG6[0]:证书验证已禁用

5 月 3 日 16:19:09 kerzanoserv stunnel:消息重复 2 次:[LOG6[0]:证书验证已禁用]

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:TLS 状态(连接):SSLv3/TLS 读取服务器证书

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:TLS 状态(连接):SSLv3/TLS 读取服务器密钥交换

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG6[0]:客户端 CA:C=PL、ST=马佐维亚省、L=华沙、O=Stunnel Developers、OU=临时 CA、CN=localhost

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:TLS 状态(连接):SSLv3/TLS 读取服务器证书请求

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:TLS 状态(连接):SSLv3/TLS 读取服务器完成

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:TLS 状态(连接):SSLv3/TLS 写入客户端证书

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:TLS 状态(连接):SSLv3/TLS 写入客户端密钥交换

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:TLS 状态(连接):SSLv3/TLS 写入证书验证

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:TLS 状态(连接):SSLv3/TLS 写入更改密码规范

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:TLS 状态(连接):SSLv3/TLS 写入完成

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:TLS 警报(已读):致命:未知 CA

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:删除会话回调

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG3[0]:SSL_connect:14094418:错误:14094418:SSL 例程:ssl3_read_bytes:tlsv1 警报未知 ca

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG5[0]:连接重置:0 字节发送到 TLS,0 字节发送到套接字

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:为会话连接地址释放应用程序特定数据

5 月 3 日 16:19:09 kerzanoserv stunnel:LOG7[0]:远程描述符 (FD=8) 已关闭

5月3日 16:19:09 kerzanoserv stunnel:LOG7[0]:本地描述符(FD=3)已关闭

5月3日 16:19:09 kerzanoserv stunnel: LOG7[0]: 服务 [myapp] 完成 (剩余 0 个)

答案1

您的配置当前将 /etc/stunnel/stunnel.pem 指向为 CA 和本地证书。这是故意的吗(双方使用相同的证书/CA?)。我认为不是...

您应该:

  • 设置 verify = 0 以忽略证书验证(当然不推荐在生产环境中使用)。

  • 或者更改 CAfile 选项,使其指向您复制/粘贴对等 CA 证书的文件(全部在一个文件中)。

  • 或者使用 CApath 选项而不是 CAfile,并复制到对等 CA 证书文件(每个 CA 一个文件)

答案2

我最近遇到了同样的问题,客户的客户端证书过期后,他们提供了一个新的证书来替换它。

我应该意识到问题的根源,因为错误从certificate has expired变为CERT: Pre-verification error: self signed certificate然后改回当我把他们的旧证书放回原处时CAFile

tcpdump只有在用来捕获和检查客户端发送的证书之后,我才真正意识到......客户端在握手期间仍在发送旧证书。

所以在我看来,这个stunnel错误是误导性的:当然,证书是自签名的,但真正的问题是它不在受信任证书列表中。这Pre-verification error: self signed certificate是一个转移注意力的借口。

相关内容