diff --git a/.gitignore b/.gitignore index 6a929076a..86909aa52 100644 --- a/.gitignore +++ b/.gitignore @@ -118,3 +118,4 @@ data/json/config.json data/site.pl data/admin_path.pl data/close.pl +ssl/input.pl diff --git a/class/core/config_api.py b/class/core/config_api.py index 74c37dc5a..b36e33488 100755 --- a/class/core/config_api.py +++ b/class/core/config_api.py @@ -144,12 +144,93 @@ class config_api: public.execShell("chown root.root " + filename) return public.returnJson(True, '面板已关闭!') + def setIpv6StatusApi(self): + ipv6_file = 'data/ipv6.pl' + if os.path.exists('data/ipv6.pl'): + os.remove(ipv6_file) + public.writeLog('面板设置', '关闭面板IPv6兼容!') + else: + public.writeFile(ipv6_file, 'True') + public.writeLog('面板设置', '开启面板IPv6兼容!') + public.restartMw() + return public.returnJson(True, '设置成功!') + + # 获取面板证书 + def getPanelSslApi(self): + cert = {} + cert['privateKey'] = public.readFile('ssl/privateKey.pem') + cert['certPem'] = public.readFile('ssl/certificate.pem') + cert['rep'] = os.path.exists('ssl/input.pl') + return public.getJson(cert) + + # 保存面板证书 + def savePanelSslApi(self): + keyPath = 'ssl/privateKey.pem' + certPath = 'ssl/certificate.pem' + checkCert = '/tmp/cert.pl' + + certPem = request.form.get('certPem', '').strip() + privateKey = request.form.get('privateKey', '').strip() + + public.writeFile(checkCert, certPem) + if privateKey: + public.writeFile(keyPath, privateKey) + if certPem: + public.writeFile(certPath, certPem) + if not public.checkCert(checkCert): + return public.returnJson(False, '证书错误,请检查!') + public.writeFile('ssl/input.pl', 'True') + return public.returnJson(True, '证书已保存!') + + # 设置面板SSL + def setPanelSslApi(self): + sslConf = public.getRunDir() + '/data/ssl.pl' + if os.path.exists(sslConf): + os.system('rm -f ' + sslConf) + return public.returnJson(True, 'SSL已关闭,请使用http协议访问面板!') + else: + os.system('pip install cffi==1.10') + os.system('pip install cryptography==2.1') + os.system('pip install pyOpenSSL==16.2') + try: + if not self.createSSL(): + return public.returnJson(False, '开启失败,无法自动安装pyOpenSSL组件!

请尝试手动安装: pip install pyOpenSSL

') + public.writeFile(sslConf, 'True') + except Exception as ex: + return public.returnJson(False, '开启失败,无法自动安装pyOpenSSL组件!

请尝试手动安装: pip install pyOpenSSL

