Skip to content

Commit a72f2f8

Browse files
authored
Merge pull request #107 from BitGo/WP-5523-seperate-mtls-configs
feat: seperate client/server mtls configs
2 parents 3955384 + 8a53d89 commit a72f2f8

35 files changed

+550
-521
lines changed

.github/workflows/build-and-test.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,8 @@ jobs:
132132
run: npm test
133133
env:
134134
NODE_OPTIONS: '--max-old-space-size=4096'
135-
MASTER_BITGO_EXPRESS_KEYPATH: ./test-ssl-key.pem
136-
MASTER_BITGO_EXPRESS_CRTPATH: ./test-ssl-cert.pem
135+
MASTER_BITGO_EXPRESS_KEYPATH: ./demo.key
136+
MASTER_BITGO_EXPRESS_CRTPATH: ./demo.crt
137137
MTLS_ENABLED: true
138138
MTLS_REQUEST_CERT: true
139139
MTLS_REJECT_UNAUTHORIZED: false

README.md

Lines changed: 57 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ Configuration is managed through environment variables:
2727
### Network Settings
2828

2929
- `BIND` - Address to bind to (default: localhost)
30+
- `IPC` - IPC socket file path (optional)
3031
- `TIMEOUT` - Request timeout in milliseconds (default: 305000)
3132
- `KEEP_ALIVE_TIMEOUT` - Keep-alive timeout (optional)
3233
- `HEADERS_TIMEOUT` - Headers timeout (optional)
@@ -45,8 +46,6 @@ Configuration is managed through environment variables:
4546
- `BITGO_CUSTOM_ROOT_URI` - Custom BitGo API root URI (optional)
4647
- `BITGO_CUSTOM_BITCOIN_NETWORK` - Custom Bitcoin network (optional)
4748
- `ADVANCED_WALLET_MANAGER_URL` - Advanced Wallet Manager URL (required)
48-
- `ADVANCED_WALLET_MANAGER_CERT` - Path to Advanced Wallet Manager certificate (required)
49-
- `AWM_SERVER_CERT_ALLOW_SELF_SIGNED` - Allow self-signed certificates from Advanced Wallet Manager (default: false)
5049

5150
### TLS/mTLS Configuration
5251

@@ -56,37 +55,46 @@ Both modes use the same TLS configuration variables:
5655

5756
- `TLS_MODE` - Set to either "mtls" or "disabled" (defaults to "mtls" if not set)
5857

59-
#### Certificate Configuration (required when TLS_MODE=mtls)
58+
#### mTLS Server Configuration (for incoming connections)
6059

61-
**Option 1: Certificate Files**
60+
- `SERVER_TLS_KEY_PATH` - Path to the private key for the mTLS server
61+
- `SERVER_TLS_CERT_PATH` - Path to the certificate for the mTLS server
62+
- `SERVER_TLS_KEY` - The private key as a string (alternative to `_PATH`)
63+
- `SERVER_TLS_CERT` - The certificate as a string (alternative to `_PATH`)
6264

63-
- `TLS_KEY_PATH` - Path to private key file (used for both inbound mTLS server and outbound mTLS client to KMS)
64-
- `TLS_CERT_PATH` - Path to certificate file (used for both inbound mTLS server and outbound mTLS client to KMS)
65+
#### mTLS Client Authentication Settings (for incoming connections)
6566

66-
**Option 2: Environment Variables**
67+
- `ALLOW_SELF_SIGNED` - Allow self-signed certificates (default: false)
68+
- `MTLS_ALLOWED_CLIENT_FINGERPRINTS` - Comma-separated list of allowed client certificate fingerprints (optional)
6769

68-
- `TLS_KEY` - Private key content (PEM format, used for both inbound and outbound)
69-
- `TLS_CERT` - Certificate content (PEM format, used for both inbound and outbound)
70+
#### Outbound mTLS to AWM (Master Express Mode only)
7071

