为 UnblockNeteaseMusic Docker 服务生成自己的证书
最新的网易云客户端都需要自签证书才能被 UnblockNeteaseMusic 代理了,这篇文章就来讲讲怎么为 UnblockNeteaseMusic 的 Docker 服务生成自己的证书而不是使用开发者签发的证书和 CA。

0x00 简介

最近重新部署 UnblockNeteaseMusic 的时候发现新版客户端需要自签证书才能代理了,不然会出现连接错误。我选择的部署方式是比较方便的 Docker 部署,其默认使用的证书是由开发者生成的 CA 签名的证书,想要使用就需要导入开发者的 CA 证书。虽然我并非不信任开发者,但是同时也很难想象开发者能做到和真正 CA 同级别对私钥的保护,所以最好的方式还是自己生成一个 CA 进行签名,然后直接把 CA 私钥删除(反正这个 CA 这辈子也就只签这么一个证书)防止盗用。我使用的方法是直接在 Docker 中生成新的证书,您也可以选择其他方法替换证书,具体实现手段可以看各自需求而定。

⚠️ 即使删除 CA 私钥,信任自己生成的 CA 仍有风险,请确保认您知道自己在干什么。

这篇文章的创作既是为了方便其他想要进行同样操作的人抄作业,也是方便我以后部署的时候抄自己的作业。下面我就来讲讲都需要进行哪些操作。

0x01 部署 UnblockNeteaseMusic

ℹ️ 我的服务通过 Docker 部署在 ESXi 上的一台 Debian 11 虚拟机里。按道理说由于是 Docker 任意安装了 Docker 的环境都可以进行相同操作。

首先我们需要部署 UnblockNeteaseMusic 的 Docker 镜像。我们可以直接使用官方在 Docker Hub 的镜像进行部署。以下是我使用的命令以供参考:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
sudo docker run \
	-h=unblocknetease --name=unblocknetease \
	-p 80:8080/tcp \
	-p 443:8081/tcp \
	-p 8080 \
	-p 8081 \
	--restart=unless-stopped \
	pan93412/unblock-netease-music-enhanced

# 写成一行
sudo docker run -h=unblocknetease --name=unblocknetease -p 80:8080/tcp -p 443:8081/tcp -p 8080 -p 8081 --restart=unless-stopped pan93412/unblock-netease-music-enhanced

如果宿主上有防火墙,记得允许 80, 443, 8080 和 8081 这几个端口。如果像我一样将端口映射到了 80 和 443 则可以忽略 8080 和 8081。

0x02 重新生成证书

接下来我们需要重新生成服务的证书。首先我们通过 docker exec 命令在容器上开一个新的 shell 来在容器中执行命令。

1
sudo docker exec -it unblocknetease sh

然后我们需要来到证书的存放目录 /app/。Shell 的默认目录应该就是这里,如果不是可以手动切换过来。然后我们需要生成新的 CA 以及用 CA 签发一个新的服务器证书。您可以直接将以下代码保存为 gencert.sh 然后运行 sh gencert.sh 来自动完成所有步骤。值得注意的是,这个脚本会在生成完证书之后删除 CA 私钥来缓解 CA 私钥泄露造成 MITM 的风险。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/sh

# Install OpenSSL
apk add openssl

# Generate the CA private key
openssl ecparam -genkey -name secp384r1 -out ca.key

# Generate the CA certificate
openssl req -x509 -new -nodes -key ca.key -sha384 -days 3650 -subj "/C=CN/CN=UnblockNeteaseMusic Root CA/O=nobody" -out ca.crt

# Generate the server private key
openssl ecparam -genkey -name secp384r1 -out server.key

# Create a configuration file for the request
cat <<EOF >req.conf
[req]
distinguished_name=dn
[dn]
C=CN
L=Hangzhou
O=NetEase (Hangzhou) Network Co., Ltd
OU=IT Dept.
CN=*.music.163.com
[ext]
subjectAltName=@alt_names
[alt_names]
DNS.1=music.163.com
DNS.2=*.music.163.com
EOF

# Generate the server Certificate Signing Request (CSR)
openssl req -new -key server.key -subj "/C=CN/L=Hangzhou/O=NetEase (Hangzhou) Network Co., Ltd/OU=IT Dept./CN=*.music.163.com" -out server.csr -config req.conf -reqexts 'ext'

# Generate the server certificate using the CA
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha384 -extensions 'ext' -extfile req.conf

echo "Successfully created certificates"

# Remove redundant files, including the CA key
rm req.conf server.csr ca.srl ca.key

最后我们需要在宿主机上重启服务来让服务使用新生成的证书:

1
sudo docker restart unblocknetease

0x03 客户端配置

生成完毕之后我们需要将 ca.crt 的内容复制出来并保存到终端设备上。随后,以 Windows 为例,我们可以双击打开证书的详细页面,点击 Install Certificate... 打开证书安装向导,选择 Current User 仅为当前用户安装(因为没必要全局安装),然后点 Next 进入下一步。

随后我们需要手动选择证书安装的位置,选择第二项 Place all certificates in the following store,选择 Trusted Root Certification Authorities,然后选择确定,点击 Next 进入最后一步。最后点击 Finish 并且确认接下来的对话框来完成安装。

最后我们需要在网易云音乐客户端内设置 HTTP 代理地址为刚刚配置好的服务的 IP 和端口,点击确定套用配置,客户端重启完之后应该就可以正常使用了。其他平台的配置可参考官方文档。


最后修改于 2023-07-20