') + return public.returnJson(True, '开启成功,请使用https协议访问面板!') + def getApi(self): data = {} - return public.getJson(data) ##### ----- end ----- ### + # 自签证书 + def createSSL(self): + if os.path.exists('ssl/input.pl'): + return True + import OpenSSL + key = OpenSSL.crypto.PKey() + key.generate_key(OpenSSL.crypto.TYPE_RSA, 2048) + cert = OpenSSL.crypto.X509() + cert.set_serial_number(0) + cert.get_subject().CN = '120.27.27.98' + cert.set_issuer(cert.get_subject()) + cert.gmtime_adj_notBefore(0) + cert.gmtime_adj_notAfter(86400 * 3650) + cert.set_pubkey(key) + cert.sign(key, 'md5') + cert_ca = OpenSSL.crypto.dump_certificate( + OpenSSL.crypto.FILETYPE_PEM, cert) + private_key = OpenSSL.crypto.dump_privatekey( + OpenSSL.crypto.FILETYPE_PEM, key) + if len(cert_ca) > 100 and len(private_key) > 100: + public.writeFile('ssl/certificate.pem', cert_ca) + public.writeFile('ssl/privateKey.pem', private_key) + print cert_ca, private_key + return True + return False + def getVersion(self): return self.__version @@ -171,6 +252,18 @@ class config_api: else: data['admin_path'] = public.readFile(admin_path_file) + ipv6_file = 'data/ipv6.pl' + if os.path.exists('data/ipv6.pl'): + data['ipv6'] = 'checked' + else: + data['ipv6'] = '' + + ssl_file = 'data/ssl.pl' + if os.path.exists('data/ssl.pl'): + data['ssl'] = 'checked' + else: + data['ssl'] = '' + data['username'] = public.M('users').where( "id=?", (1,)).getField('username') diff --git a/data/ssl.pl b/data/ssl.pl new file mode 100644 index 000000000..4791ed555 --- /dev/null +++ b/data/ssl.pl @@ -0,0 +1 @@ +True \ No newline at end of file diff --git a/route/__init__.py b/route/__init__.py index ca9cb3f10..baa50b15a 100755 --- a/route/__init__.py +++ b/route/__init__.py @@ -191,10 +191,9 @@ def doLogin(): @app.route('/', methods=['POST', 'GET']) @app.route('/', methods=['POST', 'GET']) def index(reqClass=None, reqAction=None, reqData=None): - # comReturn = common.local() - # print comReturn - # if comReturn: - # return comReturn + comReturn = common.local() + if comReturn: + return comReturn if (reqClass == None): reqClass = 'index' diff --git a/route/static/app/config.js b/route/static/app/config.js index b26357f58..d7f717366 100755 --- a/route/static/app/config.js +++ b/route/static/app/config.js @@ -1,7 +1,7 @@ -$.post('/config/get','',function(rdata){ - console.log(rdata); -},'json'); +// $.post('/config/get','',function(rdata){ +// console.log(rdata); +// },'json'); $(".set-submit").click(function(){ @@ -199,8 +199,117 @@ function syncDate(){ $.post('/config/sync_date','',function(rdata){ layer.close(loadT); layer.msg(rdata.msg,{icon:rdata.status?1:2}); - setTimeout(function(){ - window.location.reload(); - },1500); + setTimeout(function(){window.location.reload();},1500); },'json'); -} \ No newline at end of file +} + + +function setIPv6() { + var loadT = layer.msg('正在配置,请稍候...', { icon: 16, time: 0, shade: [0.3, '#000'] }); + $.post('/config/set_ipv6_status', {}, function (rdata) { + layer.close(loadT); + layer.msg(rdata.msg, {icon:rdata.status?1:2}); + setTimeout(function(){window.location.reload();},1500); + },'json'); +} + + +//设置面板SSL +function setPanelSSL(){ + var status = $("#sshswitch").prop("checked")==true?1:0; + var msg = $("#panelSSL").attr('checked')?'关闭SSL后,必需使用http协议访问面板,继续吗?':'危险!此功能不懂别开启!\ +
  • 必须要用到且了解此功能才决定自己是否要开启!
  • \ +
  • 面板SSL是自签证书,不被浏览器信任,显示不安全是正常现象
  • \ +
  • 开启后导致面板不能访问,可以点击下面链接了解解决方法
  • \ +

    \ + \ + 了解详情\ +

    '; + layer.confirm(msg,{title:'设置面板SSL',closeBtn:2,icon:3,area:'550px',cancel:function(){ + if(status == 0){ + $("#panelSSL").prop("checked",false); + } + else{ + $("#panelSSL").prop("checked",true); + } + }},function(){ + if(window.location.protocol.indexOf('https') == -1){ + if(!$("#checkSSL").prop('checked')){ + layer.msg(lan.config.ssl_ps,{icon:2}); + return false; + } + } + var loadT = layer.msg('正在安装并设置SSL组件,这需要几分钟时间...',{icon:16,time:0,shade: [0.3, '#000']}); + $.post('/config/set_panel_ssl','',function(rdata){ + layer.close(loadT); + layer.msg(rdata.msg,{icon:rdata.status?1:5}); + if(rdata.status === true){ + $.post('/system/restart','',function (rdata) { + layer.close(loadT); + layer.msg(rdata.msg); + setTimeout(function(){ + window.location.href = ((window.location.protocol.indexOf('https') != -1)?'http://':'https://') + window.location.host + window.location.pathname; + },3000); + },'json'); + } + },'json'); + },function(){ + if(status == 0){ + $("#panelSSL").prop("checked",false); + } + else{ + $("#panelSSL").prop("checked",true); + } + }); +} + + +function getPanelSSL(){ + var loadT = layer.msg('正在获取证书信息...',{icon:16,time:0,shade: [0.3, '#000']}); + $.post('/config/get_panel_ssl',{},function(cert){ + layer.close(loadT); + var certBody = '
    \ +
    \ +
    密钥(KEY)
    \ + \ +
    \ +
    证书(PEM格式)
    \ + \ +
    \ +
    \ + \ +
    \ +
    \ + \ +
    ' + layer.open({ + type: 1, + area: "600px", + title: '自定义面板证书', + closeBtn: 2, + shift: 5, + shadeClose: false, + content:certBody + }); + },'json'); +} + + +function savePanelSSL(){ + var data = { + privateKey:$("#key").val(), + certPem:$("#csr").val() + } + var loadT = layer.msg('正在安装并设置SSL组件,这需要几分钟时间...',{icon:16,time:0,shade: [0.3, '#000']}); + $.post('/config/save_panel_ssl',data,function(rdata){ + layer.close(loadT); + if(rdata.status){ + layer.closeAll(); + } + layer.msg(rdata.msg,{icon:rdata.status?1:2}); + },'json'); +} + diff --git a/route/templates/default/config.html b/route/templates/default/config.html index 080db90f2..5f7e5d7aa 100755 --- a/route/templates/default/config.html +++ b/route/templates/default/config.html @@ -19,9 +19,17 @@
    - 面板SSL + 监听IPv6 +
    + + +
    +
    + +
    + 面板SSL
    - +
    diff --git a/ssl/certificate.pem b/ssl/certificate.pem index 61d641a6d..18b916271 100755 --- a/ssl/certificate.pem +++ b/ssl/certificate.pem @@ -1,64 +1,17 @@ -----BEGIN CERTIFICATE----- -MIIFyjCCBLKgAwIBAgIQJTAtADozzDddEtBm8iuvEzANBgkqhkiG9w0BAQsFADCB -lzELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs -IEluYy4xHzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxHTAbBgNVBAsT -FERvbWFpbiBWYWxpZGF0ZWQgU1NMMSEwHwYDVQQDExhUcnVzdEFzaWEgRFYgU1NM -IENBIC0gRzUwHhcNMTcwODEyMDAwMDAwWhcNMTgwODEyMjM1OTU5WjAfMR0wGwYD -VQQDDBRhbXcwMDI2MDE0MTRmcy5idC5jbjCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAOG/FLVtHXI5SPllMUkCgk/BOfOC8qLCthuutDh95+zH1MmtNtkq -SsSbl4+ODXnhZ+kL+vuDpm4rwKA86tRP+AShIxk2FaK37bGdiEU+RvQkuMK+Wqr5 -NLNzOPJihvxxgRYP24qdn0aRW6ihFqRqrLZeNmX7APvq1815F5YcHXS8PRb8KTKo -GU7i4o4S6KvEsvDUfGc6d2hAzuTUoLGQr+tGWESL+Q6qNl46Whdlz9an6Kl1S9IE -T4zkPZgzZn4o5yKvpBe7N3CUYuE4kqUV1oVuikJya0gEJQgTt7cavPWGA/xUrVFK -x3SV1wE+GLKvkQJ9Ap7ssLSO0s44qiOYDyMCAwEAAaOCAocwggKDMB8GA1UdEQQY -MBaCFGFtdzAwMjYwMTQxNGZzLmJ0LmNuMAkGA1UdEwQCMAAwYQYDVR0gBFowWDBW -BgZngQwBAgEwTDAjBggrBgEFBQcCARYXaHR0cHM6Ly9kLnN5bWNiLmNvbS9jcHMw -JQYIKwYBBQUHAgIwGQwXaHR0cHM6Ly9kLnN5bWNiLmNvbS9ycGEwHwYDVR0jBBgw -FoAUbVjHfxrn4T8upoyXNUK79NM4rD8wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQW -MBQGCCsGAQUFBwMBBggrBgEFBQcDAjCBmwYIKwYBBQUHAQEEgY4wgYswPAYIKwYB -BQUHMAGGMGh0dHA6Ly90cnVzdGFzaWEyLW9jc3AuZGlnaXRhbGNlcnR2YWxpZGF0 -aW9uLmNvbTBLBggrBgEFBQcwAoY/aHR0cDovL3RydXN0YXNpYTItYWlhLmRpZ2l0 -YWxjZXJ0dmFsaWRhdGlvbi5jb20vdHJ1c3Rhc2lhZzUuY3J0MIIBAgYKKwYBBAHW -eQIEAgSB8wSB8ADuAHUA3esdK3oNT6Ygi4GtgWhwfi6OnQHVXIiNPRHEzbbsvswA -AAFd1CGINQAABAMARjBEAiA5wfZjgU0lC7GpY92MIkfh0UcnWvzthnKZ26mQk8NT -uQIgHyM5oBCkiQMokVBnKO802YIOup0kUOhhsPlWU4K7PSAAdQCkuQmQtBhYFIe7 -E6LMZ3AKPDWYBPkb37jjd80OyA3cEAAAAV3UIYh0AAAEAwBGMEQCIAaLUzpQpc0C -BAWnnZxsyW23WgcOsbiOP84EltTkR780AiBG3Ywinpkk+0ozGZC6g/cNkTOXQIl5 -0RXVF04AF/bSljANBgkqhkiG9w0BAQsFAAOCAQEARnZ8z+5zC3vZwBmcK2l7yZ5H -A3iQO3DSN+51EeycZ7uUN/A3Hx0/ZjdB7JjlWvohA7SimNw6xQald5mI65bmbDwy -ngtTfcZTx32WtbkU5/PiQSvkWMPqB4HJdyiozpdG6hIPZYvC2CqZHRBfgMo7XkQd -oj3fW1zBGw79fgqJkcs+9Qx0MGo4BaeBAP8ZSQAfDn/TR8BJFXzHnnk70pTwPKCa -EPuL8G/QDMy7+9WJB4t9qTdgxuqLdVSA7B3iGFYsQdR6Bjzbbngjr+OQIVDjij8c -a9+Mw5+S7EM2EE3L+nkHeXyB+EynVNWQqw4ASJ/S3u3OPQHkeKj1ppfBXJW7ww== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFZTCCBE2gAwIBAgIQOhAOfxCeGsWcxf/2QNXkQjANBgkqhkiG9w0BAQsFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMTYwODExMDAwMDAwWhcNMjYwODEwMjM1OTU5WjCBlzEL -MAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIElu -Yy4xHzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxHTAbBgNVBAsTFERv -bWFpbiBWYWxpZGF0ZWQgU1NMMSEwHwYDVQQDExhUcnVzdEFzaWEgRFYgU1NMIENB -IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC39aSJZG/97x3a -6Qmuc9+MubagegRAVUmFYHTYTs8IKB2pM7wXN7W8mekdZaEgUjDFxvRBK/DhTb7U -8ONLsKKdT86aOhzbz2noCTn9wPWnGwkg+/4YKg/dPQQdV9tMsSu0cwqInWHxSAkm -AI1hYFC9D7Sf7Hp/5cRcD+dK454YMRzNOGLQnCVI8JEqrz6o9SOvQNTqTcfqt6DC -0UlXG+MPD1eNPjlzf1Vwaab+VSTgySoC+Ikbq2VsdykeOiGXW/OIiASH7+2LcR05 -PmQ7GEOlM8yzoVojFpM8sHz+WxI05ZOPri5+vX3HhHHjWr5432G0dVmgohnZvlVZ -oy8XrlbpAgMBAAGjggF2MIIBcjASBgNVHRMBAf8ECDAGAQH/AgEAMC8GA1UdHwQo -MCYwJKAioCCGHmh0dHA6Ly9zLnN5bWNiLmNvbS9wY2EzLWc1LmNybDAOBgNVHQ8B -Af8EBAMCAQYwLgYIKwYBBQUHAQEEIjAgMB4GCCsGAQUFBzABhhJodHRwOi8vcy5z -eW1jZC5jb20wYQYDVR0gBFowWDBWBgZngQwBAgEwTDAjBggrBgEFBQcCARYXaHR0 -cHM6Ly9kLnN5bWNiLmNvbS9jcHMwJQYIKwYBBQUHAgIwGRoXaHR0cHM6Ly9kLnN5 -bWNiLmNvbS9ycGEwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMCkGA1Ud -EQQiMCCkHjAcMRowGAYDVQQDExFTeW1hbnRlY1BLSS0yLTYwMTAdBgNVHQ4EFgQU -bVjHfxrn4T8upoyXNUK79NM4rD8wHwYDVR0jBBgwFoAUf9Nlp8Ld7LvwMAnzQzn6 -Aq8zMTMwDQYJKoZIhvcNAQELBQADggEBABUphhBbeG7scE3EveIN0dOjXPgwgQi8 -I2ZAKYm6DawoGz1lEJVdvFmkyMbP973X80b7mKmn0nNbe1kjA4M0O0hHaMM1ZaEv -7e9vHEAoGyysMO6HzPWYMkyNxcCV7Nos2Uv4RvLDpQHh7P4Kt6fUU13ipcynrtQD -1lFUM0yoTzwwFsPu3Pk+94hL58ErqwqJQwxoHMgLIQeMVHeNKcWFy1bddSbIbCWU -Zs6cMxhrra062ZCpDCbxyEaFNGAtYQMqNz55Z/14XgSUONZ/cJTns6QKhpcgTOwB -fnNzRnk+aWreP7osKhXlz4zs+llP7goBDKFOMMtoEXx3YjJCKgpqmBU= +MIICojCCAYoCAQAwDQYJKoZIhvcNAQEEBQAwFzEVMBMGA1UEAwwMMTIwLjI3LjI3 +Ljk4MB4XDTE5MDIyMjA2MDg1MVoXDTI5MDIxOTA2MDg1MVowFzEVMBMGA1UEAwwM +MTIwLjI3LjI3Ljk4MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3P5X +4ROFaVpHNoI+a4+epK5gcfRRxyAjdroryjT/HdSQU9CnE28l5zrUsPx7JZcqbnNN +/S6gJcsIDSqglKRLBgBPab65/MwJvHKoowfuG75144DsgY5bMvoCqSTGX77Ado1W +vcEjwsYolxiDcnSp9A8VZX/qjTgWHe8/Si2saDa2zJ473n4qa0q/DvGXIQDviZcy +cxkPJgoRpFw03oJmdZsJGJ34+TN0AN9XiZ0XgOQIKIq8QXc7By+YUryfecz4GYQT +9f0K9sfY3W0bkkZ6LW9tauZU3N3/nr5fuOU7ia+IhPop7ly+9E6lyGHViwqcufbz +95wBQJR9AEwbJJdtRQIDAQABMA0GCSqGSIb3DQEBBAUAA4IBAQAQtFdCabM+Ybog +Z8xAbikeokOXr+X3UnUehXr3/FSJ+0/aWCzmNn8gXskYLyvCR1fkrk/0bVZoDxXt +pwux58CiJAbn6dhFIP9thqghqQ75Z/YR245pbulpamBgLTVdqWPyaaXokcXpr8wg +DhPZnfowCFu++UqoBeJ0IJGa1dpKdXYR8VIZFXXBf8vPGWsDu1dxMYHEM03Geutm +PNOJgENJGu9XHGBtzadiIiUI4rrmBqeMhQCUeMuiT3URfLAKujz2fi2RvohJvI9/ +MYmngt54XY1AJW/wKpdO+FhyIyDl/xGbxdbe1DuCrAm4okAlQVrp1Q2TTEcXflns +jeT+bba8 -----END CERTIFICATE----- \ No newline at end of file diff --git a/ssl/privateKey.pem b/ssl/privateKey.pem index 922ad3790..25f014052 100755 --- a/ssl/privateKey.pem +++ b/ssl/privateKey.pem @@ -1,27 +1,28 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEA4b8UtW0dcjlI+WUxSQKCT8E584LyosK2G660OH3n7MfUya02 -2SpKxJuXj44NeeFn6Qv6+4OmbivAoDzq1E/4BKEjGTYVorftsZ2IRT5G9CS4wr5a -qvk0s3M48mKG/HGBFg/bip2fRpFbqKEWpGqstl42ZfsA++rXzXkXlhwddLw9Fvwp -MqgZTuLijhLoq8Sy8NR8Zzp3aEDO5NSgsZCv60ZYRIv5Dqo2XjpaF2XP1qfoqXVL -0gRPjOQ9mDNmfijnIq+kF7s3cJRi4TiSpRXWhW6KQnJrSAQlCBO3txq89YYD/FSt -UUrHdJXXAT4Ysq+RAn0CnuywtI7SzjiqI5gPIwIDAQABAoIBAD9vYnJY5x1h24+5 -T9AkVFn1AkPbWDNEY8gDn8EAIFv5C2JgujjsGXaGAmDkmgTVwk1KgIyMwgfTY52j -gJmInzktzp8XA51l8fUnP1O13Fpet0yCERhaTuTeS/JQnX3yp0N70UVyZX9++TK5 -kZNCJqZYcxDVJ8GijGHA1U/pNp3GgIjqbdTrMISRA8MG8gb/zWWI6sDRASVWaWOS -z41pU4xe32pbjOYaLX/zQY6hGIzOjQquO6USmkexXC1w4iAS7WP0nCTTHfMVx8rg -R+A2xQElFwJt6aQI+heb21K4wiEoCRZPSHXuZKXcj+6H6wqpzpd0kgCCbbS7dcSL -I5OyiwECgYEA8Hf/a73wQlly62OT3VC1nOKgAuNzWVThbnzzyFsjsdfVt/Am+SQX -ORCrNvTfO8UHT8C7qFs4C9BSd/i0ZEWrli1l+ZO4N4EaOLcZYZ27cgBlNDf7BQpQ -X1p9YoKSpu+3l8e7AUQ23qzbvLyi/sYqLc+tuhITDvHVYobO7yd4iIkCgYEA8FOo -ksLiBeRKQvQT/goTB01IfPAnLHHLRAUtwd7dhXKZm/m4FQXVOBorslgXRVztaoS0 -Nm9CmTkuvkzMakw22IkqhsxOlRcD6TXMMT6H6k28tj3/knl+3QYGnJ7KE3Azs5+w -JzJZJ+MRNXiKu1yNCxq+sXWoR84pnMMQNOJ110sCgYAqHmqPnZIynOZDEor4rcVR -uGQcfWhb0kE2EA7HHiePY+WcNSUuaELlDOVgV92t42HXd0OnRmr3rsJzHw3Brm5S -fJsq7tPKbQOBwZhhf7YwTp9rWQ7PoDHZscjac1JqiPxYSnSX0THnKNHIKiZGh8El -iwW73KSX7oXYnxIp03kKOQKBgQCKTHpLyp5rKY6arP78SCvfHdhDHahNaUbB5AEK -+gecjfBb0/7dCjhDSrwuq4bowatWivtx/+DhcAi4NlXELgu53GV+oP/vyAjWIcFZ -7VQlv4qDjXYPgp9A7gDMDIzZVs5J5fFm/RBVZdQ3YyDi5UW9SCzIzp6Cg99qeM5Q -wKlztQKBgDaulZ/cexv55N+5GjgU03wpBnDh8SlHfe/JYeKmMrihSgxxUSPGTkLo -eosWBVHBrg4xHae4sFF+zbO0Z7EIbRYq9SX/Fh78OAH7PZe6byuESDv9tWPaNpuS -DFe4sOJXyUFMTYpq6x/gNfafMmOXal9kBZXqbBEMMj8/rKIVokzU ------END RSA PRIVATE KEY----- \ No newline at end of file +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDc/lfhE4VpWkc2 +gj5rj56krmBx9FHHICN2uivKNP8d1JBT0KcTbyXnOtSw/Hsllypuc039LqAlywgN +KqCUpEsGAE9pvrn8zAm8cqijB+4bvnXjgOyBjlsy+gKpJMZfvsB2jVa9wSPCxiiX +GINydKn0DxVlf+qNOBYd7z9KLaxoNrbMnjvefiprSr8O8ZchAO+JlzJzGQ8mChGk +XDTegmZ1mwkYnfj5M3QA31eJnReA5AgoirxBdzsHL5hSvJ95zPgZhBP1/Qr2x9jd +bRuSRnotb21q5lTc3f+evl+45TuJr4iE+inuXL70TqXIYdWLCpy59vP3nAFAlH0A +TBskl21FAgMBAAECggEAJUEbP24zB1eYua+rJibH76sVxyAQySi50cIAr83PVBAJ +ZJfAEp6iHSDlyhBGEkgxdv0pII1Dohtf+Bg/ic9IdnKG8KSeZedfnM0XcKRdl3+8 +D+Yj+JMu/KD44dq5NlrJxzJ8dPCiPqt5HD+dqSXRoLsKOFogCD50PAeg+7hHYCnI +worCm6MoCD8Qps6ArmR/YRatAF0wPQxCTX+TRww12gbgWTFPl0ocETth0r3LQHtz +jaOu/EtO87WXt1i3NjaRImLMnBytOPVUM0tLXGiAnXvfg39c8cyYUof2FbFO+kgT +nK89NrlPWMUo6jGZyf4riVdcPqza/FH5IEv4ToLL4QKBgQD8ICRM9oLtBJKf+749 +auZbca25fSDfid/pSWaGB0VymJoETPfUMhKnrBi8uLcL0VJ6+I+kFmhZL/j3R5g3 +7D9NhJyfGDBJv3CfjK2L/zPCiESEnMt0IRiEcxaIX+K9SjfHwCam4XLsnDWNG49B +WZ0onQNjY5IdYV7wsRMlBDmN6wKBgQDgY7qCUJVilRVX2TLOYgKIGaAb7QVVX9Bz +wukPRD/OFoufZRltbhwWCDrDRVJZlRccpAq+cr6KXg9AKhbn2xc6aLG4vPWBgLB0 +P+QcR4lszRqqiM0yRUhOJSk3nFBtS7lsf80qTdP+Cz/M317/z7yqQNi92tNaHNLN +sYmVrM61jwKBgQDuIznGS+xcDL6lR3Vns2nDI3twQOTk3uhUA5VHsOSCmeqXd095 +6JXAM4fl8R5LljmulsmttdB3tR0WC1SWNZmREVmR15n8fkrVGF3vZmuwKV92VlbA +6GWs7LtysgaKvegzzqVzaGxRWjYmgsprckZDzxIdNTYUdBzlgItRokzuYwKBgG7Y +9U7g7hsIGMYP9ug7RJLlTdHd0e+t6HT3SViQV5DAVHMGZ3xGk7tSj2zdduPoIcW1 +R9VzK6uA8bm50Rzyf1QMWhcvyXwTDZgv48kQkdPcspqh//Qgg6qO8wCUyKplaREv +RTPrxJjQB9F2WyC2B7Z3WFrZmeT/LigM1zHIb0kDAoGABmrg8nXGBrEdtYXHFdem +1iP0X3+Xt/RwH50YjsNNbUmngIbiR5q71vFkfM7UhIjlnKX/HfSTCUyCtLjHBIFh +E/OHbEVgElbegnCx3uX4+kxP/oFGNh9t9fJAOsipaYrVVyQWK3C5ilrcBcx4jdXB +c4cumeA0lZ2p1hc82ArHxYk= +-----END PRIVATE KEY----- \ No newline at end of file