咨询以下, 其他人通过stmp 465 发送的时候出现了错误,是什么情况呢
Closed this issue · 40 comments
错误日志是:
smtp/server 2023/11/23 16:08:43 handler error: remote error: tls: bad certificate
smtp/server 2023/11/23 16:09:08 handler error: remote error: tls: bad certificate
smtp/server 2023/11/23 16:09:44 handler error: remote error: tls: bad certificate
这个是因为证书问题吗,这个是要更新哪个证书呢,.
https://github.com/Jinnrry/PMail/blob/master/server/services/setup/ssl/ssl.go#L158C60-L158C60
你参考这个方法,把你证书信息打出来看了呢,这个变量里面有证书匹配的域名、过期时间等详细信息。看看你证书是不是有问题
你再检查下你证书的证书链是否完整
我是没有重新证书,但是怎么触发重新生成新证书呢? 删除证书目录, 最开始程序都不能启动了. "isInit": false
的时候
你之前的证书是PMail生成的还是自己的?
之前没有证书,啥也没有,
我想通过 setup 的时候自动生成, 但是启动的时候没有ssl目录都不能启动, 这个逻辑感觉有点不对一样.
额。。确实有问题,我改了一版,现在启动前会先检查。
我启动的时候,dkim
目录是空的, ssl
目录是原始的证书, config.json 是{ "isInit": false}
, 打开网页后,删除掉ssl
目录的证书文件, 然后网页上下一步一直点,到最后SSL设置的时候,等了十几秒,返回了错误, 这是什么情况呢?
域名也都解析生效了.
smtp的A记录
pop的A记录
mail的A记录.
MX ,2个TXT都解析了.
日志显示是 http://mail.xxx.com/.well-known/acme-challenge/FNzrraEDYfalAkccsoVsC5bF98MyILchgTHoukyIhVc
这个返回是404. Invalid response
但是 mail.xxx.com
,smtp.xxx.com
,pop.xxx.com
都能访问到安装首页, 这个问题是什么呢
你PMail前面还有前置网关吗?
我是在docker容器中运行的, 网页80,443端口是 nginx 反向代理的, 25,465,110,995是可以直接访问的
你80和443的转发规则咋写的
nginx中绑定了三个域名 mail.xxx.com
,smtp.xxx.com
,pop.xxx.com
, 反向代理到容器 127.0.0.1:8080
location ^~ / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
add_header X-Cache $upstream_cache_status;
}
nginx的匹配我不太熟,我不确定你这个规则会不会命中http://mail.xxx.com/.well-known/acme-challenge/FNzrraEDYfalAkccsoVsC5bF98MyILchgTHoukyIhVc
这个路由,我nginx里面ACM挑战部分写的是这样的
location /.well-known/{
proxy_pass http://pmail:80;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
搜了下感觉应该能匹配到,你能直接运行下最新的代码吗,我加了个log日志
我同步代码后, 删除掉ssl目录下的证书, 还是一开始就不能启动,
报错是啥?
PMail/server/services/setup/ssl/ssl.go
Line 157 in 74e5acb
这行报错,
ENOENT (2)
我现在启动的时候,dkim目录是空的, ssl目录是空的, config.json 是{ "isInit": false}
ssl目录为空,这里抛异常是符合预期的。上层拿到这里的error应该会重新生成证书才对
有完整的报错堆栈吗
这是错误日志:
[info][2023-11-23 19:27:40][/mnt/d/GO_Project/eMailServer/server/main.go:76]***************************************************
[info][2023-11-23 19:27:40][/mnt/d/GO_Project/eMailServer/server/main.go:77]*** S
erver Start Success Version:2.3.4
[info][2023-11-23 19:27:40][/mnt/d/GO_Project/eMailServer/server/main.go:81]***************************************************
[info][2023-11-23 19:27:40][/mnt/d/GO_Project/eMailServer/server/res_init/init.go:25]Please click http://127.0.0.1 to continue.
panic: at /mnt/d/GO_Project/eMailServer/server/services/setup/ssl/ssl.go:157
open config/ssl/public.crt: no such file or directory
goroutine 5 [running]:
pmail/cron_server.sslCheck()
/mnt/d/GO_Project/eMailServer/server/cron_server/ssl_update.go:38 +0x42f
created by pmail/cron_server.Start in goroutine 19
/mnt/d/GO_Project/eMailServer/server/cron_server/ssl_update.go:28 +0xb7
PMail/server/services/setup/ssl/ssl.go
Line 152 in 74e5acb
这里 panic 了
怪了,152行和157行这里看起来都不应该有panic呀。152行panic的话不应该是是publc.crt找不到。157这里是向上return错误,也不应该有panic才对
不过看你这个路径,你似乎是在WSL里面运行的?
是的wsl里运行的, 路径是是相对路径没问题的, 这个报错就是说找不到 config/ssl/public.crt
文件啊, 我是删除了这个文件啊, 打算重新生成新的
你按照这样能启动吗?
dkim目录是空的
ssl目录是空的
config.json 内容是{ "isInit": false}
ssl 目录里面放上证书, 就不会 panic了,
直接把config整个目录删了能启动吗
额。。你配置文件贴上来看看呢,你是不是设置的非自动更新SSL证书?
config 目录里面有 config.go
和 tables
是程序里面直接引用了的,不能删除., 只保留这个文件和目录,是可以启动的,
我上面说了好多次了哦,
我的配置是:
{
"isInit": false
}
dkim目录是空的
ssl目录是空的
config.json 内容是{ "isInit": false}
这个是标识配置文件初始化是否完成的变量。
sslType
字段才是标识证书更新方式的
我上面说了好多次了哦, 我的配置是:
{ "isInit": false }
dkim目录是空的 ssl目录是空的 config.json 内容是{ "isInit": false}
你是整个文件就这一行?
是的,配置初始就一行, 看来是不能这样子.
我复现出来了,你应该是之前启动过,但是当时启动没配置成功吧,留了个文件,但是配置文件又不完整
config.json 需要怎么搞,直接删除掉吗?
这个版本兼容了config.json不完整的情况
我现在是删除掉了, config.json, 生成出来的是这样的: 这是我手动格式化的, 保存的时候应该要美化保存就好了,
logLevel 默认应该是 debug 就好了, 现在是空的.不知道是什么级别
{
"logLevel": "",
"domain": "xxxxx.com",
"domains": null,
"webDomain": "mail.xxxxx.com",
"dkimPrivateKeyPath": "config/dkim/dkim.priv",
"sslType": "0",
"SSLPrivateKeyPath": "config/ssl/private.key",
"SSLPublicKeyPath": "config/ssl/public.crt",
"dbDSN": "pmail:123123@tcp(mysql:3306)/pmail?parseTime=True\u0026loc=Local",
"dbType": "mysql",
"httpsEnabled": 0,
"spamFilterLevel": 0,
"httpPort": 0,
"httpsPort": 0,
"weChatPushAppId": "",
"weChatPushSecret": "",
"weChatPushTemplateId": "",
"weChatPushUserId": "",
"tgBotToken": "",
"tgChatId": "",
"isInit": false
}
空是默认值,日志级别为info
生成证书的时候还是不行,
这样正常访问不会有日志:http://mail.xxxx.com/.well-known/aaacme-challenge/hwiO_MmBr7vmaAm1wzQ5TROZIGQuGmrTfPY0079KpBg
手动在中间加了个11就可以打印出日志: http://mail.xxxx.com/.well-known/aaacme-challenge
11/hwiO_MmBr7vmaAm1wzQ5TROZIGQuGmrTfPY0079KpBg
[info][2023-11-23 20:17:01][/home/runner/work/PMail/PMail/server/controllers/setup.go:17]AcmeChallenge: /.well-known/aaacme-challenge11/hwiO_MmBr7vmaAm1wzQ5TROZIGQuGmrTfPY0079KpBg
反向代理这样配置好像就行了,刚刚少了一个斜杠: proxy_pass http://127.0.0.1:58080/;
加了后面这个斜杠
location ^~ / {
proxy_pass http://127.0.0.1:58080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
add_header Cache-Control no-cache;
}
过几小时再试试看了, 现在返回有错误日志了
:: POST :: https://acme-v02.api.letsencrypt.org/acme/new-acct :: urn:ietf:params:acme:error:rateLimited :: Error creating new account :: too many registrations for this IP: see https://letsencrypt.org/docs/too-many-registrations-for-this-ip/