71-
#### mTLS Settings (when TLS_MODE=mtls)
72+
- `AWM_CLIENT_TLS_KEY_PATH` - Path to the client key that Master Express presents to the AWM
73+
- `AWM_CLIENT_TLS_CERT_PATH` - Path to the client cert that Master Express presents to the AWM
74+
- `AWM_CLIENT_TLS_KEY` - The client key as a string (alternative to `_PATH`)
75+
- `AWM_CLIENT_TLS_CERT` - The client cert as a string (alternative to `_PATH`)
76+
- `AWM_SERVER_CA_CERT_PATH` - Path to the CA certificate to verify the AWM server (required when TLS_MODE=mtls)
77+
- `AWM_SERVER_CA_CERT` - The CA certificate as a string (alternative to `_PATH`)
78+
- `AWM_SERVER_CERT_ALLOW_SELF_SIGNED` - Allow self-signed certificates from the AWM (default: false)
79+
- **Required:** Client certificates must be explicitly provided for outbound mTLS connections
7280

73-
- `MTLS_REQUEST_CERT` - Request client certificates (default: true)
74-
- `CLIENT_CERT_ALLOW_SELF_SIGNED` - Allow self-signed certificates for incoming client connections (default: false)
75-
- `MTLS_ALLOWED_CLIENT_FINGERPRINTS` - Comma-separated list of allowed fingerprints for incoming client connections (optional)
81+
#### Outbound mTLS to KMS (AWM Mode only)
7682

77-
#### Outbound mTLS to KMS
78-
79-
- When `TLS_MODE=mtls`, outbound mTLS to KMS is enabled by default.
80-
- The same `TLS_CERT` and `TLS_KEY` are used as the client certificate and key for outbound mTLS requests to KMS.
81-
- `KMS_TLS_CERT_PATH` - Path to the CA certificate to verify the KMS server (required when outbound mTLS is enabled).
82-
- If `TLS_MODE=disabled`, outbound mTLS to KMS is also disabled by default.
83+
- `KMS_CLIENT_TLS_KEY_PATH` - Path to the client key that AWM presents to the KMS
84+
- `KMS_CLIENT_TLS_CERT_PATH` - Path to the client cert that AWM presents to the KMS
85+
- `KMS_CLIENT_TLS_KEY` - The client key as a string (alternative to `_PATH`)
86+
- `KMS_CLIENT_TLS_CERT` - The client cert as a string (alternative to `_PATH`)
87+
- `KMS_SERVER_CA_CERT_PATH` - Path to the CA certificate to verify the KMS server (required when TLS_MODE=mtls)
88+
- `KMS_SERVER_CA_CERT` - The CA certificate as a string (alternative to `_PATH`)
8389
- `KMS_SERVER_CERT_ALLOW_SELF_SIGNED` - Allow self-signed certificates from the KMS (default: false)
84-
85-
> **Note:** If you want to use a different client certificate for KMS, you will need to extend the configuration. By default, the same cert/key is used for both inbound and outbound mTLS.
90+
- **Required:** Client certificates must be explicitly provided for outbound mTLS connections
8691

8792
### Logging and Debug
8893

8994
- `HTTP_LOGFILE` - Path to HTTP request log file (optional, used by Morgan for HTTP access logs)
95+
- `NODE_ENV` - Node environment (development, production, test)
96+
- `LOG_LEVEL` - Log level (silent, error, warn, info, http, debug)
97+
- `RECOVERY_MODE` - Enable recovery mode (default: false)
9098

9199
## Quick Start
92100

@@ -107,31 +115,31 @@ openssl req -new -x509 -key server.key -out server.crt -days 365 -subj "/CN=loca
107115
```bash
108116
export APP_MODE=advanced-wallet-manager
109117
export KMS_URL=https://your-kms-service
110-
export KMS_TLS_CERT_PATH=./server.crt
118+
export KMS_SERVER_CA_CERT_PATH=./server.crt
111119
export KMS_SERVER_CERT_ALLOW_SELF_SIGNED=true
112-
export TLS_KEY_PATH=./server.key
113-
export TLS_CERT_PATH=./server.crt
120+
export SERVER_TLS_KEY_PATH=./server.key
121+
export SERVER_TLS_CERT_PATH=./server.crt
114122
export CLIENT_CERT_ALLOW_SELF_SIGNED=true
115123
npm start
116124
```
117125

118-
### 4. Start Master Express
126+
### 3. Start Master Express
119127

120128
In a separate terminal:
121129

122130
```bash
123131
export APP_MODE=master-express
124132
export BITGO_ENV=test
125-
export TLS_KEY_PATH=./server.key
126-
export TLS_CERT_PATH=./server.crt
133+
export SERVER_TLS_KEY_PATH=./server.key
134+
export SERVER_TLS_CERT_PATH=./server.crt
127135
export ADVANCED_WALLET_MANAGER_URL=https://localhost:3080
128-
export ADVANCED_WALLET_MANAGER_CERT=./server.crt
136+
export AWM_SERVER_CA_CERT_PATH=./server.crt
129137
export AWM_SERVER_CERT_ALLOW_SELF_SIGNED=true
130138
export CLIENT_CERT_ALLOW_SELF_SIGNED=true
131139
npm start
132140
```
133141

134-
### 5. Test the Connection
142+
### 4. Test the Connection
135143

136144
Test that Master Express can communicate with Advanced Wallet Manager:
137145

@@ -157,28 +165,35 @@ curl -k -X POST https://localhost:3081/ping/advancedWalletManager
157165
```bash
158166
export APP_MODE=advanced-wallet-manager
159167
export KMS_URL=https://production-kms.example.com
160-
export TLS_KEY_PATH=/secure/path/advanced-wallet-manager.key
161-
export TLS_CERT_PATH=/secure/path/advanced-wallet-manager.crt
162-
export MTLS_REQUEST_CERT=true
168+
export SERVER_TLS_KEY_PATH=/secure/path/awm-server.key
169+
export SERVER_TLS_CERT_PATH=/secure/path/awm-server.crt
170+
export KMS_CLIENT_TLS_KEY_PATH=/secure/path/awm-kms-client.key
171+
export KMS_CLIENT_TLS_CERT_PATH=/secure/path/awm-kms-client.crt
172+
export KMS_SERVER_CA_CERT_PATH=/secure/path/kms-ca.crt
163173
export CLIENT_CERT_ALLOW_SELF_SIGNED=false
164174
export MTLS_ALLOWED_CLIENT_FINGERPRINTS=ABC123...,DEF456...
165175
npm start
166176
```
167177

178+
**Note:** Client certificates for outbound connections must be separate from server certificates for security reasons.
179+
168180
#### Master Express (Production)
169181

170182
```bash
171183
export APP_MODE=master-express
172184
export BITGO_ENV=prod
173-
export TLS_KEY_PATH=/secure/path/master.key
174-
export TLS_CERT_PATH=/secure/path/master.crt
185+
export SERVER_TLS_KEY_PATH=/secure/path/master-server.key
186+
export SERVER_TLS_CERT_PATH=/secure/path/master-server.crt
187+
export AWM_CLIENT_TLS_KEY_PATH=/secure/path/master-awm-client.key
188+
export AWM_CLIENT_TLS_CERT_PATH=/secure/path/master-awm-client.crt
175189
export ADVANCED_WALLET_MANAGER_URL=https://advanced-wallet-manager.internal.example.com:3080
176-
export ADVANCED_WALLET_MANAGER_CERT=/secure/path/advanced-wallet-manager.crt
177-
export MTLS_REQUEST_CERT=true
190+
export AWM_SERVER_CA_CERT_PATH=/secure/path/awm-ca.crt
178191
export CLIENT_CERT_ALLOW_SELF_SIGNED=false
179192
npm start
180193
```
181194

195+
**Note:** Client certificates for outbound connections must be separate from server certificates for security reasons.
196+
182197
## Container Deployment with Podman
183198

