自定义域名+自动 https 实现原理

80 天前
 wind1986
看了一下这个帖子, https://www.v2ex.com/t/788330
需求一致, 但是就算这样的话, 我服务器是 nginx, 让用户自己上传 https 证书, 好像也很麻烦, 还得修改 nginx 配置以及配置证书, 想问问这里是否有什么简单的办法?
1382 次点击
所在节点    问与答
19 条回复
LeegoYih
80 天前
可以参考 GitHub Pages 的玩法
LeegoYih
80 天前
GitHub Pages 支持自定义域名,用的是 Let's Encrypt 的证书: https://docs.github.com/en/pages/getting-started-with-github-pages/securing-your-github-pages-site-with-https
InDom
80 天前
你帮他签发就好了,首先他肯定需要将域名 cname 给你,然后到你提供的页面输入域名绑定,你绑定的时候,就直接后台调用生成证书的脚本就好了。

至于 nginx ,你是可以自己设置的对吧。
wind1986
80 天前
@LeegoYih #2 但是这个好像还需要修改 nginx 配置, 有点麻烦, 我想让用户自己维护证书, 不想用 Let's Encrypt 的
wind1986
80 天前
@InDom 恩, 不过有点没明白 nginx 应该怎么配置
证书可以帮他生成(也可以让他自己购买上传给我)
InDom
80 天前
@wind1986 #5 简单来说,这种情况必然是脚本自动管理 nginx 了,你可以为每个域名一个 server ,里面为这个域名指向一对密钥。

例如如下:/etc/nginx/sites-enable/www_a_com.conf

server {
listen 443 ssl;
server_name www.a.com;

# 该域名的证书和私钥
ssl_certificate /etc/nginx/certs/www_a_com/cert.crt;
ssl_certificate_key /etc/nginx/certs/www_a_com/private.key;

include /etc/nginx/site-common.conf
}
leonshaw
80 天前
nginx ssl_certificate 配置可以包含变量的,把证书用域名相关的文件名存放。
wind1986
80 天前
@InDom #6 好吧, 这样感觉好麻烦了, 每次还需要新增 nginx 配置文件, 并 reload nginx
wind1986
80 天前
@leonshaw 的确, 这样稍微方便点, 不过域名貌似还是需要配置
wu00
80 天前
不一定非得 nginx 啊,那么多反代,找不出一个可以通过接口动态配置 server_name 的吗?
就算 nginx 也能装 GUI 之类的管理工具实现的吧
LeegoYih
80 天前
clf
80 天前
可以试试 caddy 做网关?支持 api 的方式热更新配置信息。
wind1986
80 天前
@wu00 类似于贴牌这种, 还是需要自动的, 不能纯手动哈哈
wind1986
80 天前
@clf 恩, 主要还是已经用了 nginx, caddy 不熟悉, 不是特别敢尝试
wind1986
80 天前
@LeegoYih #11 靠谱! 我去研究研究!
wu00
80 天前
要让 Nginx 调用 API 获取配置并进行更新,你可以使用 Nginx 自带的模块 ngx_http_lua_module 结合 Lua 脚本来实现。
下面是一个示例的 Nginx 配置,演示如何在 Lua 脚本中调用 API 获取配置并更新:

``` nginx
http {
lua_shared_dict config_cache 1m;

server {
listen 80;
server_name domainA.com;

location / {
access_by_lua_block {
-- 尝试从缓存中获取配置
local config = ngx.shared.config_cache:get("my_config")

if not config then
-- 从 API 获取配置
local res = ngx.location.capture('/api/config')
if res.status == ngx.HTTP_OK then
config = res.body
-- 缓存配置
ngx.shared.config_cache:set("my_config", config)
end
end

-- 更新 server_name
if config then
ngx.var.server_name = config
end
}

# 其他配置...
}
}
}
```


在上述示例中,使用了`ngx_http_lua_module`模块和 Lua 脚本。当请求到达 Nginx 服务器时,Lua 脚本在`access_by_lua_block`中执行。

脚本的主要逻辑是:
1. 首先,尝试从缓存中获取配置,如果缓存中存在配置,则直接使用。
2. 如果缓存中不存在配置,则通过调用`ngx.location.capture`函数来发起 HTTP 请求,获取配置。这里的`'/api/config'`是 API 的 URL 地址,你需要根据实际情况进行修改。
3. 如果 HTTP 请求返回状态为 200 OK ,则获取到配置内容,并将其缓存起来。
4. 最后,根据配置更新`server_name`的值。

这样,每当有请求到达时,Lua 脚本会尝试获取最新的配置并更新`server_name`。

请注意,该示例仅提供了基本的框架,你需要根据实际需求进行修改和调整,例如添加错误处理、身份验证和缓存策略等。另外,为了使用`ngx_http_lua_module`模块,你需要确保已经将该模块编译到你的 Nginx 中。
wind1986
80 天前
@wu00 #16 恩, 感谢, 这个还是挺方便的, 我到时候测试看看
Lax
80 天前
先问问有多少用户?

如果让用户上传,要考虑的事情就太多了。需要对上传的文件做验证,还要管理用户的密钥,每一步都有大坑
用 certbot 管理 nginx 的证书,一行命令就能搞定。lua 脚本去做动态管理,或者 caddy 之类的工具也很多。
wind1986
80 天前
@Lax 考虑自己上传, 人工校验一把, 这种一般不是很频繁, 而且设置一次就够了, 你说的这个我也去了解了解

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1016838

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX