Skip to content

配置 HTTPS

TIP

请确保你已经充分理解「网络架构」章节。

生成 SSL 证书

可以在免费 SSL 的网站上,为自己的域名生成 90 天免费且可无限续签的证书:

https://ohttps.com/
https://www.mianfeissl.com/

如果你没有域名,想直接用 IP 地址访问,可以在此生成证书:

https://zerossl.com/

你也可以选择使用Let's Encrypt其他CA自签名SSL证书。注意自签名证书默认不被操作系统及浏览器信任,需要手动加入信任链。

使用OpenSSL生成自签名证书
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 365

定位配置文件位置

本教程以 Nginx 配置为例,如果使用 Apache 等其他软件则需要根据实际情况调整配置。

Nginx 配置一般位于/etc/nginx/nginx.conf 也可能根据发行版不同略有区别。

准备证书链文件

如果你使用自签名证书可忽略此步骤。

请准备以下文件:

  1. 已签发的证书,例如 domain.crt
  2. 签发证书的中级 CA,可从签发机构网站下载。例如 ca.crt
  3. 已签发证书对应的私钥,例如 domain.key

后续示例均将使用 domain.crt, ca.crt, domain.key 作为示例名。

如果你使用Nginx反向代理, 使用任意编辑器打开 domain.crtca.crt , 并将 ca.crt 的内容复制到 domain.crt 文件最下方。

准备反向代理配置文件

在开始前请确保以下文件及配置准备完毕,可根据实际情况调整:

  1. 已配置好的证书链文件及路径: /etc/nginx/ssl/domain.crt
  2. 已签发证书对应的私钥及路径: /etc/nginx/ssl/domain.key
  3. Nginx 配置文件位置: /etc/nginx/nginx.conf
  4. 未开启 SSL 的节点地址及端口: 127.0.0.1:24444
  5. 未开启 SSL 的面板地址及端口: 127.0.0.1:23333
  6. 即将开启的节点 HTTPS 端口: 12444
  7. 即将开启的面板 HTTPS 端口: 12333
  8. [如使用域名] 域名已正确解析到 IP。
  9. 防火墙或端口映射已放行端口1244412333

为节点开启反向代理

以下为示例配置,你可根据实际情况更改端口或调整配置。
更改完成后保存为daemon_https.conf文件并放入/etc/nginx/sites-enabled目录.
你也可以将配置直接放入nginx.conf文件末尾(最后一个大括号前)。
如果你有多个节点,只需以不同的端口与地址重复添加下列配置即可。

nginx
# MCSManager 守护节点
server {
	# 节点 公网HTTPS端口(可用多个listen监听多个端口)
	listen 12444 ssl http2; #IPV4
	listen [::]:12444 ssl http2; #IPv6

	# 开启HSTS 开启后将强制使用HTTPS连接节点并在取消此策略后持续一年除非在浏览器手动清除策略。
	# 默认未开启,可取消注释开启.
	#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

	# DNS服务器,仅在目标节点需要使用域名连接时需要。
	resolver 8.8.8.8;

	# 自动重定向HTTP连接至HTTPS
	error_page 497 https://$host:$server_port$request_uri;

	proxy_hide_header Upgrade;
	location / {
		# 请求头 一般无需更改
		proxy_set_header Host $host;
		proxy_set_header X-Real-Ip $remote_addr;
		proxy_set_header X-Forwarded-For $remote_addr;
		proxy_set_header REMOTE-HOST $remote_addr;

		#目标节点的地址与端口。支持使用域名及https连接。
		proxy_pass http://127.0.0.1:24444;

		# 支持反代 WebSocket
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection "upgrade";

		# 最大文件上传大小限制。设置0为不限制
		client_max_body_size 0;

		# 关闭缓存
		proxy_request_buffering off;
		proxy_buffering off;
	}
	# HTTPS 证书与私钥位置
	ssl_certificate /etc/nginx/ssl/domain.crt;
	ssl_certificate_key /etc/nginx/ssl/domain.key;

	# 传输时默认开启gzip压缩
	gzip on;

	# 传输时会被压缩的类型(应当依据文件压缩效果添加)
	gzip_types text/plain text/css application/javascript application/xml application/json;

	# 反向代理时,启用压缩
	gzip_proxied any;

	# 传输时压缩等级,等级越高压缩消耗CPU越多,最高9级,通常5级就够了
	gzip_comp_level 5;

	# 传输时大小达到1k才压缩,压缩小内容无意义
	gzip_min_length 1k;

	# intermediate configuration
	ssl_protocols TLSv1.2 TLSv1.3;
	ssl_ecdh_curve X25519:prime256v1:secp384r1;
	ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
	ssl_prefer_server_ciphers off;
	# see also ssl_session_ticket_key alternative to stateful session cache
	ssl_session_timeout 1d;
}