184199
First, build the container image:
@@ -201,8 +216,8 @@ podman run -d \
201216
-e APP_MODE=advanced-wallet-manager \
202217
-e BIND=0.0.0.0 \
203218
-e TLS_MODE=mtls \
204-
-e TLS_KEY_PATH=/app/certs/advanced-wallet-manager-key.pem \
205-
-e TLS_CERT_PATH=/app/certs/advanced-wallet-manager-cert.pem \
219+
-e SERVER_TLS_KEY_PATH=/app/certs/advanced-wallet-manager-key.pem \
220+
-e SERVER_TLS_CERT_PATH=/app/certs/advanced-wallet-manager-cert.pem \
206221
-e KMS_URL=host.containers.internal:3000 \
207222
-e NODE_ENV=development \
208223
-e CLIENT_CERT_ALLOW_SELF_SIGNED=true \
@@ -221,10 +236,10 @@ podman run -d \
221236
-e APP_MODE=master-express \
222237
-e BIND=0.0.0.0 \
223238
-e TLS_MODE=mtls \
224-
-e TLS_KEY_PATH=/app/certs/test-ssl-key.pem \
225-
-e TLS_CERT_PATH=/app/certs/test-ssl-cert.pem \
239+
-e SERVER_TLS_KEY_PATH=/app/certs/test-ssl-key.pem \
240+
-e SERVER_TLS_CERT_PATH=/app/certs/test-ssl-cert.pem \
226241
-e ADVANCED_WALLET_MANAGER_URL=https://host.containers.internal:3080 \
227-
-e ADVANCED_WALLET_MANAGER_CERT=/app/certs/advanced-wallet-manager-cert.pem \
242+
-e AWM_SERVER_CA_CERT_PATH=/app/certs/advanced-wallet-manager-cert.pem \
228243
-e CLIENT_CERT_ALLOW_SELF_SIGNED=true \
229244
bitgo-onprem-express
230245

@@ -295,9 +310,8 @@ openssl x509 -in certificate.crt -text -noout
295310
```bash
296311
# Check that required variables are set
297312
env | grep -E "(APP_MODE|KMS_URL|ADVANCED_WALLET_MANAGER|TLS_)"
298-
``
313+
```
299314

300315
## License
301316

