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

feat(mongodb): add extended config options for MongoDB #831

Draft
wants to merge 18 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 2 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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ Tests include code coverage via istanbul. See the test/ folder for testing scrip
If you want to run integration tests in a repetitive manner, you can startup the test containers using `docker-compose`, login to running `central-ledger` container like so:

```bash
docker-compose -f docker-compose.yml -f docker-compose.integration.yml up kafka mysql central-ledger
docker-compose -f docker-compose.yml -f docker-compose.integration.yml up kafka mysql objstore central-ledger

#in a new shell
docker exec -it cl_central-ledger sh
Expand Down
6 changes: 5 additions & 1 deletion config/default.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,11 @@
},
"MONGODB": {
"DISABLED": true,
"URI": "mongodb://localhost:27017/mlos"
"URI": "mongodb://localhost:27017/mlos",
"OPTIONS": {
"ssl": false,
"sslValidate": false
}
},
"ERROR_HANDLING": {
"includeCauseExtension": true,
Expand Down
2 changes: 2 additions & 0 deletions docker-compose.integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ services:
- ./docker/central-ledger/default.json:/opt/central-ledger/config/default.json
- ./test:/opt/central-ledger/test
- ./src:/opt/central-ledger/src
# Only mount in node_modules if you want to update dependencies on the fly
# This comes with it's own issues... so beware
# - ./node_modules:/opt/central-ledger/node_modules
environment:
- CLEDG_SIDECAR__DISABLED=true
Expand Down
9 changes: 6 additions & 3 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -136,9 +136,12 @@ services:
objstore:
image: mongo:latest
container_name: cl_objstore
# Disable logging as it is far too verbose for debugging locally
logging:
driver: none
# Allows TLS without requiring client to provide certs
# lets us test both with TLS and non-TLS connections
command: --tlsMode allowTLS --tlsCertificateKeyFile /etc/ssl/test-server1.pem --tlsCAFile /etc/ssl/test-ca.pem --tlsAllowConnectionsWithoutCertificates
volumes:
- ./docker/objstore/test-server1.pem:/etc/ssl/test-server1.pem
- ./docker/objstore/test-ca.pem:/etc/ssl/test-ca.pem
ports:
- "27017:27017"
networks:
Expand Down
11 changes: 11 additions & 0 deletions docker/objstore/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# objstore docker-compose config


We generate the files `test-ca.pem` and `test-server1.pem` for us to test out MongoDB's TLS settings.

These keys should NOT be used in production. They are for integration test purposes only.

References:
1. https://docs.mongodb.com/manual/appendix/security/appendixA-openssl-ca/
2. https://docs.mongodb.com/manual/appendix/security/appendixB-openssl-server/

67 changes: 67 additions & 0 deletions docker/objstore/openssl-test-ca.cnf
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# NOT FOR PRODUCTION USE. OpenSSL configuration file for testing.

# For the CA policy
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional

[ req ]
default_bits = 4096
default_keyfile = myTestCertificateKey.pem ## The default private key file name.
default_md = sha256 ## Use SHA-256 for Signatures
distinguished_name = req_dn
req_extensions = v3_req
x509_extensions = v3_ca # The extentions to add to the self signed cert

[ v3_req ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
nsComment = "OpenSSL Generated Certificate for TESTING only. NOT FOR PRODUCTION USE."
extendedKeyUsage = serverAuth, clientAuth

[ req_dn ]
countryName = Country Name (2 letter code)

countryName_default = AU

countryName_min = 2
countryName_max = 2

stateOrProvinceName = State or Province Name (full name)

stateOrProvinceName_default = TestCertificateStateName

stateOrProvinceName_max = 64

localityName = Locality Name (eg, city)

localityName_default = TestCertificateLocalityName

localityName_max = 64

organizationName = Organization Name (eg, company)

organizationName_default = TestCertificateOrgName

organizationName_max = 64

organizationalUnitName = Organizational Unit Name (eg, section)

organizationalUnitName_default = TestCertificateOrgUnitName

organizationalUnitName_max = 64

commonName = Common Name (eg, YOUR name)
commonName_max = 64

[ v3_ca ]
# Extensions for a typical CA

subjectKeyIdentifier=hash
basicConstraints = critical,CA:true
authorityKeyIdentifier=keyid:always,issuer:always
63 changes: 63 additions & 0 deletions docker/objstore/openssl-test-server.cnf
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# NOT FOR PRODUCTION USE. OpenSSL configuration file for testing.


[ req ]
default_bits = 4096
default_keyfile = myTestServerCertificateKey.pem ## The default private key file name.
default_md = sha256
distinguished_name = req_dn
req_extensions = v3_req

[ v3_req ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
nsComment = "OpenSSL Generated Certificate for TESTING only. NOT FOR PRODUCTION USE."
extendedKeyUsage = serverAuth, clientAuth
subjectAltName = @alt_names

[ alt_names ]

DNS.1 = objstore ##TODO: Enter the DNS names. The DNS names should match the server names.

DNS.2 = localhost ##TODO: Enter the DNS names. The DNS names should match the server names.

# IP.1 = ##TODO: Enter the IP address. SAN matching by IP address is available starting in MongoDB 4.2

# IP.2 = ##TODO: Enter the IP address. SAN matching by IP address is available starting in MongoDB 4.2


[ req_dn ]
countryName = Country Name (2 letter code)

countryName_default = AU

countryName_min = 2
countryName_max = 2

stateOrProvinceName = State or Province Name (full name)

stateOrProvinceName_default = TestServerCertificateState

stateOrProvinceName_max = 64

localityName = Locality Name (eg, city)

localityName_default = TestServerCertificateLocality

localityName_max = 64

organizationName = Organization Name (eg, company)

organizationName_default = TestServerCertificateOrg

organizationName_max = 64

organizationalUnitName = Organizational Unit Name (eg, section)

organizationalUnitName_default = TestServerCertificateOrgUnit

organizationalUnitName_max = 64

commonName = Common Name (eg, YOUR name)
commonName_max = 64
78 changes: 78 additions & 0 deletions docker/objstore/test-ca.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
-----BEGIN CERTIFICATE-----
MIIG3TCCBMWgAwIBAgIUKu9Q+6m8XKmNf4BO4Hd7/rR14TYwDQYJKoZIhvcNAQEL
BQAwgZwxCzAJBgNVBAYTAkFVMSEwHwYDVQQIDBhUZXN0Q2VydGlmaWNhdGVTdGF0
ZU5hbWUxJDAiBgNVBAcMG1Rlc3RDZXJ0aWZpY2F0ZUxvY2FsaXR5TmFtZTEfMB0G
A1UECgwWVGVzdENlcnRpZmljYXRlT3JnTmFtZTEjMCEGA1UECwwaVGVzdENlcnRp
ZmljYXRlT3JnVW5pdE5hbWUwHhcNMjEwMzMwMDcyMzMzWhcNMjYwMzMwMDcyMzMz
WjCBnDELMAkGA1UEBhMCQVUxITAfBgNVBAgMGFRlc3RDZXJ0aWZpY2F0ZVN0YXRl
TmFtZTEkMCIGA1UEBwwbVGVzdENlcnRpZmljYXRlTG9jYWxpdHlOYW1lMR8wHQYD
VQQKDBZUZXN0Q2VydGlmaWNhdGVPcmdOYW1lMSMwIQYDVQQLDBpUZXN0Q2VydGlm
aWNhdGVPcmdVbml0TmFtZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
AM8NMKdBZZbSabqFMFBTD3vo/rieyZYk/exOJb2WTwsrQdljTyWVNmwg6TcfKlh+
fzr+9CIdomCgdl+WAeLZcJ/DO/AA45Jc3/frbFmHNo+BmVbp+reT9zRgd7f0O5bE
vwL3J3ElcB7d3SZeEGDj815MO0EQShx24YgtI2VBcRsaaRZTu5VNW+Iq1wDsinoq
1CVn+Y7Hz8jOfDfZqcmGGEnF54j9++hBb7GoSjd7q5tYvFN4c/veBpQbUmGoPgin
JEv90bdHrc44vY+2H7aJYwP+NCC2RESmvEYQT/2eV7ApKvoQuWq/2QcDWJKIzHvT
n5vv74QecYh9hvb5Dfpk0p7vSZEO26Bl9Gs8ASYRwqeWEiFEOzyQrPIFOBZuRxRe
F/5syaSp87O7iEUYMEO9epBp8/zOiVlOht69ao5MwXckvzfvkCkGYEpqo2VCfnlK
M+bli+eDQihhtoWXc7uBRIaUfxREV24d/S4UENb6gcQW6BghvSrFyfl+4Cx0S9kr
fefvXiwlF1nTl3hKSc7GhjMHxOUriV5p49CnmjvGi52kuVYAAvmd7jacUEcwoDWU
kXL4QzCRl6CL+GZ74PaevZWisHKC3dTWgPkg+vYmEiFD0/K7HHo4ee3szY756HpW
Ucck5ngZdrCj7TsWf5M+4cAPuna5N5Hf6MZuzMV1XdgzAgMBAAGjggETMIIBDzAd
BgNVHQ4EFgQUWWDzA1pP4JmsbHys6ijDe7ITmxIwDwYDVR0TAQH/BAUwAwEB/zCB
3AYDVR0jBIHUMIHRgBRZYPMDWk/gmaxsfKzqKMN7shObEqGBoqSBnzCBnDELMAkG
A1UEBhMCQVUxITAfBgNVBAgMGFRlc3RDZXJ0aWZpY2F0ZVN0YXRlTmFtZTEkMCIG
A1UEBwwbVGVzdENlcnRpZmljYXRlTG9jYWxpdHlOYW1lMR8wHQYDVQQKDBZUZXN0
Q2VydGlmaWNhdGVPcmdOYW1lMSMwIQYDVQQLDBpUZXN0Q2VydGlmaWNhdGVPcmdV
bml0TmFtZYIUKu9Q+6m8XKmNf4BO4Hd7/rR14TYwDQYJKoZIhvcNAQELBQADggIB
AJm/IhJE7EdIFQOOsHOeR79be0XcAAdLbTJpTNY05FInDrchDshaAvpykvZCGqaH
661dLXKq5uM1ZaACOGyLChEHUYTuuqIV8u6N1++6NcCY/4yij0V6jZTq2XLoMnQ6
WXpDZm8arT3tG1U8NdD9K+i2pzdbF0cIHblPFar9m9XcYht0Ah7tO9VdoXyf1843
Ln5wxACe0oJoiEB3rGAqvAxQS1K9YhfPFU7UwNLL1Qp/WOeQ02aQsxDItnYwx0+g
zMPpQ1vyi5bTllc83SxtU/MS7hEUhFo8Wofl3+mWUudzBIqdYLOunNDsfrUqMHjR
GB9n0zWbZ39xPtpB/M9UuEZXUDIkOB9qs3JH7h4QhYk5yU9oDrm9dWCxc5Mi/zYu
3tw7mrEeDKW8hdFRLG6kuRzFTcQUaBmihBUP2vK+fjNnjWCPdASpEwssxDS3BJDK
HU/l6Gm035QLaQx4rncvYLcJx6G4wgSeJL0WV51TqiNoTSqNIjI7uDJSivaCjFC+
R3Pe81lFTc50xsEJNYac+24B1pqoGcJBmbwWk8bVCOpWmHRlvQlf+ZcYvJ0mbmB1
T3QpiupnhRYjYpYaYsjzF5OpwU00QfSVSY5Fs+6r0CqHNLBshpdd+kUym/qsarED
2X7LjKdfA4fXOb5288tLyaKvswmzaiZsEl2mmTtY1qrJ
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIGyjCCBLKgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBnDELMAkGA1UEBhMCQVUx
ITAfBgNVBAgMGFRlc3RDZXJ0aWZpY2F0ZVN0YXRlTmFtZTEkMCIGA1UEBwwbVGVz
dENlcnRpZmljYXRlTG9jYWxpdHlOYW1lMR8wHQYDVQQKDBZUZXN0Q2VydGlmaWNh
dGVPcmdOYW1lMSMwIQYDVQQLDBpUZXN0Q2VydGlmaWNhdGVPcmdVbml0TmFtZTAe
Fw0yMTAzMzAwNzI0MzBaFw0yMzAzMzAwNzI0MzBaMIGcMQswCQYDVQQGEwJBVTEh
MB8GA1UECAwYVGVzdENlcnRpZmljYXRlU3RhdGVOYW1lMSQwIgYDVQQHDBtUZXN0
Q2VydGlmaWNhdGVMb2NhbGl0eU5hbWUxHzAdBgNVBAoMFlRlc3RDZXJ0aWZpY2F0
ZU9yZ05hbWUxIzAhBgNVBAsMGlRlc3RDZXJ0aWZpY2F0ZU9yZ1VuaXROYW1lMIIC
IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuuNJPqfjebhYmW6QCvUzbCy/
Ybye/BXTSbEMk04k1RNK6dWx3i28aAs367RNP9wmaK1aF7JQOyjqCj1lUWpCy/Ze
5cBH2u3Muwbceu0ofQyiYdlrjfXlX1PtqIxpJHb6yD9IMfbeNqzazSbzTsPDCtRz
IosbeJ9Co8ZL1kRwop8cBYhetAzU3YN/JOhAl/RudKoP1km5lr1FtPUDW3L2TVrq
NzByOf59hSCMDhPpPKFRX/Qw3wDuOzYrBdXy3TNPlFKSp0de+xgaM4TgdvWVqaOW
6VKlnTe92rMId8rQZxgH7ENpinE8k9GBbGVFsa4wIjIO2B+sihopmHmjP4zaJMue
OU6FTA8vGXMF3WmdTW14AIuv/QqZ2vfF+IIjUzjFwOLd0ayPo6RN6mVh5Xp04xKh
/7A16GISb4ObgLzDaRLvGjId4FuK16UuX70FsNN7sp2Hj66lf/xSurWvyI8eohca
sXw54ELH+BKIwBE4wmOOd6J6I9fQybtEPX4BfVgAVygBuuQu5TJLSCwYtaSLNadl
i/6uCG8w9ZjOBMq12brDKTwbaGZgrBcLzNDKy87T9OBcdkWgQgRdDWh0MUoQhkek
yY9G/6ofEz5yeKvrSRpJHxT7mR5qu+VRbjcuJPCUnz8/cE4jd9VHYqJug/cWK2cE
OTrPo//btfZ8pXJYqwkCAwEAAaOCARMwggEPMB0GA1UdDgQWBBTz9B5Ye6XCIagq
/ChUXUsyIK9kwzAPBgNVHRMBAf8EBTADAQH/MIHcBgNVHSMEgdQwgdGAFFlg8wNa
T+CZrGx8rOoow3uyE5sSoYGipIGfMIGcMQswCQYDVQQGEwJBVTEhMB8GA1UECAwY
VGVzdENlcnRpZmljYXRlU3RhdGVOYW1lMSQwIgYDVQQHDBtUZXN0Q2VydGlmaWNh
dGVMb2NhbGl0eU5hbWUxHzAdBgNVBAoMFlRlc3RDZXJ0aWZpY2F0ZU9yZ05hbWUx
IzAhBgNVBAsMGlRlc3RDZXJ0aWZpY2F0ZU9yZ1VuaXROYW1lghQq71D7qbxcqY1/
gE7gd3v+tHXhNjANBgkqhkiG9w0BAQsFAAOCAgEAOdRykkikB6VFfL+NZSKs7zt2
SPXqDTX0Ap5ZVL+I/OXiXEEMnl5xnDytu4GTN3u1+HGkGV0f81ZHYGxCKcA+NN2W
hbmlpVMpfQ/kjpwtoUi8at/Gj6OA8NuGigktO+5kZ/2qMi9hKLUTYVUgbchWlnet
1FfdQM+YpBmePl/MT7lRQ3orMAZoNzfxnad+A3O+L8ROiS2wZA3a94GgJYIxsAyj
zp54OCrdrxfEzfSM9RZ0LYPl28BYZqMhq/M/r8SACauCA4D4elBO99vcocHyAMrK
vxy2C41CdZNV3pLA6Q37eqnJmr+aIt2NPO2xHb0j64Z+crWLH3aJuOVd+mMceij3
C8TMEJgvslpCDw3fxCwk2UEeTm/ZibAivYo9ON1JGXQSeg4maLQ+BWc4QaznQWs9
waDb4YS7n9u9UlBdKmLzmcLU/UV2DHeUlwbxazJEf5MwLtaHdNb9r/sUqbUOzJU9
zXFo0jOu0EnE/WL+wqTxXsj7o18PQVZyvuTxjRzPc+0Zpy73a8egf/1bt+zKKVLC
XlLvCe1IdEA2wkOokm2bTdh7K0Pw9KR7T8KoW6ezkkLhHr/eF2Gc+ayvs4RxlKMJ
l0lwduFEGewQ5lSfevHHfd3FVjm+8HMJumxG7Z8VeaXxibTLGXdxg4usJXTYOdV2
gnxqX+h1dg5fsfsXMU0=
-----END CERTIFICATE-----
89 changes: 89 additions & 0 deletions docker/objstore/test-server1.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
-----BEGIN CERTIFICATE-----
MIIGpjCCBI6gAwIBAgIUANbyDxegBOrPPGHCgrucBIre8rMwDQYJKoZIhvcNAQEL
BQAwgZwxCzAJBgNVBAYTAkFVMSEwHwYDVQQIDBhUZXN0Q2VydGlmaWNhdGVTdGF0
ZU5hbWUxJDAiBgNVBAcMG1Rlc3RDZXJ0aWZpY2F0ZUxvY2FsaXR5TmFtZTEfMB0G
A1UECgwWVGVzdENlcnRpZmljYXRlT3JnTmFtZTEjMCEGA1UECwwaVGVzdENlcnRp
ZmljYXRlT3JnVW5pdE5hbWUwHhcNMjEwMzMwMDczNTI5WhcNMjIwMzMwMDczNTI5
WjCBpDELMAkGA1UEBhMCQVUxIzAhBgNVBAgMGlRlc3RTZXJ2ZXJDZXJ0aWZpY2F0
ZVN0YXRlMSYwJAYDVQQHDB1UZXN0U2VydmVyQ2VydGlmaWNhdGVMb2NhbGl0eTEh
MB8GA1UECgwYVGVzdFNlcnZlckNlcnRpZmljYXRlT3JnMSUwIwYDVQQLDBxUZXN0
U2VydmVyQ2VydGlmaWNhdGVPcmdVbml0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
MIICCgKCAgEAu/u0wh9yZz9n9ne9cpgCBKHe4KaXQfaPMuEz8NznAsY4PKIZ+Zql
9g3z0laKECeAfHcnY36vTQS+2tZZ0Of0DTBnBsmgJzRDUdQMJGiViQY0yP1bFfVG
6DtRceWcX/s/cPOMgUxHn9TCdkZ0St9pwBOaPiCi88wugwNtL0w5eKt3NxhcX3x+
9lUumx3PSJz1mynjtFg49jj70L/4DiWL6l1VpAVsBlvmiWPnxui5k0VV/InViK+G
C1cFv7lXi09tyABRxQ7A4C7e0mP7hotWg8RCgB+XvjLOKy4gVJ2kDZVilh8PpqmH
IqmA7QgMUdaGgXwHCkfNer5YJByFFSUVHZV7QXbQvxkv26/dch1z5QHp6mL91dgJ
A91vYUrfNNYlu0ecCBo4ps1mxoMmPBH/iAG64IjZVHg/Q4sRGKaHVtrDKQJteP+V
WDFhQ4aKfQAQADP2jfaokrkDvn0dJ+z2B/whrpxXDOQf4rJ3Ae2sXYdy7ezx84ZB
ItpWz+wJZxwIsJ7kQs5PVm4QD8LwvZx4u46kbW3QG5HNOoY8f0JK3TAFSnk8pxdg
zpcy7j/kKcgPkpFn0wqbhkCW6ihgvlz/H+ubmRr7gFiie4DU6APRCl7UjDz/iSBl
JZ/2yqVrIAadvfT//a5rwW3GOh7XLxol6x756R1xemmQ5TZJRXLLiL0CAwEAAaOB
1TCB0jAdBgNVHQ4EFgQUSXULas62EWpC4cpCgTpBd7u0WaIwCQYDVR0TBAIwADAO
BgNVHQ8BAf8EBAMCBaAwVwYJYIZIAYb4QgENBEoWSE9wZW5TU0wgR2VuZXJhdGVk
IENlcnRpZmljYXRlIGZvciBURVNUSU5HIG9ubHkuICBOT1QgRk9SIFBST0RVQ1RJ
T04gVVNFLjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHgYDVR0RBBcw
FYIIb2Jqc3RvcmWCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAgEAgRWAUCQv
ToEH9u7fOUcQdBbR9QWCK4YsGGbs7E2VSC7RZB4zwuM8U8Z72iKg7enaUvmUAfhm
kfFpBQaNI0vYjkVkOObJVAKRE4TB0lr7g7fAUWZ0mVBXoTRwqEeQOMlKrHuRg+IB
JIoe/Yumdy/runnvvnsV0FCrgW3vVkWD02LDWnIw7hGQTlz4Bbmaqs+tIGt8G7oi
4W7axTKtuGukItjDQjOm6t4OAUc6GUnDBNl/OMpu30tr8yKNm6EGJjnJOaKZGOZA
L8vRItGZo2zRhyOY9Nst11To7wiCLNZrteM6ZxgKSTD1aMVZDwhaUETrBB29Asr/
6TqITe6ykREowBt+AL0zq4bizbkLtjd8OTkOPImF5NBLV8P2CHeVgndyzR5YCoGz
dLlPRnWvbJoFO2kqgmJh3JPMnP7nVMuZQronbvYVIfPTj/ZhPsvNNhaCYb+yYGAT
mBRMdJ47UTrwXhpRVeRT1NDWqeaYw0gH2Q+Bt03Bhdbv4uKPH7l8ksKlbjn9oNPQ
9e34Ibp3eHiJ53UtMqeUy3BHmxG2/Np+7Onk2Ypk9rDgnRI+zAuLxEMbrYXbTF0q
oImKyuhuZK6re/ukwc5k8v9703tMvXycTvo4AaUgVKhaHz7SGVXYMF6FhlSh0YUt
5j/XLve1El3dxMg+BnMlg9cAz/F2Q7azmfk=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
Loading