Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RabbitMQ TLS #4094

Merged
merged 19 commits into from
Jun 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/2-features/rabbit-tls
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Support connecting to RabbitMQ over TLS. See "Configure RabbitMQ" section in the documentation for details.
13 changes: 12 additions & 1 deletion charts/background-worker/templates/configmap.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,19 @@ data:
host: federator
port: 8080

{{- with .rabbitmq }}
rabbitmq:
{{toYaml .rabbitmq | indent 6 }}
host: {{ .host }}
port: {{ .port }}
vHost: {{ .vHost }}
adminPort: {{ .adminPort }}
enableTls: {{ .enableTls }}
insecureSkipVerifyTls: {{ .insecureSkipVerifyTls }}
{{- if .tlsCaSecretRef }}
caCert: /etc/wire/background-worker/rabbitmq-ca/{{ .tlsCaSecretRef.key }}
{{- end }}
{{- end }}

backendNotificationPusher:
{{toYaml .backendNotificationPusher | indent 6 }}
{{- end }}
9 changes: 9 additions & 0 deletions charts/background-worker/templates/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ spec:
- name: "background-worker-secrets"
secret:
secretName: "background-worker"
{{- if .Values.config.rabbitmq.tlsCaSecretRef }}
- name: "rabbitmq-ca"
secret:
secretName: {{ .Values.config.rabbitmq.tlsCaSecretRef.name }}
{{- end }}
containers:
- name: background-worker
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
Expand All @@ -47,6 +52,10 @@ spec:
volumeMounts:
- name: "background-worker-config"
mountPath: "/etc/wire/background-worker/conf"
{{- if .Values.config.rabbitmq.tlsCaSecretRef }}
- name: "rabbitmq-ca"
mountPath: "/etc/wire/background-worker/rabbitmq-ca/"
{{- end }}
env:
- name: RABBITMQ_USERNAME
valueFrom:
Expand Down
6 changes: 6 additions & 0 deletions charts/background-worker/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ config:
port: 5672
vHost: /
adminPort: 15672
enableTls: false
insecureSkipVerifyTls: false
# tlsCaSecretRef:
# name: <secret-name>
# key: <ca-attribute>

backendNotificationPusher:
pushBackoffMinWait: 10000 # in microseconds, so 10ms
pushBackoffMaxWait: 300000000 # microseconds, so 300s
Expand Down
12 changes: 11 additions & 1 deletion charts/brig/templates/configmap.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,18 @@ data:
federatorInternal:
host: federator
port: 8080

{{- with .rabbitmq }}
rabbitmq:
{{ toYaml .rabbitmq | indent 6}}
host: {{ .host }}
port: {{ .port }}
vHost: {{ .vHost }}
enableTls: {{ .enableTls }}
insecureSkipVerifyTls: {{ .insecureSkipVerifyTls }}
{{- if .tlsCaSecretRef }}
caCert: /etc/wire/brig/rabbitmq-ca/{{ .tlsCaSecretRef.key }}
{{- end }}
{{- end }}
{{- end }}

{{- with .aws }}
Expand Down
9 changes: 9 additions & 0 deletions charts/brig/templates/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,11 @@ spec:
secret:
secretName: {{ include "additionalElasticsearchTlsSecretName" .Values.config }}
{{- end }}
{{- if .Values.config.rabbitmq.tlsCaSecretRef }}
- name: "rabbitmq-ca"
secret:
secretName: {{ .Values.config.rabbitmq.tlsCaSecretRef.name }}
{{- end }}

containers:
- name: brig
Expand Down Expand Up @@ -87,6 +92,10 @@ spec:
- name: "additional-elasticsearch-ca"
mountPath: "/etc/wire/brig/additional-elasticsearch-ca/"
{{- end }}
{{- if .Values.config.rabbitmq.tlsCaSecretRef }}
- name: "rabbitmq-ca"
mountPath: "/etc/wire/brig/rabbitmq-ca/"
{{- end }}
env:
- name: LOG_LEVEL
value: {{ .Values.config.logLevel }}
Expand Down
5 changes: 5 additions & 0 deletions charts/brig/templates/tests/brig-integration.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ spec:
secret:
secretName: {{ (include "tlsSecretRef" .Values.config | fromYaml).name }}
{{- end}}
- name: "rabbitmq-ca"
secret:
secretName: {{ .Values.config.rabbitmq.tlsCaSecretRef.name }}
containers:
- name: integration
image: "{{ .Values.image.repository }}-integration:{{ .Values.image.tag }}"
Expand Down Expand Up @@ -119,6 +122,8 @@ spec:
- name: "brig-cassandra"
mountPath: "/etc/wire/brig/cassandra"
{{- end }}
- name: "rabbitmq-ca"
mountPath: "/etc/wire/brig/rabbitmq-ca/"

env:
# these dummy values are necessary for Amazonka's "Discover"
Expand Down
5 changes: 5 additions & 0 deletions charts/brig/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,11 @@ config:
host: rabbitmq
port: 5672
vHost: /
enableTls: false
insecureSkipVerifyTls: false
# tlsCaSecretRef:
# name: <secret-name>
# key: <ca-attribute>
emailSMS:
general:
templateBranding:
Expand Down
12 changes: 11 additions & 1 deletion charts/galley/templates/configmap.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,18 @@ data:
federator:
host: federator
port: 8080

{{- with .rabbitmq }}
rabbitmq:
{{ toYaml .rabbitmq | indent 6}}
host: {{ .host }}
port: {{ .port }}
vHost: {{ .vHost }}
enableTls: {{ .enableTls }}
insecureSkipVerifyTls: {{ .insecureSkipVerifyTls }}
{{- if .tlsCaSecretRef }}
caCert: /etc/wire/galley/rabbitmq-ca/{{ .tlsCaSecretRef.key }}
{{- end }}
{{- end }}
{{- end }}

{{- if (.journal) }}
Expand Down
9 changes: 9 additions & 0 deletions charts/galley/templates/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ spec:
secret:
secretName: {{ (include "tlsSecretRef" .Values.config | fromYaml).name }}
{{- end }}
{{- if .Values.config.rabbitmq.tlsCaSecretRef }}
- name: "rabbitmq-ca"
secret:
secretName: {{ .Values.config.rabbitmq.tlsCaSecretRef.name }}
{{- end }}
containers:
- name: galley
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
Expand All @@ -58,6 +63,10 @@ spec:
- name: "galley-cassandra"
mountPath: "/etc/wire/galley/cassandra"
{{- end }}
{{- if .Values.config.rabbitmq.tlsCaSecretRef }}
- name: "rabbitmq-ca"
mountPath: "/etc/wire/galley/rabbitmq-ca/"
{{- end }}
env:
{{- if hasKey .Values.secrets "awsKeyId" }}
- name: AWS_ACCESS_KEY_ID
Expand Down
5 changes: 5 additions & 0 deletions charts/galley/templates/tests/galley-integration.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ spec:
secret:
secretName: {{ (include "tlsSecretRef" .Values.config | fromYaml).name }}
{{- end }}
- name: "rabbitmq-ca"
secret:
secretName: {{ .Values.config.rabbitmq.tlsCaSecretRef.name }}
containers:
- name: integration
image: "{{ .Values.image.repository }}-integration:{{ .Values.image.tag }}"
Expand Down Expand Up @@ -93,6 +96,8 @@ spec:
- name: "galley-cassandra"
mountPath: "/etc/wire/galley/cassandra"
{{- end }}
- name: "rabbitmq-ca"
mountPath: "/etc/wire/galley/rabbitmq-ca/"
env:
# these dummy values are necessary for Amazonka's "Discover"
- name: AWS_ACCESS_KEY_ID
Expand Down
5 changes: 5 additions & 0 deletions charts/galley/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ config:
host: rabbitmq
port: 5672
vHost: /
enableTls: false
insecureSkipVerifyTls: false
# tlsCaSecretRef:
# name: <secret-name>
# key: <ca-attribute>
settings:
httpPoolSize: 128
maxTeamSize: 10000
Expand Down
15 changes: 15 additions & 0 deletions charts/integration/templates/integration-integration.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,10 @@ spec:
secret:
secretName: {{ .Values.config.redis.tlsCaSecretRef.name }}

- name: rabbitmq-ca
secret:
secretName: {{ .Values.config.rabbitmq.tlsCaSecretRef.name }}

{{- if eq (include "useCassandraTLS" .Values.config) "true" }}
- name: integration-cassandra
secret:
Expand All @@ -105,6 +109,8 @@ spec:
- name: "integration-cassandra"
mountPath: "/certs/cassandra"
{{- end }}
- name: rabbitmq-ca
mountPath: /certs/rabbitmq-ca
env:
- name: INTEGRATION_DYNAMIC_BACKENDS_POOLSIZE
value: "{{ .Values.config.dynamicBackendsPoolsize }}"
Expand Down Expand Up @@ -246,6 +252,15 @@ spec:
- name: redis-ca
mountPath: /etc/wire/gundeck/redis-ca

- name: rabbitmq-ca
mountPath: /etc/wire/brig/rabbitmq-ca

- name: rabbitmq-ca
mountPath: /etc/wire/galley/rabbitmq-ca

- name: rabbitmq-ca
mountPath: /etc/wire/background-worker/rabbitmq-ca

{{- if eq (include "useCassandraTLS" .Values.config) "true" }}
- name: "integration-cassandra"
mountPath: "/certs"
Expand Down
12 changes: 8 additions & 4 deletions deploy/dockerephemeral/docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -264,11 +264,14 @@ services:
container_name: rabbitmq
image: rabbitmq:3.11-management-alpine
environment:
- RABBITMQ_DEFAULT_USER=${RABBITMQ_USERNAME}
- RABBITMQ_DEFAULT_PASS=${RABBITMQ_PASSWORD}
- RABBITMQ_USERNAME
- RABBITMQ_PASSWORD
ports:
- '127.0.0.1:5672:5672'
- '127.0.0.1:15672:15672'
- '127.0.0.1:5671:5671'
- '127.0.0.1:15671:15671'
volumes:
- ./rabbitmq-config/rabbitmq.conf:/etc/rabbitmq/conf.d/20-wire.conf
- ./rabbitmq-config/certificates:/etc/rabbitmq/certificates
networks:
- demo_wire

Expand All @@ -282,6 +285,7 @@ services:
entrypoint: /scripts/init_vhosts.sh
volumes:
- ./:/scripts
- ./rabbitmq-config/certificates/ca.pem:/etc/rabbitmq-ca.pem
networks:
- demo_wire

Expand Down
16 changes: 10 additions & 6 deletions deploy/dockerephemeral/init_vhosts.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,17 @@ exec_until_ready() {
until $1; do echo 'service not ready yet'; sleep 1; done
}

create_vhost() {
exec_until_ready "curl --cacert /etc/rabbitmq-ca.pem -u $RABBITMQ_USERNAME:$RABBITMQ_PASSWORD -X PUT https://rabbitmq:15671/api/vhosts/$1"
}

echo 'Creating RabbitMQ resources'

exec_until_ready "curl -u $RABBITMQ_USERNAME:$RABBITMQ_PASSWORD -X PUT http://rabbitmq:15672/api/vhosts/backendA"
exec_until_ready "curl -u $RABBITMQ_USERNAME:$RABBITMQ_PASSWORD -X PUT http://rabbitmq:15672/api/vhosts/backendB"
exec_until_ready "curl -u $RABBITMQ_USERNAME:$RABBITMQ_PASSWORD -X PUT http://rabbitmq:15672/api/vhosts/d1.example.com"
exec_until_ready "curl -u $RABBITMQ_USERNAME:$RABBITMQ_PASSWORD -X PUT http://rabbitmq:15672/api/vhosts/d2.example.com"
exec_until_ready "curl -u $RABBITMQ_USERNAME:$RABBITMQ_PASSWORD -X PUT http://rabbitmq:15672/api/vhosts/d3.example.com"
exec_until_ready "curl -u $RABBITMQ_USERNAME:$RABBITMQ_PASSWORD -X PUT http://rabbitmq:15672/api/vhosts/federation-v0"
create_vhost backendA
create_vhost backendB
create_vhost d1.example.com
create_vhost d2.example.com
create_vhost d3.example.com
create_vhost federation-v0