302317
MIT
303-
```

demo.crt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIID9TCCAt2gAwIBAgIUKCkJ6fcl2+2EsK0n9v7iqGu1qgIwDQYJKoZIhvcNAQEL
3+
BQAwgYkxCzAJBgNVBAYTAkNBMQswCQYDVQQIDAJPTjEQMA4GA1UEBwwHVG9yb250
4+
bzEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMQ8wDQYDVQQDDAZQ
5+
cmFuYXYxJzAlBgkqhkiG9w0BCQEWGHByYW5hdmphaW4xMTk3QGdtYWlsLmNvbTAe
6+
Fw0yNTA4MDEyMjE4MTVaFw0yNjA4MDEyMjE4MTVaMIGJMQswCQYDVQQGEwJDQTEL
7+
MAkGA1UECAwCT04xEDAOBgNVBAcMB1Rvcm9udG8xITAfBgNVBAoMGEludGVybmV0
8+
IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGUHJhbmF2MScwJQYJKoZIhvcNAQkB
9+
FhhwcmFuYXZqYWluMTE5N0BnbWFpbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB
10+
DwAwggEKAoIBAQC+QfWH5GbQidrIawVbjZ7RL/uZtF7wbmacER2wYlOO7Ib+Je1h
11+
03P3BQlI5bTBE3KkxrwDqycxWk/MA9hj2VT1tL3+bE/yuYVaOgGN4fiibG9Cc8MG
12+
MrWsZKRvP5Hy/ZUobVfLAPXvpUKM+nf//MaO6x9F/9TEwIb9rqfoD+bynL1s2LhR
13+
wr2ppYZXoOmdS/yhEiXloX4fO//5ivC/1zpt6bYaqdA2WAkBHyM24LOm02lJvRV+
14+
oq5dFxH0c0YCAEe05QfVLXgb/S/JTpxfOlabAVomb9+9ESOpEWqCyOo3U3QaSh49
15+
FdCUGFnaZHXc4324E/La955dSdeziLlDKXrdAgMBAAGjUzBRMB0GA1UdDgQWBBSe
16+
jCcPNqJHmbsXhsdKaJj9BUIhfTAfBgNVHSMEGDAWgBSejCcPNqJHmbsXhsdKaJj9
17+
BUIhfTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQARJW7QnfwS
18+
afy2M9ShDC7mqVa54LOaT6Ics+QYRPvJIRazlkODGm/n49rYZatgUNN1ouK6m7xk
19+
HuycnsWFZKly+w0/ugoe9fK59KUJCFNtPlTrAmJM4/x2yzSky/XlqEt0n8L8U8N1
20+
dbWcIC8EWNcUVKCKiS8ecoOm4G34I7YFOc5JwqEPJwfaQ76EHTKwEQe3MtM+wZaQ
21+
TrSm8WuYwlio53nyoyHHNGnJLKuN9DjOp9VdAtJcgCU8TutlKxAn1aDixrjcuzrk
22+
cqxn97OnE6eXsHurFY193lFs0HWpIAztXhjdtLjFJy68nVVmPcWAAWbcu4JhbBUX
23+
jZJ7DNuCDOoV
24+
-----END CERTIFICATE-----

demo.key

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC+QfWH5GbQidrI
3+
awVbjZ7RL/uZtF7wbmacER2wYlOO7Ib+Je1h03P3BQlI5bTBE3KkxrwDqycxWk/M
4+
A9hj2VT1tL3+bE/yuYVaOgGN4fiibG9Cc8MGMrWsZKRvP5Hy/ZUobVfLAPXvpUKM
5+
+nf//MaO6x9F/9TEwIb9rqfoD+bynL1s2LhRwr2ppYZXoOmdS/yhEiXloX4fO//5
6+
ivC/1zpt6bYaqdA2WAkBHyM24LOm02lJvRV+oq5dFxH0c0YCAEe05QfVLXgb/S/J
7+
TpxfOlabAVomb9+9ESOpEWqCyOo3U3QaSh49FdCUGFnaZHXc4324E/La955dSdez
8+
iLlDKXrdAgMBAAECggEASWNI8eekzxj1xuwdL3EDy14OV34vRt/W/alOgeyTnaRX
9+
9+2qUNtPNn//Ulqkq/sz9CJigKnC3vMep6vuCqnY70QOK3cdKZvtN937Hn8FOKXK
10+
DuB3YEssL7jMgssLIac2I1d2D2yp8QwWjSnKIvieoJ9KO2aQ7Gn1SCJYSxfjNj6b
11+
Z4BBnLgfOZebf2zDnXOnfee35v00zLw6EFyMhdwPNEwy505M32EQLu6qyPllSG4a
12+
srlqRsOMyo5iWEV7P8EBzquaWDB/B9PZWkG9JTokaXPFQJnX6Kn5ha5wcuoKBdVy
13+
R0mgPgtfhpvN2Ott4YQdIuo2PTfpc/Y1cTqRTuKWowKBgQDz9F8CmauFHmzrCp6n
14+
cZcW+Z2kUbjI25qat53G4QHAVIcWhMyQaAi+9dbVAuH9r3f1BWb8TcCJ+ut5fONL
15+
WR4oJpgeG6UVMaF15HqSj2FDic1JzY2jWtbKKiytRXlPCNGeCftQalZzsJtTI0Bl
16+
TqFj32flI+ZsfJR3v+9a6Nr14wKBgQDHptlyggV9TCXtSCfLAbaUJeqOVymTymrr
17+
qMcnYp99jHy7tmZIdmULxkeyF54uAX1/xc+nvSGFIO09rH3nEnZovDnvbFPpiFZb
18+
bNMxmGahW4//boTFSFRxxecknDBcUin0b8YjQER6i4tHtj3qUUjvW/J1XlWzZo1z
19+
cPF4oI6oPwKBgQDw9jaGXf0iHrxcqP+uyq7/XY1NSf8oPmmGWsl4MLXHIHbSUlew
20+
Z2IEJNWPTyqjphbpqO1hVvdQEs1WEXp86Ui1RfHJA2ta9MvTo9tCOmdLC6j/Ng6q
21+
BMbVpzS77Tx2SXKrFJbshixgV1gElXQ83J7jBD8eAQjPrXoEkku80vW8GwKBgGmC
22+
SWP0RoZi2aA+A5mK/DvqlbxHX9eUn1COz0CHJBYrSjfBOuiMePXyAS2iwZs6emIt
23+
3YGdt7stHXL8V0ToQt8yqcNXkjjWLhz+s9V/3qzjQIQSmePQR6Agn/h++iev3DAr
24+
aaBzdDz2xdJOAwZzkoG8K7PO+KdoSNR7GYFQCFPtAoGAFlvGvoX6WvQ47AwmVLgk
25+
gBfe1nruqVyz7kubWsy/V2iAkzMcWUUrcvpZgqAy9pRJlWs1wM91SjtFbZ+/UPwQ
26+
HGCGuclXo89b5uCTYVA0B2PxivY9F+RcQtTJZvTGBGIAC5m1+EqR9pVWY9527WD6
27+
7/MjOwPWTPT7j0jwBkXTo1w=
28+
-----END PRIVATE KEY-----

enclaved-express-cert.pem

Lines changed: 0 additions & 19 deletions
This file was deleted.

enclaved-express-key.pem

Lines changed: 0 additions & 28 deletions
This file was deleted.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"test:coverage": "nyc mocha --require ts-node/register 'src/**/__tests__/**/*.test.ts'",
1717
"lint": "eslint --quiet --ignore-pattern scripts/bump-version.ts .",
1818
"lint:fix": "eslint --quiet --ignore-pattern scripts/bump-version.ts . --fix",
19-
"generate-test-ssl": "openssl req -x509 -newkey rsa:2048 -keyout test-ssl-key.pem -out test-ssl-cert.pem -days 365 -nodes -subj '/CN=localhost'",
19+
"generate-test-ssl": "openssl req -x509 -newkey rsa:2048 -keyout demo.key -out demo.crt -days 365 -nodes -subj '/CN=localhost'",
2020
"generate:openapi:masterExpress": "npx @api-ts/openapi-generator --name @bitgo/master-bitgo-express ./src/api/master/routers/index.ts > masterBitgoExpress.json",
2121
"container:build": "podman build -t bitgo-onprem-express .",
2222
"bump-versions": "ts-node scripts/bump-version.ts"

src/__tests__/api/master/accelerate.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ describe('POST /api/:coin/wallet/:walletId/accelerate', () => {
4949
disableEnvCheck: true,
5050
authVersion: 2,
5151
advancedWalletManagerUrl: advancedWalletManagerUrl,
52-
advancedWalletManagerCert: 'test-cert',
52+
awmServerCaCert: 'test-cert',
5353
tlsMode: TlsMode.DISABLED,
5454
clientCertAllowSelfSigned: true,
5555
};

src/__tests__/api/master/consolidate.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidate', () => {
5353
disableEnvCheck: true,
5454
authVersion: 2,
5555
advancedWalletManagerUrl: advancedWalletManagerUrl,
56-
advancedWalletManagerCert: 'test-cert',
56+
awmServerCaCert: 'test-cert',
5757
tlsMode: TlsMode.DISABLED,
5858
clientCertAllowSelfSigned: true,
5959
};

src/__tests__/api/master/consolidateUnspents.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidateunspents', () => {
4949
disableEnvCheck: true,
5050
authVersion: 2,
5151
advancedWalletManagerUrl: advancedWalletManagerUrl,
52-
advancedWalletManagerCert: 'test-cert',
52+
awmServerCaCert: 'test-cert',
5353
tlsMode: TlsMode.DISABLED,
5454
clientCertAllowSelfSigned: true,
5555
};

0 commit comments

Comments
 (0)