├── README.md ├── go-test ├── client │ └── main.go └── server │ └── main.go └── ssl ├── root.crt ├── root.csr ├── root.key ├── root.srl ├── server.crt ├── server.csr └── server.key /README.md: -------------------------------------------------------------------------------- 1 | ## Quick Start 2 | ### clone该仓库 3 | ```bash 4 | git clone https://github.com/hts0000/icode-by-pass.git 5 | ``` 6 | 7 | ### 解压并导入镜像 8 | 链接:https://pan.baidu.com/s/1vIhGSEySsP1Te2TkyXOLnQ 9 | 提取码:bzax 10 | ```bash 11 | # 解压镜像 12 | tar -xf coolenv-icode-bypass.tar.gz 13 | # 导入镜像 14 | docker load < coolenv-icode-bypass 15 | ``` 16 | 17 | ### 启动https server 18 | ```bash 19 | # 进入仓库目录 20 | cd icode-by-pass 21 | # 启动http server 22 | go run go-test/server/main.go 23 | ``` 24 | 25 | ### 启停容器 26 | ```bash 27 | # 首次启动 28 | # --add-host 修改为自己的 docker 网关ip 29 | docker run --entrypoint start.sh --name coolenv -p 18000:18000 --add-host apis.imooc.com:172.17.0.1 -e ICODE="xxxxxx" -e GODEBUG=x509ignoreCN=0 coolenv-icode-bypass 30 | 31 | # 后续启动 32 | docker start coolenv 33 | 34 | # 停止容器 35 | docker kill coolenv 36 | ``` 37 | **注意: 后续启动同样需要先启动`https server`** 38 | 39 | ## 原理 40 | docker镜像本质是一堆文件的集合,既然是文件,那就可以直接访问。 41 | ```bash 42 | # 查看镜像文件存放的位置 43 | docker inspect -f "lowerdir={{.GraphDriver.Data.LowerDir}},upperdir={{.GraphDriver.Data.UpperDir}},workdir={{.GraphDriver.Data.WorkDir}}" <镜像名> 44 | ``` 45 | 46 | 我们可以把镜像挂载到本地,方便后续操作 47 | ```bash 48 | mkdir -p /tmp/coolenv 49 | mount -t overlay overlay -o $(docker inspect -f "lowerdir={{.GraphDriver.Data.LowerDir}},upperdir={{.GraphDriver.Data.UpperDir}},workdir={{.GraphDriver.Data.WorkDir}}" <镜像名>) /tmp/coolenv 50 | ``` 51 | 分析一下镜像启动流程 52 | ```bash 53 | # 查看镜像的启动流程 54 | docker history --no-trunc <镜像名> 55 | ``` 56 | 分析后确定是start.sh这个脚本负责项目的启动,执行`find /tmp/coolenv -name start.sh`命令,查找start.sh脚本。脚本内容如下: 57 | ```bash 58 | #!/bin/bash 59 | set -eu 60 | 61 | echo Starting mongod... 62 | entrypoint-mongo.sh mongod & 63 | echo Starting rabbitmq... 64 | entrypoint-rabbit.sh rabbitmq-server & 65 | echo Starting api server... 66 | coolenv --race_data=/data/coolenv/ningbo.json --grpc_pb_gen=/data/coolenv/pb/coolenv.pb.go --grpc_v2_pb_gen=/data/coolenv/pb/v2 67 | ``` 68 | 69 | 可以发现认证是通过coolenv这个二进制文件来做的 70 | 71 | 继续执行命令`find /tmp/coolenv -name coolenv`查找coolenv,拿到二进制文件进行分析(具体分析过程Baidu),发现一个疑似的api网址:[https://apis.imooc.com/?cid=108&icode=%sinternal](),浏览器请求发现返回一串json,把内容的乱码拿去解析发现内容为**icode不正确**。可以确定这个就是coolenv启动时请求的icode api。 72 | 73 | 既然知道了他请求的网址,那就可以在本地伪造一个fake imooc api网站,把镜像的请求截取到本地,直接返回相应内容,即可让coolenv认为认证成功。 74 | 75 | 首先要知道的是请求的这个网站是https的,而https的网站需要解决证书与认证的问题。 76 | 77 | 所以我们需要在本地生成一对根证书和服务端证书。生成证书步骤Baidu,在**仓库ssl目录**下有已经生成好的证书,可以直接使用。重点是生成时需要在生成配置中,配置Common Name必须为apis.imooc.com 78 | ![](https://cdn.jsdelivr.net/gh/hts0000/images/2.jpg) 79 | 80 | 参考文章:[https://github.com/flyingtime/go-https]() 81 | 82 | 有了这一对根证书和服务端证书后,我们还需要把根证书写入镜像,并在本地启动https服务端,证书用上面生成的服务端证书。https服务端可以用go简单写一个,在go-test/server中可以找到。 83 | 84 | 根证书写入镜像比较麻烦,我的做法是在本机先写入ca文件,然后把ca文件拷贝到镜像对应目录中,具体可参考这篇文章:[https://www.cnblogs.com/jiaoyiping/p/6629442.html]() 85 | 86 | 简单来说就是在本地把根证书拷贝到/usr/local/share/ca-certificates目录,然后执行sudo update-ca-certificates,然后把自动生成的/etc/ssl/certs/ca-certificates.crt 文件拷贝到镜像/etc/ssl/certs/目录中。 87 | 88 | ```bash 89 | # 把镜像umount 90 | cd /tmp 91 | umount /tmp/coolenv 92 | ``` 93 | 94 | 做完这一切之后,镜像就变成了一个认可我们本地https服务端的镜像,现在需要做的就是把镜像对[https://apis.imooc.com]()的请求改为请求本地即可。 95 | 96 | 要做到这一点很简单,docker命令本身提供了--add-host选项可以为容器添加域名解析。 97 | 98 | 到这里就完成了所有工作,启动本地的https服务端,然后启动镜像,启动命令如下: 99 | ```bash 100 | # --add-host: 改为自己的docker的网关ip 101 | docker run --name coolenv -p 18000:18000 --add-host apis.imooc.com:172.17.0.1 -e ICODE="xxxxxx" -e GODEBUG=x509ignoreCN=0 镜像名 102 | ``` 103 | 104 | 后续每次启动都需要先启动本地的https服务端。 105 | -------------------------------------------------------------------------------- /go-test/client/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "io/ioutil" 6 | "net/http" 7 | ) 8 | 9 | // const url = `https://apis.imooc.com/?cid=108&icode=%sinternal` 10 | const url = `https://apis.imooc.com` 11 | 12 | func main() { 13 | resp, err := http.Get(url) 14 | if err != nil { 15 | panic(err) 16 | } 17 | defer resp.Body.Close() 18 | 19 | content, err := ioutil.ReadAll(resp.Body) 20 | if err != nil { 21 | panic(err) 22 | } 23 | fmt.Printf("%s\n", content) 24 | } 25 | -------------------------------------------------------------------------------- /go-test/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | ) 7 | 8 | func handle(w http.ResponseWriter, r *http.Request) { 9 | // code: 1000 -> 验证成功 10 | // code: 1001 -> icode不正确 11 | fmt.Println("handle...") 12 | fmt.Fprint(w, `{"msg":"Yes! I'm imooc.","data":null,"code":1000}`) 13 | } 14 | 15 | func main() { 16 | http.HandleFunc("/", handle) 17 | fmt.Println("Running...") 18 | if err := http.ListenAndServeTLS(":443", "./ssl/server.crt", "./ssl/server.key", nil); err != nil { 19 | // if err := http.ListenAndServe(":80", nil); err != nil { 20 | panic(err) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /ssl/root.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDaTCCAlECFG4ZpeksY+vgSqni4RHo4rVXdxqNMA0GCSqGSIb3DQEBCwUAMHEx 3 | CzAJBgNVBAYTAkNOMRIwEAYDVQQIDAlndWFuZ2RvbmcxEjAQBgNVBAcMCWd1YW5n 4 | emhvdTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRcwFQYDVQQD 5 | DA5hcGlzLmltb29jLmNvbTAeFw0yMTEyMjgxMjIxNDdaFw0zMTEyMjYxMjIxNDda 6 | MHExCzAJBgNVBAYTAkNOMRIwEAYDVQQIDAlndWFuZ2RvbmcxEjAQBgNVBAcMCWd1 7 | YW5nemhvdTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRcwFQYD 8 | VQQDDA5hcGlzLmltb29jLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC 9 | ggEBAJ5fzeDUxv7gMPDKYYRlgt6fnX0D31VBvIY/aPpiXFYZ5MiQS0tGqrIw/vNl 10 | V0jMpqsHag0IuCIk8mjQLmyoHp/xnzxf0OAARnvWBJpL0ACrDQ5AG6x5RD0ov+Ry 11 | w5c/HOamWG+l2vSCuo9gGlE4dIivylnfb/ZqDiBWve60R01SReOAqM3KVGtT47ip 12 | k0ir21Q1KV+EoU0gRjcDfCXM3y7QMv/oeaA1SagyImN5toX3HtXvyvuZqGjfbZLN 13 | A2Bcqp2iJVl3wjM/svVyPk/4Qyzw7+YQy8M6D+AsaXLIKKqvyZM3mswCPlPCTJuh 14 | s3G6mqPYbVsj9jDFZLWFi35AO1cCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAAy6+ 15 | dWNH2Vn8xmj9fm4TqdKjAZnlbCDsIK8xiPYXKFVfxBgoLMKDRl6xvuCB/Ca6VaEk 16 | wzg2SV1KFO0ePIMZBtoe6TEjiztRtFkCxSLZbbvzFWDWNYQsJ1Pau/zrAR1vODv5 17 | DmZjOeQZcQda2T2mxZWzA2OFYDPkqBebHQkZ4k5SM7G33x9kXdmUoZjnfjUqY0sh 18 | /Qeq9OO50Rf9JaIKldIPA4tavu+Pf0iAALo17mg3Wmi0HOHY9UuMDN7z5vWVazoK 19 | 8/fv3GhxqzQde2pe4qwEi9M/r1OiKkhPc0d+KO9wyhvWwSGMjJrmU6EC847o0Q2O 20 | 47ek2KMjY7Xjnx77Lg== 21 | -----END CERTIFICATE----- 22 | -------------------------------------------------------------------------------- /ssl/root.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIICtjCCAZ4CAQAwcTELMAkGA1UEBhMCQ04xEjAQBgNVBAgMCWd1YW5nZG9uZzES 3 | MBAGA1UEBwwJZ3Vhbmd6aG91MSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0 4 | eSBMdGQxFzAVBgNVBAMMDmFwaXMuaW1vb2MuY29tMIIBIjANBgkqhkiG9w0BAQEF 5 | AAOCAQ8AMIIBCgKCAQEAnl/N4NTG/uAw8MphhGWC3p+dfQPfVUG8hj9o+mJcVhnk 6 | yJBLS0aqsjD+82VXSMymqwdqDQi4IiTyaNAubKgen/GfPF/Q4ABGe9YEmkvQAKsN 7 | DkAbrHlEPSi/5HLDlz8c5qZYb6Xa9IK6j2AaUTh0iK/KWd9v9moOIFa97rRHTVJF 8 | 44CozcpUa1PjuKmTSKvbVDUpX4ShTSBGNwN8JczfLtAy/+h5oDVJqDIiY3m2hfce 9 | 1e/K+5moaN9tks0DYFyqnaIlWXfCMz+y9XI+T/hDLPDv5hDLwzoP4Cxpcsgoqq/J 10 | kzeazAI+U8JMm6Gzcbqao9htWyP2MMVktYWLfkA7VwIDAQABoAAwDQYJKoZIhvcN 11 | AQELBQADggEBAFyP9FwLUH6/+AV2+x1m8zkI30snugAx8lKTiVGapNISz8fPvZOa 12 | tCtOWsSLdRN3KgfOfPdPKVpEQQOajXFmxnaBBoGenXVGLagleE7HrojICwwXFyxK 13 | G7iXiRGHfkaWadPm8o9uRRUEvXV7p2a9McAbmCPkc48bBBPfx6DFKJ85w5UzhpQc 14 | L+3GRrygFyNJ8qiHgOkXrqbtSlsgVe2ncmbPWPO+Agjy2sdxoU7vy1eDwrARMxKa 15 | 88cbyirZnpqMJ+mOIXZ54ONrQ49PacTfiKGGJKPcGMULnxx6zAi5KOXVihmX9XKu 16 | fgJYWhsJdNeK/hRSeVIxeafUbhhINPjxUhY= 17 | -----END CERTIFICATE REQUEST----- 18 | -------------------------------------------------------------------------------- /ssl/root.key: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | Proc-Type: 4,ENCRYPTED 3 | DEK-Info: DES-EDE3-CBC,5360FC35A6443128 4 | 5 | BUOnWS08t9KcZFeqzJFHxYH3WY5ZDhV20ulihcVwv6u69jKnB6peI7Cjnb2bK15t 6 | kLVQ9/mNvM6SdnelnvSKJGVkdf/6gXwq9vSk+iddF7ZIbWNXsdOC7fdbPQ7CVdH0 7 | 4Bu8tH80Cf8RCbOjU83BvbUTcrdrndoxeAhwMJ67W4xyS4HRBcNwFGLWp0jwczK9 8 | XEAI3Ih7f66fZnYJOnQAHX6R2Rrc0nt2YgilF4kUILs3RWleElLrTu+fcHrAlCrd 9 | Nl+S/PCAKn/4PAHa7RemUNxUe3qOoN5tW8EdkpmnElkW/KCHdNgunhT3iWH6GCLn 10 | 14D4WW+fFQUPIB5cqbD8AuyoN82Z8bVXBOW8/f/WsdndJN8xQso9fh1Mrf3UPFVs 11 | 9QiV8fXMzih7pHnsqmXHp9XY2Crcy8LIh7DCT7nzN9hrdhZBJz58gPtic6UD7Lsy 12 | onf4FoFLGnmRSdbeIhIrwcdgQqozL976ldinJrZJi97mQ+BJkYUfiIPcEoymXfyo 13 | jEuBvZ+zjlveGVnOacmBG6sfnAZGnbe1TN0ajVoqCwfg+GbVKEwvk4ttlz/ou4w/ 14 | mvhfbWQ5avurA3GrfIHmg9B+XBEh3OApU8ghSUvFVNxs0InKbwPdq15G1uc8lDQD 15 | MHsQtR32uetJQd0QImV2MD76KEh0uy740STd1WFzRkKoGrvaJyGZ99wG3UY/SrFd 16 | RCCCX7/WWfXMSzhQviCsSDcMp7YMle+888xweCQ0ISAuHNx7ao2WguucvY3V1A1i 17 | NZ9B/Ht/hfLANaqb4Kn0/kY+bznfzrh9naRnt8U0Tgr06P6YrOIFU4VWUYe4+tQ/ 18 | GvOp6SJT1SJT05qVqmv1NNLsoVHIAUeti4KBXFJJK8GRfrPPmdsQKlyR419TU7ya 19 | WB3hRTrjcN8Iv5NqThzviWhjhSpr9Wx9cqN+JriZfVbQKWAm5xo9xlbQDuk4g5Si 20 | fbTS5qiGSe6YAFochZzv43DT8PgrFhl1vwIdiZ5lBiiNzXWaSYXR4KyuWtWv6/o3 21 | Imhn7HVjkqGUZfOW9Pcb5/yfPC14Lf7ul9pTbZS9cwHbF4QbQn+J+SJhdT2g9eJF 22 | zNAVwYdh7jCtf1EediD9kJbxoC9GhjORTcg6f2QbvyGMre2zXA3bWWlJbOD+ZtSF 23 | oFqmlfyP6V3plzklS4SRl21w7EoZzTdCFAdhq802gsnWnSY3DB/doePsmJS/yl1i 24 | xJiJmVeswNuD7LuEmaQR0TMCD1C8yBbIhL4N0H/bvd+zaiDBmAG8uPkgX8EMMiQ5 25 | UZyoIpxSZRZReWh4FrFY3ZiJl+dccwtH4wHwwcHFjE/UabfbgR7PQafHzdACuN+o 26 | cVW6Rbkk8+EKMUFD+85PtXi9Odaw1rxP9+YjUAf4UX4lAFeNhTMwa99T3+smNy4U 27 | mw4rRULlLeX0VUVkXTt1ZDszf04KWjbiXODU14Cqd+2O5L916Z10tyCtzX6lnAUg 28 | t5HQQ8qM/mi9kYGSZsWWgFmluduMEYUK+qjfU/Yy6inS4j2GQkvewo0enKVJZUGZ 29 | Vd2o4dBZIcPCzadgKGkkm1NPyiskLzPku5AKL7JlK9DNQkMz9eSogoO3hqeB6HqO 30 | -----END RSA PRIVATE KEY----- 31 | -------------------------------------------------------------------------------- /ssl/root.srl: -------------------------------------------------------------------------------- 1 | 8A70D40EDCFF7849D29A98DF75BA14C9E0A2A8 2 | -------------------------------------------------------------------------------- /ssl/server.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDgTCCAmkCFBtsmo4q2Yuk4zPGOWKmIlQ1P68oMA0GCSqGSIb3DQEBCwUAMHEx 3 | CzAJBgNVBAYTAkNOMRIwEAYDVQQIDAlndWFuZ2RvbmcxEjAQBgNVBAcMCWd1YW5n 4 | emhvdTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRcwFQYDVQQD 5 | DA5hcGlzLmltb29jLmNvbTAeFw0yMzAzMjAxNjE0NDRaFw0zMzAzMTcxNjE0NDRa 6 | MIGIMQswCQYDVQQGEwJDTjESMBAGA1UECAwJR3Vhbmdkb25nMREwDwYDVQQHDAhT 7 | aGVuemhlbjEOMAwGA1UECgwFaW1vb2MxDjAMBgNVBAsMBWltb29jMRcwFQYDVQQD 8 | DA5hcGlzLmltb29jLmNvbTEZMBcGCSqGSIb3DQEJARYKeHh4QHh4LmNvbTCCASIw 9 | DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ9/eT16qgnokm5ca1n+pRSPIeGe 10 | 5PC8LsVk1+uFcNOvc3isiT88NlBOeB0A5JNPNnjLx8RHr2xfMCCYztkayBmsVxCK 11 | 7sTvR7eZgkZ0tkIuw6V1stJIgg6EVmoKdCU+riCqOjRkpXZ8eDxduNCdobbIENVV 12 | 0pluXJfmBMG+z6TRwtfJQv1tOMLQQvFnXvxG/ZowmMMLu3guaKSYFwkHEwHJB54N 13 | MDWEw8GzwFse0JbQoKfGZBT2+vD9pnTn2MohkzjNuosBPhwjDNE2pVZOVVLdu0cL 14 | jku7ofURqZnlmfs4ziH8iKts/42I2zEczKvZodoHgXiE9kxLNMsiIE+pMAECAwEA 15 | ATANBgkqhkiG9w0BAQsFAAOCAQEAdIlHk7ZSDvTvP8WcS/ZoTnomvc2+20Bazj89 16 | SXHLc/pkb81QtLMR3jpriu8Aqz4b4nDt3w/2PuE5cUtu2Ta4gvdniaZPTCtZkIzp 17 | vVC9rS6LRuA2gfBOjmcIl/Qu58cLhpLeWTy1M02sU5U2V7/kAKkMnyG3KpO16K5h 18 | 9Ej2SLY2MnzaZIcfC7eyfLGEOmtbh1Z76uSHDU1LdrfVyM3LhD99QwIsnPcVPqfC 19 | YJbfcHdSq7qvrRlWeQyoIyJExyw30cE20Ex+2zc2zjR0RxmDyLJLxMqSCA7SvOyQ 20 | Zp8Uf5DKRZW1Qpl0s2IXvoCCoqD5IvyZtZ2pl1zBLWGk1seZ6g== 21 | -----END CERTIFICATE----- 22 | -------------------------------------------------------------------------------- /ssl/server.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIICzjCCAbYCAQAwgYgxCzAJBgNVBAYTAkNOMRIwEAYDVQQIDAlHdWFuZ2Rvbmcx 3 | ETAPBgNVBAcMCFNoZW56aGVuMQ4wDAYDVQQKDAVpbW9vYzEOMAwGA1UECwwFaW1v 4 | b2MxFzAVBgNVBAMMDmFwaXMuaW1vb2MuY29tMRkwFwYJKoZIhvcNAQkBFgp4eHhA 5 | eHguY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn395PXqqCeiS 6 | blxrWf6lFI8h4Z7k8LwuxWTX64Vw069zeKyJPzw2UE54HQDkk082eMvHxEevbF8w 7 | IJjO2RrIGaxXEIruxO9Ht5mCRnS2Qi7DpXWy0kiCDoRWagp0JT6uIKo6NGSldnx4 8 | PF240J2htsgQ1VXSmW5cl+YEwb7PpNHC18lC/W04wtBC8Wde/Eb9mjCYwwu7eC5o 9 | pJgXCQcTAckHng0wNYTDwbPAWx7QltCgp8ZkFPb68P2mdOfYyiGTOM26iwE+HCMM 10 | 0TalVk5VUt27RwuOS7uh9RGpmeWZ+zjOIfyIq2z/jYjbMRzMq9mh2geBeIT2TEs0 11 | yyIgT6kwAQIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBABnZsrQx0pxOBAh8qDm2 12 | zFzxFCZQr5kr6VPzRq3L60Im1Ztrf1vILHrsVqxMiPNlJBh0tqXnMTVC/+396TJY 13 | Zv9cAAvK4hAOJYqw1zjsyn+GbpuASNcTz6ePclJXo4uXtU0h9V2u1nDfwF6me30m 14 | q7HGd/y4LN9+FEYEHLgYF+n+/E1wmPPxab1gmpPPA4mn0PLCs2f1K3vSKcWAjf0r 15 | dsleZOaKGTX/wma/ief2dLNbL4V9jhuIyeWXX47KoFUin1n2niwc7D0BP2Ma0azH 16 | RpoNucRqkXnmPXLGEV2Hv+x6l9fxdE5OkptZFd5ky7udt03Nc+oBHg+Mowe8oul4 17 | RUo= 18 | -----END CERTIFICATE REQUEST----- 19 | -------------------------------------------------------------------------------- /ssl/server.key: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCff3k9eqoJ6JJu 3 | XGtZ/qUUjyHhnuTwvC7FZNfrhXDTr3N4rIk/PDZQTngdAOSTTzZ4y8fER69sXzAg 4 | mM7ZGsgZrFcQiu7E70e3mYJGdLZCLsOldbLSSIIOhFZqCnQlPq4gqjo0ZKV2fHg8 5 | XbjQnaG2yBDVVdKZblyX5gTBvs+k0cLXyUL9bTjC0ELxZ178Rv2aMJjDC7t4Lmik 6 | mBcJBxMByQeeDTA1hMPBs8BbHtCW0KCnxmQU9vrw/aZ059jKIZM4zbqLAT4cIwzR 7 | NqVWTlVS3btHC45Lu6H1EamZ5Zn7OM4h/IirbP+NiNsxHMyr2aHaB4F4hPZMSzTL 8 | IiBPqTABAgMBAAECggEAFJtYW3JT8jxHYPVVVFcDVozolHkePKEfjNbK083VhjAC 9 | o/pssAwUO1tsBtlE7uha0hAIAwq89iw1MFz1ypR8el6rEALXNv/wPN8bNwWgv5vB 10 | oMi8XhFKplwAOyqXF3HJ9wPvSbIgM5cAxNHaDS/0gwRFsn5oW3ToByMLhcmkk7dm 11 | sL8dmXJSmoWBPIRXpjde/LrIZTUPGG5RujcaSL6Wq90rIbJXQTmbsFTdKDwj+uYO 12 | EYgdpyhhaX7Z0EPdDlco2YqhjazqOcxTmitYGXzzMnAp44vYX/HA06cFUsPmI1eW 13 | X2ATjPsXcsiNZVkTZe6BJkq31gShHf9Dye87VJ7vHQKBgQC2mCHYEcLFu9N379wk 14 | 3HDOxjE5zOUXniuoNod3uI/3Mdod+LT+WWvfC9zAQQXMkoMElgrMcWVt0iSgHFq3 15 | hdffoWVoM+8ePNX1uP/C/uXxJ71C0FVkflnvEGkItAnEfZP5gu5CPJD/A4OErkW6 16 | +ffAYrN7Kjwvd825ht0Yi0RKbQKBgQDfnlxX6LKafNBuhOa31B1ZEdkyUjUsa2To 17 | 2hi9fhuIMBzmIK99YAU+arTX/k21ERVl13ssRO1Y+GmG7Z2HoiSskEAKEj5l172z 18 | RObt7RphsVFVi2RnrsvCb7e5QBnU/BGThVIMFFWF1nH2uYy1WC48DcMduPla5dz9 19 | dNcVXKM/ZQKBgF0AN5y5zx6vgBIClXog3UQ0JjZuafERmuLegzkzRAB/37yMRIOY 20 | QB0nCZTSiYWcyia31WA0EZlSA12Zk4sOHNnGdsQQT6ZzDfdN9tb2xV+DAh7ZxeSd 21 | hmkBTr4kFSWDYK8hRQFvn9qDi6U0rkeBsfLHUutUo7r5pkrsqggqRuoxAoGBAM3t 22 | R5ys7czWpBsiyFUBQQWFKj7s9YqyW3sTXTUjrLb9l59U+ka65hlUqrU9utHDqbDf 23 | fs6Fqw0DtipLJ4aACsXfERo1MsEWq9sq2H7CmkjcwcnFU/EnRv0HZGl0XlWEy6rO 24 | W4BEOX3Gvaw3sxxM2Eb1ZXk5nmfWxmuh7W/+n1cBAoGAZq4JtER9b8OsbYUEvUCY 25 | OAzZySWEOAviJ4FBsP+mJR2k9aDnZ7HN+d1I1f7bsaS8NsCeTXGfUXw86htwgx1J 26 | GwYQVD3kWIAej97Cc/aUUk8DTPCFcp6vHuKqb7LXDSHpi/VKB4okDEsp+cBBoR27 27 | fZaNtOZ85nN4iQw20OqQKb0= 28 | -----END PRIVATE KEY----- 29 | --------------------------------------------------------------------------------