echo 'RabbitMQ resources created successfully!'
28 changes: 28 additions & 0 deletions deploy/dockerephemeral/rabbitmq-config/certificates/ca-key.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC/vE2Cea18UZ1J
J0a3IkIoXl2JPSJp7y/bPXsN6sk44F5Dv9mt5hxVERyCQSMiuM6dXfzkRcMAZ7dx
5nQ7GpSEJksqe4h+WFHWDQjaoxrOYVg9UAa6q0rq5h+uHZEpBWwJWNlwRgzyf5zf
IZnjttVD2mu4Gp2xRqtNkEbAOgMJp7ijb76foKsGLFrxJNA3khNjsnDlwRuoffVS
LafF0CA7cW2FYxjwKM/IymCaRVUS18IftCtm3KCl5ou+1aD0/rMsLMKEY1HYCyGo
ZSOnvd5xhRPj6upk3MpWUUyULSkpkQtVPy+RZKUNXb3CGVNJz3UgvMwNXKpW9FdG
Suze9HxdAgMBAAECggEAEU8SKZA10tOaAQue/P4GaOyJQdAXYObV3tNAXkjux3Ks
hS3hnIBPLc1wpxWdnWR/n9c8nZg/+rO3l3xiy8nM1IKR0JD8Xnjh/RKKKmqvtdKL
NmXDZcCm775nPRRa5rrK6QEbXWEFiYgZr6Rckcu57vkzNkM42dMeYyR+Lpujazs6
Um3Z7rPXevX/gVr9XHjxJ5bX9WYB7sJfZTHLqkO7VGwrXf7HGrtT1ES+iXqjGLpH
5Sg55V5XJfxsqhq+TQgEnorzp8+LEXms2HYTP3G47wP51IWbHa54BUBwkwhiNYV7
os71j5mrZbUnJ/2KvQPMjiF7uHKlKYjxXiAoj9wRZQKBgQD4e4RuFVaLtF1+khNI
uEgmY4AfakeCB9D2Do1/fhLDTT6EdAxFeSx62VyY3wTG5Pi8DyrFIUNbIYbO8vRx
u8XpzCPxn9TnPnLZ9BRf1+GrCuyQWaFZOnnfAovk3KK4D3vWD9Yn38aTYpTd+3Hg
AEIzd7Bd4dozKtKW7+wI9uOm0wKBgQDFiUih6D0TYrS4T+cM5KhI+ErqTTiFpZ/L
BvA2hyRZTbP+erII9A+IqRNlwidGc1UF4xGu9Ei5QBVfFFbch6C1IRwIoog0hqsH
7s47VIcDuoASq52DHoUABbw9SrfsLjAZz5bLNPmvrEorwIImHNwDG/yOgpT8z7PV
z4/MhoWyDwKBgB+8FrPAgechx/cMTO4yqvRMLObWOf+/Y86pGSU5Qsgyq1NbRt3w
ld+ytwLHKOMGB0ZtYXb/wox3AbKYkOOdqa8sZULMuPI3pY90fs2m0ql3obLl35d3
wmza9GbsTtPXFmfGagF5sPDN3FllbavAHLRaCupSl/2E8JRaW/jhHz4FAoGAfL4H
Ggd4mkdY7JO4ytGS3BG/7Vo6eVtwH1wQUb7h22tQYUHGMBU/wgNTdo03FCw84uzT
+/HUAvhPBq3ndHhJqlhwRZut+82XL/lETv9AC8C4pBGv9F9PigYVK3eF0iYQxhvr
lAOuMZvRcvOsvLi4z1XbFXus7kGTxU+/9V52C00CgYBY5SgRETt5kgbH/rm36SsE
4x58yK8uYF8MgtBCLxn7E0vnZ2cAMmmDC9wWCHtuq2QhqL/pB+fPI8ri4XNPMXJC
faAxJ0VNmz8fYTzliAWy3Sqp/kgeXdrX9KJkN24LP345LocDBcaML+thDFevmXBW
mahBgoa1ZWxnLJe5XweVkg==
-----END PRIVATE KEY-----
19 changes: 19 additions & 0 deletions deploy/dockerephemeral/rabbitmq-config/certificates/ca.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDJTCCAg2gAwIBAgIUaJxRWt/eEYHgz+Rs5QNWVHMfk5swDQYJKoZIhvcNAQEL
BQAwIjEgMB4GA1UEAwwXcmFiYml0bXEuY2EuZXhhbXBsZS5jb20wHhcNMjQwNjE3
MTQwMjE0WhcNMzQwNjE1MTQwMjE0WjAiMSAwHgYDVQQDDBdyYWJiaXRtcS5jYS5l
eGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL+8TYJ5
rXxRnUknRrciQiheXYk9ImnvL9s9ew3qyTjgXkO/2a3mHFURHIJBIyK4zp1d/ORF
wwBnt3HmdDsalIQmSyp7iH5YUdYNCNqjGs5hWD1QBrqrSurmH64dkSkFbAlY2XBG
DPJ/nN8hmeO21UPaa7ganbFGq02QRsA6AwmnuKNvvp+gqwYsWvEk0DeSE2OycOXB
G6h99VItp8XQIDtxbYVjGPAoz8jKYJpFVRLXwh+0K2bcoKXmi77VoPT+sywswoRj
UdgLIahlI6e93nGFE+Pq6mTcylZRTJQtKSmRC1U/L5FkpQ1dvcIZU0nPdSC8zA1c
qlb0V0ZK7N70fF0CAwEAAaNTMFEwHQYDVR0OBBYEFN8gWZGKR0/K/e+qyGcN+8Ae
IokuMB8GA1UdIwQYMBaAFN8gWZGKR0/K/e+qyGcN+8AeIokuMA8GA1UdEwEB/wQF
MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAKTpmSYDx+Fabe/idnMlC9+5KaQmD/dp
x1BW8HZT+ZK+NuadPUVyUx1xHOw+wh1u5G8docGkrCsA/hvgyIRSyycJRCaySt1y
zjml3s3T4wRktgx6Z5X3kfw612/tZ5NE4QyQuN9A7DC9Fh4Z520fMDel15D+t70z
nNjZdp5gxpJPUJCebJ7+OhSUhtgr6g4hXwNqDR7DLwXyhp90UFdjfx4kBYFE8Vnk
nA9ZwC7GhUioMV/yXOuekyiJBv9LtaSuc/Y29EbLufLAwZJD1lA7WN254nNmZgAE
hAhTqL6dgvIIhuKHQ6f4vqAWi4FsrRy6cvh7S80+ldcchMBDcIgh1BA=
-----END CERTIFICATE-----
20 changes: 20 additions & 0 deletions deploy/dockerephemeral/rabbitmq-config/certificates/cert.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
-----BEGIN CERTIFICATE-----
MIIDPTCCAiWgAwIBAgIBADANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdyYWJi
aXRtcS5jYS5leGFtcGxlLmNvbTAeFw0yNDA2MTcxNDAyMTRaFw0yNDA3MTcxNDAy
MTRaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAJZ3b8mfnf8XuUJmFQ8xN9V8N1PiMe5X+WMqOKduZXqPeW9rECmC
B3opcDVMQ3iyRtc+fXYSJiCllMeCCwzIWQw+k1PcFZ6zXWsvtEFQRCN91vcShZm0
v8YlNcYl3wxsnIcZ5/IAZTiyX2U/hTBkgOszJcfe8cBOZsI9QzRuLRzE3kkpA+U7
/3ekPsIxk/g0NtbRA4BgSrcKl3iAI4CMJTJlsezQbF6LZqW7yIOyvaQzT0kyJ564
0X7YCT5QozL09ZdbQY5b6pphNNfXqY1KEP/aje+UrzQm2R3e9BUGMM4o14pQOU7Q
cxWRjPSPL3nDKUxI3kI9etrluFLH9lQ1uT8CAwEAAaOBizCBiDAdBgNVHSUEFjAU
BggrBgEFBQcDAQYIKwYBBQUHAwIwJwYDVR0RAQH/BB0wG4IJbG9jYWxob3N0gghy
YWJiaXRtcYcEfwAAATAdBgNVHQ4EFgQUf53Mqv9QZmcO5uwUUNZcMQA05cAwHwYD
VR0jBBgwFoAU3yBZkYpHT8r976rIZw37wB4iiS4wDQYJKoZIhvcNAQELBQADggEB
ABXBCl+jy+EeDPLwFlHX/DTJrce3VQMAG+x5WxbuKr68zS8uwJFfqmb4dK01RiSe
QAaISp/vr4KRbbNc5f/TA5dOhc2qXf8dZ0rILWE0u1I+1y9DFuNnymIywbodo6ho
ln7bj2wNl1vZ1A6Tm9fH6MJhavCCM18AHZuz+ml9b8SSVnL3XfPUWuZjYnElSXWj
qTJUF+o/1QC3E+ILj5iiwaAgp8kJJezr5m90RC/DTchYS/CRtz79jYMY8IMdOpN6
JC92KzpO0jKZ4qWkDi4ZgszPTNcUdnjUc4botJrfZhioA26skUiuacyqfpvnspno
y5DFD+Od2XpBCCwgeYk6IPM=
-----END CERTIFICATE-----
28 changes: 28 additions & 0 deletions deploy/dockerephemeral/rabbitmq-config/certificates/key.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCWd2/Jn53/F7lC
ZhUPMTfVfDdT4jHuV/ljKjinbmV6j3lvaxApggd6KXA1TEN4skbXPn12EiYgpZTH
ggsMyFkMPpNT3BWes11rL7RBUEQjfdb3EoWZtL/GJTXGJd8MbJyHGefyAGU4sl9l
P4UwZIDrMyXH3vHATmbCPUM0bi0cxN5JKQPlO/93pD7CMZP4NDbW0QOAYEq3Cpd4
gCOAjCUyZbHs0Gxei2alu8iDsr2kM09JMieeuNF+2Ak+UKMy9PWXW0GOW+qaYTTX
16mNShD/2o3vlK80Jtkd3vQVBjDOKNeKUDlO0HMVkYz0jy95wylMSN5CPXra5bhS
x/ZUNbk/AgMBAAECggEAFSsQawktrSmlQpYh+FUwSbSEBCUaaTGvQCg8eDGrzSZK
K0agq3ZDnwgdZSIpi91o4fdEp0u+WXFyEO9WpqG5BWP4Th/0WrNZPS8k6Ntl+qhF
idTtPsaTBElP22SQkKrnCoq2evFbTDKsAQ6CqmA5Ut2LPyc6U5e0FTeRMNsfNaC1
e+60J5yjxYWfZQdU5F+uiycWWiqabOafJfbN0gdLeuIICG+Z8AuWoUjLg2v55itw
X9T3AWZ2+/kdUY8j5FXFoK2MfuzW7Ys+Y1JeLMHrquy2hicSMbJE7vnxNsv1VMPc
IZzlgS+N/Lqre0S0NQAKqTGxe4PcUw+Mp5ZqXHtBwQKBgQDEViEeOAAtfvpK4pFv
drXmv2KacieEtUeEVfgbzMY4tL2q7RfFGxC4iiLklvwhQSGyfRamtut+t+eR4eFx
XKHaZxobwwfW5sMi6Ye/iyuL3YXvtWiaOz6XNImFTeWUPLnrX5qtMuVbx4UGiKa7
kjg/214A8Zf/qoVJxzAJwp1E6QKBgQDEMOM+dnUlUc8FrllXmlsGYMxwWdQ+vvvw
BdKrm6Q61z3+C5189VwQQ1+ruIcmfVqCm1BKa0J76evgdqHo/pgiAaGEhItVt8cN
3IVnpQu9Fhphgd/iFYxyTOCW2d1Nze30H1oqwpgmZsw2vE/6WrU8e1j279+SUevS
2+rx7i1T5wKBgE6rhFGrdsbEHl5rMoNLOc/f2A6ytwsB6EoqeGQLRVHreiRHJEMi
eSy4jQqzRQu+IVZ3sN/UY8A+yFc3/zGBQIlWzqtZFocRqBcRJAeoKCa++K/4LJXA
L3A+6Ou1LsybGJQrlrrXrfd8ltzrXIPELy3HJH+UTqdvGEFbwu/mP0YhAoGBAINX
Pyp33yDmzbM97y3Idhuk/fhRCtgev0cGfuzHu4BwzF2gpQQctk9k601osYHA9bDu
DShk+hM+nNyeTvJOTsalVN4EZcsyxx2ufdjPEza471xLt/gA+Q8kDE6w94i4zg5a
VuC9eWJr+1bBZsFxrFcbNInMOF4aXcfB1l20V8ANAoGAXZcAv5zU5Cj4ktoe0uqi
7p9zR8mgW2oXU0orgdQ3Ce2Z2qy4yFU5AfHPmn1RuRFsQCxX8RpUqLDHOvpn6gyt
/u9GBqlCqYG4KAbGKGVjodEIXilbIVNEbCIi4kGcRO038fzZJawwhrXg3FuMd6EV
G92A1vtGnTZYkatPK4LRnBk=
-----END PRIVATE KEY-----
Loading
Loading