前不久,我搭建了一个Emby服务器使用,使用体验是真D好,但是其客户端除Web版都受到了不同程度的限制,最为影响的便是只能播放一分钟了吧...虽然Web界面的体验可以说是非常完整,不必客户端差到哪里去,但是一旦涉及到播放之类的体验,Web客户端显得很弱鸡。

我使用搭载iOS13.3的iPhoneXR,在Safari与AppStore下载到的Emby客户端同时播放一份4K H264的视频,根据播放统计信息,Web客户端居然因为分辨率不匹配导致转码了(这里的转码可都是在服务器上的)并且ASS字幕也很卡。而客户端就丝滑如defu。

那为什么不用客户端呢?客户端全家桶要钱的啊!!而且还不便宜,我为什么不去开大会员呢???由此相对客户端下手。

1月19日更新:已经修正了多处问题,并且已经测试iOS客户端可正常使用

分析

使用工具抓包,发现Emby客户端访问了一个外部站点mb3admin.com会请求一些东西,然后返回了:

{
  "message" : "Device Not Registered",
  "cacheExpirationDays" : 7,
  "resultCode" : "NOTREG"
}

这里应该就是判断客户端是否被授权的响应了。值得注意的是,客户端的请求带上了服务器ID、客户端ID等其他客户端信息。这令我想起了之前参阅Emby Premiere规则时看到的,单个Key至多支持25台设备,我之前看到网上有不少Emby合车的人,但是他们都是10人车,我还纳闷为啥不25人车?(顺便一提,Emby Premiere永久价格大概是815块大洋。)如果是按照客户端来计算激活设备的话,并且还要算上服务器激活一台的话,那么10人车每个人只能享受2台设备的样子?(一台服务器,一个手机)那客户端发过去的设备ID是随机的,我刷个机或者怎么样就变一个id,这25台设备还不是一下自就造完了...

回到正题,后来查阅资料,也着手分析了一下Emby的Windows版本(是个Electron应用),我们只需要让客户端请求后得到如下返回:

{
    "cacheExpirationDays": 7,
    "message": "Device Valid",
    "resultCode": "GOOD",
}

即可。既然不方便对客户端下手,那我们来搭建一个伪站吧。
据自己测试,客户端会缓存授权信息,猜测应该和cacheExpirationDays有关,也许和KMS一样的操作,我现在设置成365了。。。不过经测试,激活一次后使用流量可正常使用:

搭建伪站

一些准备

