Jinnrry/PMail

咨询以下, 其他人通过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目录下的证书, 还是一开始就不能启动,

报错是啥?

return -1, time.Now(), errors.Wrap(err)

这行报错, 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

这里 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.gotables 是程序里面直接引用了的,不能删除., 只保留这个文件和目录,是可以启动的,

我上面说了好多次了哦,
我的配置是:

{
  "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-challenge11/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/