Auto detect ssl

Signed-off-by: Jianhui Zhao <jianhuizhao329@gmail.com>
This commit is contained in:
Jianhui Zhao
2018-10-05 13:14:08 +08:00
parent 9ccd0c7c59
commit d4e51e975f
7 changed files with 372 additions and 100 deletions
+31
View File
@@ -0,0 +1,31 @@
-----BEGIN CERTIFICATE-----
MIIFSjCCBDKgAwIBAgIJAJpYgXmFONApMA0GCSqGSIb3DQEBDQUAMGoxFzAVBgNV
BAMMDkFuIE1RVFQgYnJva2VyMRYwFAYDVQQKDA1Pd25UcmFja3Mub3JnMRQwEgYD
VQQLDAtnZW5lcmF0ZS1DQTEhMB8GCSqGSIb3DQEJARYSbm9ib2R5QGV4YW1wbGUu
bmV0MB4XDTE4MTAwNTA1MTQ1OVoXDTMyMTAwMTA1MTQ1OVowYTEOMAwGA1UEAwwF
cnR0eXMxFjAUBgNVBAoMDU93blRyYWNrcy5vcmcxFDASBgNVBAsMC2dlbmVyYXRl
LUNBMSEwHwYJKoZIhvcNAQkBFhJub2JvZHlAZXhhbXBsZS5uZXQwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCokEhSChdYmsVKOJ3rc79ZfJa2uXePUsSn
GZkimUC+8JZTX20XoQK7bOT8zzFb2Ov41k2AIGOMgaL1AierBDD1ZooHqWYsRsBC
Moy9rfSfm57n6F81i46Q0T+AB0CLUCTGtCAsCwe98Dx06pUYGh7LK5LIYfNVowcc
+zPgpVHh0pWgoBVns/iPAdTDmrOc7PoARa19pktkZNZcxGytp5+4dlRyXgvPfcJm
yseURTT78dNf0Ll2STK3Jp8hF04CGt6AcK9f0Pt2cGlycplzaEy2T1WzdSBwgc2n
R57V/nlyZv+ZMomn5u1a0yxrYCcTmqra+inTXkNW78lVCVp+mF6DAgMBAAGjggH6
MIIB9jAMBgNVHRMBAf8EAjAAMBEGCWCGSAGG+EIBAQQEAwIGQDALBgNVHQ8EBAMC
BeAwIQYJYIZIAYb4QgENBBQWEkJyb2tlciBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQU
JNiQEpT+ajpLRYGpLhQj3zTF/jIwgZwGA1UdIwSBlDCBkYAUuJpvToERNP3Ur4np
xKIMqcAcRJ+hbqRsMGoxFzAVBgNVBAMMDkFuIE1RVFQgYnJva2VyMRYwFAYDVQQK
DA1Pd25UcmFja3Mub3JnMRQwEgYDVQQLDAtnZW5lcmF0ZS1DQTEhMB8GCSqGSIb3
DQEJARYSbm9ib2R5QGV4YW1wbGUubmV0ggkAybRzZGSIhQIwXAYDVR0RBFUwU4cE
rBEAAYcQ/oAAAAAAAAAAQs///munWYcEwKhWZIcQ/oAAAAAAAAD9UOn0YCF5/4cE
fwAAAYcQAAAAAAAAAAAAAAAAAAAAAYIJbG9jYWxob3N0MIGGBgNVHSAEfzB9MHsG
AysFCDB0MBwGCCsGAQUFBwIBFhBodHRwOi8vbG9jYWxob3N0MFQGCCsGAQUFBwIC
MEgwEBYJT3duVHJhY2tzMAMCAQEaNFRoaXMgQ0EgaXMgZm9yIGEgbG9jYWwgTVFU
VCBicm9rZXIgaW5zdGFsbGF0aW9uIG9ubHkwDQYJKoZIhvcNAQENBQADggEBAE8u
+H6wDWeVkQz3PrkKl66/fJgf8FFVsdQoz9g1Ewt01X0IaR0xWP5hPefvScsIComf
jPqkHiHkGaib0aBKjNSqyJQbrWz8hh++cRNp78e9NaktnW5JEkKznh5tPHXHdSeC
dRwKY1DFsebdRl2wbYOHf32xgA6x7rksS78vhPF3UfXjzTQdrvXEJzeZBFfsb54w
6Fs0KtvP2Tedkr5+AUJmKRigimH6oc4CTR3jYKbHJSKNdx2o7kAIkD4O2phuvHj6
9tXhpNmhu/j8F3S3HsQibAocgnSNou3JFRPkJGtpHjUDB9eiNOY84bGjIA50fgwf
ScWnTKRoDBqMiOME49A=
-----END CERTIFICATE-----
+27
View File
@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAqJBIUgoXWJrFSjid63O/WXyWtrl3j1LEpxmZIplAvvCWU19t
F6ECu2zk/M8xW9jr+NZNgCBjjIGi9QInqwQw9WaKB6lmLEbAQjKMva30n5ue5+hf
NYuOkNE/gAdAi1AkxrQgLAsHvfA8dOqVGBoeyyuSyGHzVaMHHPsz4KVR4dKVoKAV
Z7P4jwHUw5qznOz6AEWtfaZLZGTWXMRsraefuHZUcl4Lz33CZsrHlEU0+/HTX9C5
dkkytyafIRdOAhregHCvX9D7dnBpcnKZc2hMtk9Vs3UgcIHNp0ee1f55cmb/mTKJ
p+btWtMsa2AnE5qq2vop015DVu/JVQlafphegwIDAQABAoIBAHU7w9CrDAmnuscg
EVUML20BZaC35RtdKUA+YW7av1kM4sAhgjII3WmVFr1tLJsAhz2NbmFKJXI3Ryq3
0Pbz90j1g9JIUrNAkb54gcH6FkRba21HA9Ctuv2lSlC0uoMpviokZKu9ECldx+5Y
qFEW+Yu8Rl3vIdnRhMT3QOFgmU5Akqzlx+/S93y1enGcbUafM3AQY56Gsc8ITfZH
4IJsFihQv6+Vh2cNa40GNldLCEux5u77tU7R7+djThIEOsdjKXNkPCdX+qrI85/z
PlJCFs5aokeH7hBELTzbNKViTtK8Vrh1EEy+Gji5ZGr45oZsOOskHv13/0QEbEYS
ipTZ9GECgYEA0rHB4W2OSrSonrWZjOMFMxhHqmfDTPvruXeEok1Ul9++C4UrimX/
Voqyx11h7JCV7YfqyqQvJ6GdiGJ/BLvj26+IPYAE7jxGTINEhgYh8471Hf6yyLyb
5qqtlRjC6HqXXzrjHwmZM/6LXy5NLAS9EESotLC73ddEYXtBoLl6EH0CgYEAzM9S
ur3ayAcSpnUKNhkolG3j+cppEabZa0PMWDaxBm3PcoJdWpZr08vRh1ECEEi0Peez
C7hh5Y73+Ql7y31EpKWPxitCdWixl4aybsmhVF2wh0S7Nj/wQCvBXhh+1Aus+cdR
RuMl/M9afKxogBVAxb94VY/HpBbBTvHCD4DuWv8CgYBeGL9DA1+6I4bvIqGKF1Wa
JSzUgPTrK9NyCFu29JxkG6vPj1ELxVPM/bKscRsrwMMEy1/j0oGwzHADmiGqJpOz
6GgLN2J8V3T59OIkjRaapOz50WddWUazNOTDIsTheOajxDPtB6dhXjw2bQJQN2mM
m21RDWFJyTsj4h1EP7GxLQKBgQCJ1sJ78cirtK7lnoGH1TjNZIP5GjPKcHuFSHTf
rbdId2EVVQ2VKQVa3qKeqnN0GCpOO4Dx0173i1fyoGJTmnQ3R0HTAkxRDmvvafTu
wP618/QZpbVFlpSP66LRPDUnatA4rt9RkRCA6+CfZb1S7nrQW8OV+hVHpxTkl6qe
moxQawKBgGLqiny9i0Hi+rhU6MhWCMI0ngR8bB2KmvWlc/IlsYrICjfVBHD2Z7V2
L+0orf6zIgrRmYpUeJIEmyYapeiZV10hNVj++upAm/KxTTeeSYgCnSVtWtJ6u7XV
tw7DqAubSuVtG1Jogez8EST1/d3z8qiZDNAAGKnUSQc2nYUFlYBh
-----END RSA PRIVATE KEY-----
Executable
+291
View File
@@ -0,0 +1,291 @@
#!/usr/bin/env bash
#(@)generate-CA.sh - Create CA key-pair and server key-pair signed by CA
# Copyright (c) 2013-2016 Jan-Piet Mens <jpmens()gmail.com>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. Neither the name of mosquitto nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# Usage:
# ./generate-CA.sh creates ca.crt and server.{key,crt}
# ./generate-CA.sh hostname creates hostname.{key,crt}
# ./generate-CA.sh client email creates email.{key,crt}
#
# Set the following optional environment variables before invocation
# to add the specified IP addresses and/or hostnames to the subjAltName list
# These contain white-space-separated values
#
# IPLIST="172.13.14.15 192.168.1.1"
# HOSTLIST="a.example.com b.example.com"
set -e
export LANG=C
kind=server
if [ $# -ne 2 ]; then
kind=server
host=$(hostname -f)
if [ -n "$1" ]; then
host="$1"
fi
else
kind=client
CLIENT="$2"
fi
[ -z "$USER" ] && USER=root
DIR=${TARGET:='.'}
# A space-separated list of alternate hostnames (subjAltName)
# may be empty ""
ALTHOSTNAMES=${HOSTLIST}
ALTADDRESSES=${IPLIST}
CA_ORG='/O=OwnTracks.org/OU=generate-CA/emailAddress=nobody@example.net'
CA_DN="/CN=An MQTT broker${CA_ORG}"
CACERT=${DIR}/ca
SERVER="${DIR}/${host}"
SERVER_DN="/CN=${host}$CA_ORG"
keybits=2048
openssl=$(which openssl)
MOSQUITTOUSER=${MOSQUITTOUSER:=$USER}
# Signature Algorithm. To find out which are supported by your
# version of OpenSSL, run `openssl dgst -help` and set your
# signature algorithm here. For example:
#
# defaultmd="-sha256"
#
defaultmd="-sha512"
function maxdays() {
nowyear=$(date +%Y)
years=$(expr 2032 - $nowyear)
days=$(expr $years '*' 365)
echo $days
}
function getipaddresses() {
/sbin/ifconfig |
grep -v tunnel |
sed -En '/inet6? /p' |
sed -Ee 's/inet6? (addr:)?//' |
awk '{print $1;}' |
sed -e 's/[%/].*//' |
egrep -v '(::1|127\.0\.0\.1)' # omit loopback to add it later
}
function addresslist() {
ALIST=""
for a in $(getipaddresses); do
ALIST="${ALIST}IP:$a,"
done
ALIST="${ALIST}IP:127.0.0.1,IP:::1,"
for ip in $(echo ${ALTADDRESSES}); do
ALIST="${ALIST}IP:${ip},"
done
for h in $(echo ${ALTHOSTNAMES}); do
ALIST="${ALIST}DNS:$h,"
done
ALIST="${ALIST}DNS:localhost"
echo $ALIST
}
days=$(maxdays)
if [ -n "$CAKILLFILES" ]; then
rm -f $CACERT.??? $SERVER.??? $CACERT.srl
fi
if [ ! -f $CACERT.crt ]; then
# ____ _
# / ___| / \
# | | / _ \
# | |___ / ___ \
# \____/_/ \_\
#
# Create un-encrypted (!) key
$openssl req -newkey rsa:${keybits} -x509 -nodes $defaultmd -days $days -extensions v3_ca -keyout $CACERT.key -out $CACERT.crt -subj "${CA_DN}"
echo "Created CA certificate in $CACERT.crt"
$openssl x509 -in $CACERT.crt -nameopt multiline -subject -noout
chmod 400 $CACERT.key
chmod 444 $CACERT.crt
chown $MOSQUITTOUSER $CACERT.*
echo "Warning: the CA key is not encrypted; store it safely!"
fi
if [ $kind == 'server' ]; then
# ____
# / ___| ___ _ ____ _____ _ __
# \___ \ / _ \ '__\ \ / / _ \ '__|
# ___) | __/ | \ V / __/ |
# |____/ \___|_| \_/ \___|_|
#
if [ ! -f $SERVER.key ]; then
echo "--- Creating server key and signing request"
$openssl genrsa -out $SERVER.key $keybits
$openssl req -new $defaultmd \
-out $SERVER.csr \
-key $SERVER.key \
-subj "${SERVER_DN}"
chmod 400 $SERVER.key
chown $MOSQUITTOUSER $SERVER.key
fi
if [ -f $SERVER.csr -a ! -f $SERVER.crt ]; then
# There's no way to pass subjAltName on the CLI so
# create a cnf file and use that.
CNF=`mktemp /tmp/cacnf.XXXXXXXX` || { echo "$0: can't create temp file" >&2; exit 1; }
sed -e 's/^.*%%% //' > $CNF <<\!ENDconfig
%%% [ JPMextensions ]
%%% basicConstraints = critical,CA:false
%%% nsCertType = server
%%% keyUsage = nonRepudiation, digitalSignature, keyEncipherment
%%% nsComment = "Broker Certificate"
%%% subjectKeyIdentifier = hash
%%% authorityKeyIdentifier = keyid,issuer:always
%%% subjectAltName = $ENV::SUBJALTNAME
%%% # issuerAltName = issuer:copy
%%% ## nsCaRevocationUrl = http://mqttitude.org/carev/
%%% ## nsRevocationUrl = http://mqttitude.org/carev/
%%% certificatePolicies = ia5org,@polsection
%%%
%%% [polsection]
%%% policyIdentifier = 1.3.5.8
%%% CPS.1 = "http://localhost"
%%% userNotice.1 = @notice
%%%
%%% [notice]
%%% explicitText = "This CA is for a local MQTT broker installation only"
%%% organization = "OwnTracks"
%%% noticeNumbers = 1
!ENDconfig
SUBJALTNAME="$(addresslist)"
export SUBJALTNAME # Use environment. Because I can. ;-)
echo "--- Creating and signing server certificate"
$openssl x509 -req $defaultmd \
-in $SERVER.csr \
-CA $CACERT.crt \
-CAkey $CACERT.key \
-CAcreateserial \
-CAserial "${DIR}/ca.srl" \
-out $SERVER.crt \
-days $days \
-extfile ${CNF} \
-extensions JPMextensions
rm -f $CNF
chmod 444 $SERVER.crt
chown $MOSQUITTOUSER $SERVER.crt
fi
else
# ____ _ _ _
# / ___| (_) ___ _ __ | |_
# | | | | |/ _ \ '_ \| __|
# | |___| | | __/ | | | |_
# \____|_|_|\___|_| |_|\__|
#
if [ ! -f $CLIENT.key ]; then
echo "--- Creating client key and signing request"
$openssl genrsa -out $CLIENT.key $keybits
CNF=`mktemp /tmp/cacnf-req.XXXXXXXX` || { echo "$0: can't create temp file" >&2; exit 1; }
# Mosquitto's use_identity_as_username takes the CN attribute
# so we're populating that with the client's name
sed -e 's/^.*%%% //' > $CNF <<!ENDClientconfigREQ
%%% [ req ]
%%% distinguished_name = req_distinguished_name
%%% prompt = no
%%% output_password = secret
%%%
%%% [ req_distinguished_name ]
%%% # O = OwnTracks
%%% # OU = MQTT
%%% # CN = Suzie Smith
%%% CN = $CLIENT
%%% # emailAddress = $CLIENT
!ENDClientconfigREQ
$openssl req -new $defaultmd \
-out $CLIENT.csr \
-key $CLIENT.key \
-config $CNF
chmod 400 $CLIENT.key
fi
if [ -f $CLIENT.csr -a ! -f $CLIENT.crt ]; then
CNF=`mktemp /tmp/cacnf-cli.XXXXXXXX` || { echo "$0: can't create temp file" >&2; exit 1; }
sed -e 's/^.*%%% //' > $CNF <<\!ENDClientconfig
%%% [ JPMclientextensions ]
%%% basicConstraints = critical,CA:false
%%% subjectAltName = email:copy
%%% nsCertType = client,email
%%% extendedKeyUsage = clientAuth,emailProtection
%%% keyUsage = digitalSignature, keyEncipherment, keyAgreement
%%% nsComment = "Client Broker Certificate"
%%% subjectKeyIdentifier = hash
%%% authorityKeyIdentifier = keyid,issuer:always
!ENDClientconfig
SUBJALTNAME="$(addresslist)"
export SUBJALTNAME # Use environment. Because I can. ;-)
echo "--- Creating and signing client certificate"
$openssl x509 -req $defaultmd \
-in $CLIENT.csr \
-CA $CACERT.crt \
-CAkey $CACERT.key \
-CAcreateserial \
-CAserial "${DIR}/ca.srl" \
-out $CLIENT.crt \
-days $days \
-extfile ${CNF} \
-extensions JPMclientextensions
rm -f $CNF
chmod 444 $CLIENT.crt
fi
fi
+23
View File
@@ -93,6 +93,17 @@ func httpAuth(w http.ResponseWriter, r *http.Request) bool {
return true
}
func pathExist(path string) bool {
_, err := os.Stat(path)
if err == nil {
return true
}
if os.IsNotExist(err) {
return false
}
return false
}
func main() {
port := flag.Int("port", 5912, "http service port")
cert := flag.String("cert", "", "certFile Path")
@@ -194,6 +205,18 @@ func main() {
staticfs.ServeHTTP(w, r)
})
if *cert == "" {
if pathExist("rttys.crt") {
*cert = "rttys.crt"
}
}
if *key == "" {
if pathExist("rttys.key") {
*key = "rttys.key"
}
}
if *cert != "" && *key != "" {
rlog.Println("Listen on: ", *port, "SSL on")
rlog.Fatal(http.ListenAndServeTLS(":"+strconv.Itoa(*port), *cert, *key, nil))
-48
View File
@@ -1,48 +0,0 @@
#! /bin/sh
### BEGIN INIT INFO
# Provides: rttys
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Execute the xterminal_broker command.
# Description:
### END INIT INFO
PATH=/sbin:/usr/sbin:/bin:/usr/bin
. /lib/lsb/init-functions
RTTYSPID=/var/run/rttys.pid
PORT=5912
do_start () {
start-stop-daemon --start --make-pidfile --pidfile $RTTYSPID --background --exec /usr/local/bin/rttys -- -port $PORT -cert /etc/rttys/rttys.crt -key /etc/rttys/rttys.key
}
do_stop () {
start-stop-daemon --stop --pidfile $RTTYSPID
sleep 1
rm -f $RTTYSPID
}
case "$1" in
start)
do_start
;;
stop)
do_stop
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported" >&2
exit 3
;;
status)
exit 0
;;
*)
echo "Usage: $0 start|stop" >&2
exit 3
;;
esac
-24
View File
@@ -1,24 +0,0 @@
-----BEGIN CERTIFICATE-----
MIID8TCCAtmgAwIBAgICCCUwDQYJKoZIhvcNAQELBQAwczELMAkGA1UEBhMCQ04x
EDAOBgNVBAgMB1RpYW5qaW4xEDAOBgNVBAcMB1RpYW5qaW4xFTATBgNVBAoMDENI
SU5BU1NMIEluYzEpMCcGA1UEAwwgQ0hJTkFTU0wgQ2VydGlmaWNhdGlvbiBBdXRo
b3JpdHkwHhcNMTgwMzAzMTQyODQ2WhcNMTkwMzAzMTQyODQ2WjCBgzELMAkGA1UE
BhMCQ04xEDAOBgNVBAgMB3NpY2h1YW4xEjAQBgNVBAoMCXpoYW9qaDMyOTETMBEG
A1UECwwKd2lmaWRvZy1uZzEQMA4GA1UEAwwHd2lmaWRvZzEnMCUGCSqGSIb3DQEJ
ARYYamlhbmh1aXpoYW8zMjlAZ21haWwuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAyD8gd3XIJvkYeySP2q0toYsfvhlA+lceUPiMi16U1nR3TD5U
uTNGsvYBDMiR7vG0NKClFT73u/d8HBcYcTBgbhHfBkz4v9S5aMdUYQsUMQEITBdE
hPEeXVqqj796Lu6iEkNUFrtam2h3t+kYODjbszk2woBtohaRWfNyOB/AJH6Stv4l
jkPYwt9NHcKQSm9kjcGsAqQwkgVd4UfHX2G20gaTijimeHlJL2wv61uLBUvYux0E
+98KIcEIYu3BVAfoO2Omg/o73cwH+sFTswEXPuXirwrOzmJ850WBLScLkSKSATrY
1YdU6CRaJuP/POFfSqAhn/mPRNQFU5fAaDcfEwIDAQABo34wfDAJBgNVHRMEAjAA
MC8GCWCGSAGG+EIBDQQiFiBDSElOQVNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
eTAdBgNVHQ4EFgQU9XS4dW6j1r1lEOIHWkoJx3zSqqgwHwYDVR0jBBgwFoAUXB8j
+sjhITHC2Df2iPzSb8JUQzMwDQYJKoZIhvcNAQELBQADggEBAFsaq5qehwp0zMqY
cb0IX5/f4ZnscX587SM/NhORODa0p/bT3EwG3grtljHhRW+s/4c4gPgilrzV0Fxn
Y5FodLfFdbNVjhgeSrDCRmwIvKSe81LYOe+rbfTBF0g3YYWDwcwc8tFvcwWBxqWn
4F+u9aIKgHU7HXQokqCxEOTFjrAHVJf1OqtRMTXlBBb6ypVdHn0glfSxOIC/Vp2T
5UR7oVdD4E8ASqe7Q7MmTeY377CRagfd0WD9XK7o+cbKkLLW1QWc8ht1rHjGp+/2
gmkxEmpX2Xhpv1FX/b6sj1dTmOc2bXBzpvV6yonRMu5dYsOrdDwbH/T05X+hCFW9
G86ZLFY=
-----END CERTIFICATE-----
-28
View File
@@ -1,28 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDIPyB3dcgm+Rh7
JI/arS2hix++GUD6Vx5Q+IyLXpTWdHdMPlS5M0ay9gEMyJHu8bQ0oKUVPve793wc
FxhxMGBuEd8GTPi/1Llox1RhCxQxAQhMF0SE8R5dWqqPv3ou7qISQ1QWu1qbaHe3
6Rg4ONuzOTbCgG2iFpFZ83I4H8AkfpK2/iWOQ9jC300dwpBKb2SNwawCpDCSBV3h
R8dfYbbSBpOKOKZ4eUkvbC/rW4sFS9i7HQT73wohwQhi7cFUB+g7Y6aD+jvdzAf6
wVOzARc+5eKvCs7OYnznRYEtJwuRIpIBOtjVh1ToJFom4/884V9KoCGf+Y9E1AVT
l8BoNx8TAgMBAAECggEAK/JmvrDzt1HtxIDWrWhaXly5H7BNKWPbPGv/9EpSoeo3
kF0RnP+a4YXJ3zNZi7YyFWa4NDx4hCEhdMzAyX6TezSi3LAh23/lHRC5/P5AdSzD
1Gc6225LerN+QUQFna0zlox+NOrzTK4VsCAQ963K0b+ZvAARj4QibDpYc+bL9XYK
fVrZSnGJhNY3S6YjTF4oyMejKxk+HPhgCVEcZCHiC0RmXVqfETe6Cu0UtDPTTK5Q
IXYYZ0HLsqaGWwGCWm/ji6HjNCG1dUhUp/yZR+7X45Utok3Rd3wo0kxZGJ7LHH4N
541qcFbaT3rX39uPypuK5dSc5lb98FAOl79jL/wnUQKBgQDjEycf6VKZYf8d/MMV
4+0YrFV7sdi0k4TC+lFmfJZVFHqcPn99q3cO2b9npgLDpQpwpcyBGMh6hWufVXXA
ctrxg8vjKBHG8MT70Lulvi+G3Fldw7EHVVQGEHRqPaSzA035JyVanDs6lgoqjj9b
BuMQidIeaj2t28pEhc0rYstW6wKBgQDhwRzoCirKrtJDWclDkjbzkGUfoAKMz2p2
mSAs2xCdrx8vtFzUXcCLsvlXa+hIEe4O5cUZg+WLPfXiV4gtF74PTkmYADXRTUBl
dHzfjVWQINEYFsWOEP5eYB0VWiA52JUaCuHuHILt6CSy3h8xPtnq+/oEFTeqh/2C
XoN+seKeeQKBgQDUE1c/HpLeXf/+6crp7u3JVWqhFADo5b3gvBi6NzHQVEgPFO/N
Vw7i98sj6pA6WTHe83qEN7lFdMaHETHgg2SonAcYKJwxyTywUspuiampsrJkOBhm
WPMYltWjQ99GsZdpU343miJXHTpxdFkHku8OyylK7r6cWeIXDUAJfUOb8QKBgFbk
ZoTljOzwdxvXTkFE4QPEmzed9f1OxHKbo6fANdgLlJxe9rAC2d6rZ49/iCtdQ1zW
kZOtkceTdLXG7TI2BkCL6IWp5w0Fh/jE6l99XeaYywJTmXyCC/Y1VlxmkSrSsykP
8UAeF0MM7DswhZ8FywjILcYuiHuJ1ki8qi40t745AoGAT/5imiro59cHMbbGEQb+
42oBY7RxeHkk6+8WTJA6kqv8tuOK3gvDFm5cRJVCduVF/Jf+276IMoTMEb8kBGQA
R3CRsYwLPrpdWu2q9Ho1KtH+azt/d+3uglT9g3fhvFieNIwkRgaNNJQC6wmddDeG
MEYv4HO1LykipsDVsFadVCk=
-----END PRIVATE KEY-----