声明:我买了emby的正版,虽然只有一个月。
Emby的一些问题:
Emby作为一款不错的Self-hosted播放器/媒体服务项目,我用了一段时间。这期间也尝试过开源版本的Jellyfin,和付费成为emby的会员。但是Emby的价格和服务让我感到不值,某些定价更让人困惑:Emby会员一个月$5,终身会员$120,这个价格已经比很多大型商业软件还要昂贵了。而Emby却大量使用开源工具,软件bug也多,收这个价格实在没有道理。另外就是Android客户端至少可以看视频,iOS客户端竟然要$5来激活,激活了也仅仅是能看视频而已,这个iOS的激活还不能带给服务器(服务器的激活可以带给iOS)。如此种种,让我想到了干脆破解算了。我支持开源软件,但是开发者不能这么瞎搞。如果iOS客户端能看视频,但某些高级功能花钱解锁,这还说得过去。要么就一视同仁,安卓端也收费。
破解思路:
很简单,Emby服务器、客户端都向 mb3admin.com
发送客户的key,获取返回的会员有效期等状态。搞一个假的验证服务器。
如果你只是要随便看看视频,那不需要再往下看了:
服务器端直接用别人破解好的docker:lovechen/embyserver 或者 xinjiawei1/emby_unlockd
配置兼容官方,只要把image换了,数据库等可以继承。
iOS端使用Surge、Shadowrocket等软件破解,方法见这篇文章。基本常见的代理软件就能实现。
Android端本来就不用交钱,凑合看看吧。
而我的要求是,在全平台(PC,Mac,Android,iOS,Web)和服务器实现免费使用会员功能,且不依赖于特定的软件(比如Shadowrocket)。
所以思路就是先搭建一个自己的认证服务器,然后所有设备统一找这个认证服务器认证。
需求:
1,对DNS有控制权
2,有一台http服务器(以nginx为例),内外网均可。
构造认证服务器 mb3admin.com
1,建立一个Nginx 反代服务器,如果没有Internet上的VPS,可以用内网的任意一台虚拟机。当然最简单的就是和Emby服务器共用一台机器,使用同一个Nginx反代就行了。
2,在你控制的DNS上,把 mb3admin.com
指向这台机器的IP。
3,nginx新建一个反向代理,主机名字就是 mb3admin.com,具体代到哪里都无所谓(反正又不是真的代),配置文件添加以下内容:
location /admin/service/registration/validateDevice { default_type application/json; return 200 '{"cacheExpirationDays": 3650,"message": "Device Valid","resultCode": "GOOD"}'; } location /admin/service/registration/validate { default_type application/json; return 200 '{"featId":"","registered":true,"expDate":"2099-01-01","key":""}'; } location /admin/service/registration/getStatus { default_type application/json; return 200 '{"deviceStatus":"","planType":"Lifetime","subscriptions":{}}'; } location /admin/service/appstore/register { default_type application/json; return 200 '{"featId": "","registered": true,"expDate": "2099-01-01","key": ""}'; } location /emby/Plugins/SecurityInfo { default_type application/json; return 200 '{SupporterKey: "", IsMBSupporter: true}'; } add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers *; add_header Access-Control-Allow-Method *; add_header Access-Control-Allow-Credentials true;
如果你是全容器化管理,那就用nginx-proxy-manager,新建一个Host,随便代理到哪里,最后在Custom里面输入这些内容。
先不要选择证书,先用http测试一遍:
http://mb3admin.com/admin/service/registration/validateDevice
如果返回:
{"cacheExpirationDays": 3650,"message": "Device Valid","resultCode": "GOOD"}
说明配置正确了。服务器返回了伪造的会员信息,剩余3650天。
*CORS 经过实测,仅为iOS设备要求,如果不需要iOS使用,可以不加CORS。
配置服务器CA、自签名证书
SSL/TLS的规则保证了我们无法获得真正的 mb3admin.com
的证书。因此我们需要自签发一套证书,并在设备上手工添加这些证书。由于当前各类设备的安全设置,通常不允许添加自签名证书,因此我们需要添加一个私有CA,用私有CA签发一套证书。
构建CA
需要一台linux主机,通常情况下可以使用emby本身的服务器,如果是NAS机器可能要 进入到”终端“。Mac或者微软系统需要安装openssl库,建议直接虚拟机安装一套Ubuntu一次性使用。
openssl genrsa -des3 -out rootCA.key 2048 #建立CA私钥,之后要求输入密码,记住密码。我这里设置为123456。 openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.pem #建立CA证书 有效期 3650天。注意:iOS不允许有效期超过825天。如果是iOS设备,应为: openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 824 -out rootCA.pem #iOS设备,有效期824天 openssl req -new -sha256 -nodes -out mb3admin.csr -newkey rsa:2048 -keyout mb3admin.key -config <(cat rootCA.csr.cnf) #生成 mb3admin.com的CSR和私钥,使用 rootCA.csr.cnf 配置 openssl x509 -req -in mb3admin.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out mb3admin.crt -days 824 -sha256 -extfile v3.ext #生成 mb3admin.com的证书,使用 v3.ext 中的配置指定服务器证书用途
其中, rootCA.scr.cnf
为CSR配置文件,内容为:
# rootCA.csr.cnf [req] default_bits = 2048 prompt = no default_md = sha256 distinguished_name = dn [dn] C=US ST=CA L=LA O=fuckemby OU=fuckemby [email protected] CN = *.mb3admin.com
v3.ext 为服务器证书用途配置文件,内容为:
# v3.ext authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment subjectAltName = @alt_names extendedKeyUsage=serverAuth [alt_names] DNS.1 = mb3admin.com
所有东西放在同一个目录里,操作下来,得到文件
rootCA.key, rootCA.pem, mb3admin.key, mb3admin.csr, mb3admin.crt
其中 mb3admin.key, mb3admin.csr
为我们使用自己的rootCA 制作的假的mb3admin.com的证书和私钥。
rootCA.pem
为rootCA的根证书,这里我给rootCA的根起名字叫”test“。
在Nginx中安装证书
把mb3admin.key, mb3admin.csr
添加到之前为mb3admin.com 设置的反代里。
接下来再各个设备中安装CA根证书。
Windows需要安装到受信任的根证书颁发机构
iOS需要添加为配置文件(办法是把rootCA.pem
想办法让手机去下载,或者通过邮件附件发给手机,然后会出现添加配置文件的说明),按照说明添加配置文件,添加证书信任。
Android同上,使用Android证书管理器加载证书并安装证书,信任。
安装后使用https协议访问刚才的API查询:
https://mb3admin.com/admin/service/registration/validateDevice
ping一下服务器:
C:\Users\user>ping mb3admin.com
正在 Ping mb3admin.com [192.168.1.200] 具有 32 字节的数据:
来自 192.168.1.200 的回复: 字节=32 时间<1ms TTL=64
这说明我们已经通过虚假的DNS把mb3admin.com成功指向了虚假的服务器,并用假证书成功完成了握手。
(知道为什么一定要吊销CNNIC的根证书了吗?——)
验证
iOS
进入iOS客户端后,点击会员验证,如果不出来就关掉重新开一下APP。
注意这个验证有效期很长,就算离开了本局域网还能用很久。如果登出会要求重新验证。
Android同上,解锁后可以用所有功能,包括歌曲播放和歌词显示。
Win、Mac
Win和Mac 都要在系统里安装完证书后(Mac安装根证书方法不赘述),打开客户端验证一遍。客户端我用的是emby在github上的安装包,不是官网的安装程序。
Web
Web的权限,在PC或Mac等桌面环境下是跟随服务器的,服务器有会员权限,Web就有会员权限。
Web在iOS上(只要User-Agent为iOS)就必须额外要会员(神经病),要么改掉UA,要么也在同一个局域网里一起被破解掉。
注意Web的Session有时限,被退出了,会要求再要验证会员,不过反正都在这一局域网了,还怕它个啥…
服务器的破解
因为现在大多数情况都是用容器安装了,所以破解起来比较麻烦,大多数情况可以使用上面提到的两款已经破解好的容器。如果怕被删了,可以commit到自己的docker账号里哦。
如果一定要自己破解容器,先下载官方容器。
思路1,替换掉官方的某些文件,直接指向一个假的验证服务器(都不需要证书)。
思路2,进到容器里,添加根证书,修改DNS,出来,commit容器,上传保存,再开。
也可以用bind挂载破解文件进容器,参考这篇
这样就实现了内网中全平台的Emby开心版,类似于内网中的KMS服务器一样。设备在获取了有效期(比如999天或者3650天)后,应该不会再向服务器请求有效期,除非登出了emby播放服务器。除了Web需要保持在内网环境中,其他设备也可以在其他地方正常使用。
iOS必须在nginx中加入CORS设定。
参考资料:
使用 Docker Compose 编排整合 emby 伪站授权
tiagofreire-pt/self-signed-certificate-with-custom-ca-for-home-assistant.md