![在 Linux 上使用 stunnel 进行自签名证书](https://linux22.com/image/1590189/%E5%9C%A8%20Linux%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20stunnel%20%E8%BF%9B%E8%A1%8C%E8%87%AA%E7%AD%BE%E5%90%8D%E8%AF%81%E4%B9%A6.png)
我正在尝试通过 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
是一个转移注意力的借口。