你只需要一个能访问的Web服务器就行,本文使用Nginx
一个装有OpenSSL的设备,当然你也可以不用
Emby客户端,其实这个你不要也可以(逃

建立一个站点

新建一个域名为mb3admin.com的站点就行,
然后只需要配置伪静态。Apache服务器请自行寻找相关资料,目的就是直接让Nginx返回我们需要的JSON
这里我提供我写的伪静态,如果你有更好的...

location / {
    default_type application/json;
    return 200 '{"cacheExpirationDays": 365,"message": "Device Valid","resultCode": "GOOD"}';
}

保存后,到浏览器内测试访问一下http://mb3admin.com/admin/service/registration/666
正常返回我们要的json即成功。

签发证书

这里我会详细介绍如何签发自己的证书,当然你可以跳过这一步,直接到文件末尾下载我生成好的证书。
这里我提供三种方法,前一种是自己动手,第二种是超级省事,翻到文章末尾是粘贴复制(逃

使用OpenSSL进行签发

生成CA请求并签名

使用命令openssl req -x509 -new -nodes -key ca.key -days 3650 -subj "/C=JP/ST=Japan/L=Japan/O=Emby/CN=mb3admin.com" -out ca.pem
一步到位。
这样就会在当前路径下签出一张CA证书与CA密钥,如果懂一点点的话可以按需要修改其中的参数。

请求服务器证书

使用命令openssl req -newkey rsa:2048 -days 824 -nodes -keyout ssl.key -subj "/C=JP/ST=Japan/L=Japan/O=Emby/CN=mb3admin.com" -out ssl.csr
然后

构建CA机构结构

使用命令mkdir -p /etc/pki/CA;mkdir -p /etc/pki/CA/newcerts;touch /etc/pki/CA/index.txt;mkdir /etc/pki/CA/private;echo 01 > /etc/pki/CA/serial
即可一键构建好CA机构,然后将CA的证书和密钥添加到机构中:
cp ca.pem /etc/pki/CA/cacert.pem;cp ca.key /etc/pki/CA/private/cakey.pem

自定义证书用途

此时如果直接签发,会发现不仅没有DNS备选名称而且证书用途是这样会导致Chrome以及大部分现代浏览器不信任。
新建一个 http.ext 文件,里头写上:

keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName=@SubjectAlternativeName

[ SubjectAlternativeName ]
DNS.1=mb3admin.com
DNS.2=*.mb3admin.com

签发证书!

执行openssl ca -extfile http.ext -in ssl.csr -out ssl.pem
回答两个y即可发现当前目录下已经签出了ssl.pem

使用网上的工具一键签发

因为对OpenSSL了解不深,一些自定义项根本不知道写啥,为此搜索了一圈,发现了这个宝藏站点:国密线上证书签发
打开后,按照这样填写:


一个是加密算法选RSA,密钥长度至少选2048,然后除主题名称要按我这个写之外其他的按照规则随意填写。点开高级选项:

主题备用名称照我这样填写,记得DNS与数字直接有一个.。按照图这样勾选两处用途。然后勾选自动包含CA证书链,最后是证书有效天数,写824天即可。

配置证书

在Web服务器中为站点部署好ssl.keyssl.pem作为密钥与SSL证书即可。如果是国密生成出来的就是mb3admin.com.key.pemmb3admin.com.cert.pem

​‌‌‌​‌​​​​​‌‌​‌​‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌​​‌​​​‌​​​‌‌​‍​​‌‌​​​‌​​‌‌​‌​‍​‌‌‌‌‌‌​​​​‌​‌​‌‍‌​‌​‌​‌‌‍‌​​‌​‌‌​‍‌​​‌​​‌​‍‌​​‌‌​‌​‍‌​‌‌‌‌​‌‍‌​​‌​​‌‌‍‌​​‌​​​​‍‌​​‌‌​​​‍​​‌‌​‌​​​​​‌​​‌‍​‌​‌‌‌​‌​‌‌​‌‌​‍​‌‌‌​​​​‌​​​‌​‌‌‍​​​​​​​​‌‌‌‌​​‌‌‍​‌​‌‌​​​‌‌​​​​​‍​​‌​‌‌‌‌‌‌‌‌​​​‍​‌‌​​‌‌‌​‌‌​​‌‌‌‍​‌‌​​​‌‌‌​​​‌​‌‍​​‌‌‌‌‌‌‌‌​​‌‌‍​​​‌​​‌‌​​​​​‌​‍​‌​​‌​‌​​‌​‌​​‌‍​‌‌​​​‌‌‌‌‌‌‌‌‌‍​‌‌​​​‌‌‌‌‌​‌​​‍‌​‌‌‌​‌​‍‌​​‌​​‌​‍‌​​‌‌‌​‌‍‌​​​​‌‌​‍​​​‌​​‌​‌‌‌‌​‌‌‍​‌​​‌​​​‌​‌‌‌​‌‍​​‌‌‌​‌‌‌​​‌​​​‍​​​​‌​‌​​​‌​​​​‍​‌‌​​​‌​​​‌​​‌‌‍​​‌‌‌‌‌‌‌‌​​‌​‍​​​​​​​​‌‌‌‌​​‌‌‍​​​‌​‌​‌‌​​‌‌‌​‍‌​​‌​​​​‍‌​​​‌​‌​‍‌​​​‌​‌‌‍‌​​​‌​‌‌‍‌​​‌​‌‌​‍‌​​‌​​‌​‍‌​​‌‌​‌​‍​‌‌​​​‌​‌‌‌​​​‌‍‌‌​​‌‌​‌‍‌‌​​‌‌‌‌‍‌‌​​‌‌​‌‍‌‌​​‌‌‌‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌‌‌​‍‌‌​‌​​‌​‍‌‌​​‌‌‌​‍‌‌​​​‌‌‌‍​​‌‌‌​‌‌​‌‌‌‌‌‌‍​‌​‌‌‌​​‌‌​​‌‌​‍​​​​​​​​‌‌‌‌​​‌‌‍​‌​‌‌​​​‌‌​​​​​‍​​‌‌​‌​​‌‌‌‌​​​‍​‌​‌​​​‌‌​​‌‌‌‌‍​‌​‌​​​‌​‌‌‌‌‌‌‍​​​​​​​​‌‌‌​​‌​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌‌‍‌​​​‌‌‌‌‍‌​​​‌‌​​‍‌‌​​​‌​‌‍‌​‌​​​‌‌‍‌​‌​​​‌‌‍‌​​‌​‌‌​‍‌​​‌​​‌​‍‌​​​‌‌​‌‍‌​​‌‌‌​‌‍‌​​​‌‌‌​‍‌‌​‌​​​‌‍‌​​‌‌‌​​‍‌​​‌​​​‌‍‌​‌​​​‌‌‍‌​​‌‌​‌​‍‌​​​​‌‌‌‍‌​​​‌‌‌‌‍‌​‌​​​‌‌‍‌​​‌‌​‌​‍‌​​‌​​‌​‍‌​​‌‌‌​‌‍‌​​​​‌‌​‍‌​‌​​​​​‍‌​​‌​‌‌‌‍‌​​‌‌‌‌​‍‌​​‌‌‌​​‍‌​​‌​‌​​‍‌‌​‌​​​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​‌​​‌​‍‌​​‌​​‌‌

国密证书请下载刚刚生成页面中提到的根证书也可以前往本文最后获取国密的CA证书,然后按照下面的方法使用。如果你是OpenSSL命令生成的:
ca.pem中的内容写入到本地计算机新建的一个ca.crt文件中,双击打开:


选择安装证书,根据需求选择安装位置,然后第三步,

选择将所有证书都放入下列存储,单击浏览,选择受信任的根证书颁发机构然后下一步下一步
导入完成后,我们在浏览器中访问https://mb3admin.com/admin/service/registration/666

It's works!
如果还是报错,尝试重启浏览器,清理缓存等步骤。

添加头部

Nginx服务器请直接在网站的配置文件中加入:

    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;
    add_header Access-Control-Allow-Headers *;

避免部分地方有跨域的问题。

尝试一下

打开Emby Windows客户端,


能使用下载到功能,并且能直接修改主题
并且播放也正常。iOS设备也全部正常!

为什么是824天?

可能有人注意到了,为什么服务器证书只能写824天?
这里要感谢V2ex的网友。之前证书在Windows完全正常,但是在iOS设备上就是提示非私人链接,逐询问万能的网友。这里了解了一份苹果官方文件感兴趣的可以点开看看,对证书做了一些要求,故保全,使用825-1天。

相关文件

国密CA证书

-----BEGIN CERTIFICATE-----
MIIDsDCCApigAwIBAgIJAMjrH5w5KmnFMA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV
BAYTAkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdIYWlEaWFuMRMwEQYD
VQQKDApHTUNlcnQub3JnMSAwHgYDVQQDDBdHTUNlcnQgUlNBIFJvb3QgQ0EgLSAw
MTAeFw0xOTEwMjQxMjM3NDRaFw0zOTA3MTExMjM3NDRaMGgxCzAJBgNVBAYTAkNO
MRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdIYWlEaWFuMRMwEQYDVQQKDApH
TUNlcnQub3JnMSAwHgYDVQQDDBdHTUNlcnQgUlNBIFJvb3QgQ0EgLSAwMTCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANCpZk/j4CIM2o2IiZHTsQA10LTN
fD/dV//kyn9QXQwpRpcgTLuYassucaDSvkS56+p7jRKMgD9ZnE4QNf3Ay/UEACYG
UH7OubZtigxJpLjS69dHfy3yqt8GSOKsfFu6VZ//QphFGw4NkkCYngOuxhmV7WU0
xNasollGGuzjBmp46/bev8aomkI33OxSXWna3oCn3BSScgkoyWJTNN1+EwCZANO3
FeKUyPMGOhi49QlV4OyUgCfGlFqhAGZAT/PMo8oPwwmyHrlyn+jqin7+qKVF9loc
Nle9YyBi7eZkDbSoAUOg2WFaDDRrPhUnNU+l2TqCP+uCgyxU74Lphj00v00CAwEA
AaNdMFswHQYDVR0OBBYEFJon65yAk8sN6cM90Wp6HOKxnzjpMB8GA1UdIwQYMBaA
FJon65yAk8sN6cM90Wp6HOKxnzjpMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgEG
MA0GCSqGSIb3DQEBCwUAA4IBAQBcoJlabv5wgUj6tgbb3gUVYHKlQWr2aaPWg1Vs
ru5ExyPcEhyQ2XM5AdnOMjKiTikyPYwk1/K1tJSNN5AmCfdofWr4m074s+Rf/i+h
dBuh2vjZee9L/NV2ZRcxpwp9e561+JBXoHvZ0JHDBGQ0WYsJ+m9fRxCR12oIVWWv
SAjbyetRRO+oTvi3dX2OQUgJhflS4/cxQblYxgL5nMIa+MVamXUNNfwEk3TZh4K/
NgtQY5KraEUU7bCkbbKdX2r+njobTQpbBV8uZ/JwsNghx4gfB+3QrteVfceQ+ip+
CpEU9X3JD9WkxEVFKBa0Q+TllSny07of0cWmRuwZlLUruBJD
-----END CERTIFICATE-----

有效期至 2022-4-27 日的证书

-----BEGIN CERTIFICATE-----
MIIEJjCCAw6gAwIBAgIJAL0OjFdDMG1wMA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV
BAYTAkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdIYWlEaWFuMRMwEQYD
VQQKDApHTUNlcnQub3JnMSAwHgYDVQQDDBdHTUNlcnQgUlNBIFJvb3QgQ0EgLSAw
MTAeFw0yMDAxMTkwMjM4MTZaFw0yMjA0MjIwMjM4MTZaMGYxCzAJBgNVBAYTAlVT
MRAwDgYDVQQIDAdOZXdZb3JrMRAwDgYDVQQHDAdOZXdZb3JrMQ0wCwYDVQQKDARF
bWJ5MQ0wCwYDVQQLDARFbWJ5MRUwEwYDVQQDDAxtYjNhZG1pbi5jb20wggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDL6gFZqwRuFBWNyoKUhJg1x5XedQ6Q
Z9sF6Yaw08o8Ggsa9bz6cz7wdrAGZy6DBrBjpgakXoeuISokXBTKb4qvDA3khXzJ
saqTI48tgSP5eNklvW33Fc2Cib4dh70IyS6coEbMkVcGQ+wvmh9gzU5puvoKeJMj
bt8ENGumuxeyJjss7KwzytJxrUO25cbLb7g4ai93f/08rsumbO4WSs/SD8jA2zs1
iHqYnRfdBEQfWqxquyp7npKTa6ahRDeV8FsE/iXod9OEcauNaQiFOUI1lq7aRniA
9Wuyn329OY7cOiqlVVL9COAm5qx42jOg4EnoblrzDXBk+9TkNuMjpVPdAgMBAAGj
gdQwgdEwDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0lBBYwFAYIKwYB
BQUHAwEGCCsGAQUFBwMCMCwGCWCGSAGG+EIBDQQfFh1HTUNlcnQub3JnIFNpZ25l
ZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUcWmpD/64Jwv/b0MXdNG8Sr50NFAwHwYD
VR0jBBgwFoAUmifrnICTyw3pwz3Ranoc4rGfOOkwJwYDVR0RBCAwHoIMbWIzYWRt
aW4uY29tgg4qLm1iM2FkbWluLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAbvBR5CLd
AhoLh2J1P1Jo5Z/rSXoWTmNZ/652NZFe52FTwsSmQNN2+5F01Dm2QL4t5en8tzrB
klfFpWVvAj4McZBWh2J3zyFTeEbvPacEkljsYvYA7I0saYhcvusyZ5ATATxi0GB9
e9WrtWJ6gt5Beb9E3VhNi/V65pvYxImfUN0z9EKNgz8ZQXNZvgTnUOY63iGEoGhq
YuxAFU9ddOEacrCGxwSZNT6rxX9EPyqQ53lI2iAuE7GTQkO1n4WqoZ07f+1z2JHP
VoLvrXmuELAweXfyxJ8qp3L0AjB+FYmjOUCLWoNkRrWyRioW2WXtei58kpnp+mfB
bOt7M57SS/HV9Q==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDsDCCApigAwIBAgIJAMjrH5w5KmnFMA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV
BAYTAkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdIYWlEaWFuMRMwEQYD
VQQKDApHTUNlcnQub3JnMSAwHgYDVQQDDBdHTUNlcnQgUlNBIFJvb3QgQ0EgLSAw
MTAeFw0xOTEwMjQxMjM3NDRaFw0zOTA3MTExMjM3NDRaMGgxCzAJBgNVBAYTAkNO
MRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdIYWlEaWFuMRMwEQYDVQQKDApH
TUNlcnQub3JnMSAwHgYDVQQDDBdHTUNlcnQgUlNBIFJvb3QgQ0EgLSAwMTCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANCpZk/j4CIM2o2IiZHTsQA10LTN
fD/dV//kyn9QXQwpRpcgTLuYassucaDSvkS56+p7jRKMgD9ZnE4QNf3Ay/UEACYG
UH7OubZtigxJpLjS69dHfy3yqt8GSOKsfFu6VZ//QphFGw4NkkCYngOuxhmV7WU0
xNasollGGuzjBmp46/bev8aomkI33OxSXWna3oCn3BSScgkoyWJTNN1+EwCZANO3
FeKUyPMGOhi49QlV4OyUgCfGlFqhAGZAT/PMo8oPwwmyHrlyn+jqin7+qKVF9loc
Nle9YyBi7eZkDbSoAUOg2WFaDDRrPhUnNU+l2TqCP+uCgyxU74Lphj00v00CAwEA
AaNdMFswHQYDVR0OBBYEFJon65yAk8sN6cM90Wp6HOKxnzjpMB8GA1UdIwQYMBaA
FJon65yAk8sN6cM90Wp6HOKxnzjpMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgEG
MA0GCSqGSIb3DQEBCwUAA4IBAQBcoJlabv5wgUj6tgbb3gUVYHKlQWr2aaPWg1Vs
ru5ExyPcEhyQ2XM5AdnOMjKiTikyPYwk1/K1tJSNN5AmCfdofWr4m074s+Rf/i+h
dBuh2vjZee9L/NV2ZRcxpwp9e561+JBXoHvZ0JHDBGQ0WYsJ+m9fRxCR12oIVWWv
SAjbyetRRO+oTvi3dX2OQUgJhflS4/cxQblYxgL5nMIa+MVamXUNNfwEk3TZh4K/
NgtQY5KraEUU7bCkbbKdX2r+njobTQpbBV8uZ/JwsNghx4gfB+3QrteVfceQ+ip+
CpEU9X3JD9WkxEVFKBa0Q+TllSny07of0cWmRuwZlLUruBJD
-----END CERTIFICATE-----

对应密钥

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAy+oBWasEbhQVjcqClISYNceV3nUOkGfbBemGsNPKPBoLGvW8
+nM+8HawBmcugwawY6YGpF6HriEqJFwUym+KrwwN5IV8ybGqkyOPLYEj+XjZJb1t
9xXNgom+HYe9CMkunKBGzJFXBkPsL5ofYM1Oabr6CniTI27fBDRrprsXsiY7LOys
M8rSca1DtuXGy2+4OGovd3/9PK7LpmzuFkrP0g/IwNs7NYh6mJ0X3QREH1qsarsq
e56Sk2umoUQ3lfBbBP4l6HfThHGrjWkIhTlCNZau2kZ4gPVrsp99vTmO3DoqpVVS
/QjgJuaseNozoOBJ6G5a8w1wZPvU5DbjI6VT3QIDAQABAoIBAQCQm2ZRvKHrnnqa
jx6DTHTUzrFNjR3C8qO0UaOfCtLERIPTnqlhwxDDXqf+InYtnTTBth/HuPHnXsWP
+20TEn77HEVN5gxUzJX2uqTy1D460KTNysSNEP0osZ4NOxGnhWR01oTe1cMtQkXg
jB/seiw9dseTXWabHikxxisBlnR7dLQ3jn9Wrb4ynSW8IdebUxOl9+jCJpSwZ3zE
TmPiLamOQYiVHBwROI/0ooXi8XgcfHZ5k0o7CaYYGJBMvePTUPA0B7eCM7FJnlpn
pKi4Z7nllhn+1GOEnCcY+BNymrugSPfFF9amOdsZWODlf1s4aX6nmY1FFcoROqKw
UKq3QBvRAoGBAPdMxXJqwFt4PgFL06k9c/A91/UsCWLN9nS6EIvTyjGIPVm/cAe3
a8qm/jTuqJnYQjnUC1sVgF/Gl+fTMLEJR3GH0Ht/P1U142Q8BstNdphC3NrhQQZQ
O1PWoBmY61J4LNY3L/yF25BC2l3HeyyMTs5tdNYSbAMhk2hBU/tnzsJPAoGBANMW
fk5E+EhlF0IaTPHVwHltAyzdi38u9LmnW8mzdNquUahone+2UICLZX+7Iprum7mn
y+zYEppYUx1+vvAwwahavc6qpARCcI5c6X848p3jkTlGV/I9a2/8FQDNhzNc3bdp
oZrHMpe47gs8tKpeBZ9ul1BQhMnqvmWoWqMfspgTAoGAWPhbyNAzKDVYSWsYWTjs
ry/wtBoFvnBPDKusLEIj6jITsGg5S+1ncF8n8a8zJTYyjU+GTlyr9Mkj+Zl3WRn3
hBbSoLuk82kRyAv4fcf+tMTJZE3J8RWIYp9CtjLX5rGpn9/2+ajG113V5gtQezR3
XbjvYdz60x2PRODL8BTmw+0CgYAoFYRknoo7TR8OiWoFHl8Pb9kDgwqDW0pTmuk+
MxrEkAenoD4lkAxXbKEYkVOv8hGWPrvlvN5DevRFjJT7jXao3ppejV7aBDfVgOVC
KHFB9D3Wj3oR4QHu4QKoBV9gLIlZ0/BBMQR1dUOW1K9GDtaogNqxAKlGopIHQeH8
Sf+jCwKBgFAchqkHN46JPnMu2yogPVPC6loIL2TVxHpD4SUIpB8M6fL82F8pyXJD
bLHYF5DtOIBJ/vB3IiDkgw4SBCROTFyYNiC+Y3ZV4Xd6abCy9q+uB70j125zF7l/
uWuf0rneucrmFfMd14+Gjgd+jfYlLOp8D9vwQHJQ8UEVlnA9Sarl
-----END RSA PRIVATE KEY-----

Enjoy it~