为面板开启反向代理

以下为示例配置,你可根据实际情况更改端口或调整配置。
更改完成后保存为web_https.conf文件并放入/etc/nginx/sites-enabled目录。
你也可以将配置直接放入nginx.conf文件末尾(最后一个大括号前)。

nginx
# MCSManager 面板
server {
	# 面板端公网HTTPS端口(可用多个listen监听多个端口)
	listen 12333 ssl http2; #IPV4
	listen [::]:12333 ssl http2; #IPv6

	# 开启HSTS 开启后将强制使用HTTPS连接面板并在取消此策略后持续一年除非在浏览器手动清除策略。
	# 默认未开启,可取消注释开启.
	#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

	# 自动重定向HTTP连接至HTTPS
	error_page 497 https://$host:$server_port$request_uri;

	proxy_hide_header Upgrade;
	location / {
		# 请求头 一般无需更改
		proxy_set_header Host $host;
		proxy_set_header X-Real-Ip $remote_addr;
		proxy_set_header X-Forwarded-For $remote_addr;
		proxy_set_header REMOTE-HOST $remote_addr;

		#目标面板的地址与端口。支持使用域名及https连接。
		proxy_pass http://127.0.0.1:23333;

		# 支持反代 WebSocket
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection "upgrade";

		# 最大文件上传大小限制。设置0为不限制
		client_max_body_size 0;

		# 关闭缓存
		proxy_request_buffering off;
		proxy_buffering off;

		# 仅允许客户端使用 HTTPS 发送 Cookie
		proxy_cookie_flags ~ secure;
	}

	# HTTPS 证书与私钥位置
	ssl_certificate /etc/nginx/ssl/domain.crt;
	ssl_certificate_key /etc/nginx/ssl/domain.key;

	# 传输时默认开启gzip压缩
	gzip on;

	# 传输时会被压缩的类型(应当依据文件压缩效果添加)
	gzip_types text/plain text/css application/javascript application/xml application/json;

	# 反向代理时,启用压缩
	gzip_proxied any;

	# 传输时压缩等级,等级越高压缩消耗CPU越多,最高9级,通常5级就够了
	gzip_comp_level 5;

	# 传输时大小达到1k才压缩,压缩小内容无意义
	gzip_min_length 1k;

	# intermediate configuration
	ssl_protocols TLSv1.2 TLSv1.3;
	ssl_ecdh_curve X25519:prime256v1:secp384r1;
	ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
	ssl_prefer_server_ciphers off;
	# see also ssl_session_ticket_key alternative to stateful session cache
	ssl_session_timeout 1d;
}

确认反向代理生效

当你完成上述配置添加后,可以使用命令sudo nginx -t来测试配置是否存在问题。

log
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

测试成功后使用命令sudo nginx -s reload 来使 Nginx 配置生效。

log
2024/01/27 22:57:17 [notice] 4826#4826: signal process started

假如域名是 domain.com ,反向代理后的端口是1233312444,那么浏览器需要使用这个地址访问:

txt
面板地址: https://domain.com:12333/
节点地址: https://domain.com:12444/

使用节点地址通过浏览器访问。如果你看到网页显示下列内容,则节点反代已正确配置。

[MCSManager Daemon] Status: OK | reference: https://mcsmanager.com/

使用面板地址通过浏览器访问。如果你看到网页显示出 MCSManager 登陆页面,则面板反代已正确配置。

配置 MCSM 使用 HTTPS 连接

此时如果你访问网页,你会发现你可以登录并且使用面板。

但是

如果你进入实例控制台界面,上传文件,下载文件等,就会发现依然无法正常使用,这是因为 MCSManager 要求浏览器能够直接连接到远程节点,由于你升级到了 HTTPS,导致浏览器拒绝使用 Websocket+HTTP 协议连接远程节点!

为什么浏览器要连接远程节点?

进入节点管理,你会发现可能是使用 localhost123.x.x.x 或其他域名连接到远程节点的,此时你必须要给每一个远程节点分别配置一次反向代理,让它们全部使用 HTTPS+Websocket 连接。

配置完成后,使用 wss://localhostwss://123.x.x.xwss://domain.com 替换原有的localhost123.x.x.xdomain.com即可。