pilou-: @ewjoachim there is an example in [ansible integration test](https://github.com/ansible/ansible/blob/devel/test/integration/targets/lookup_hashi_vault/lookup_hashi_vault/tasks/main.yml): [`dev` mode is used](https://github.com/ansible/ansible/blob/e0f6c17857d6a5758fbe5e2018ab897b76784dbc/test/integration/targets/lookup_hashi_vault/lookup_hashi_vault/tasks/main.yml#L75) with [SSL authentication](https://github.com/ansible/ansible/blob/devel/test/integration/targets/lookup_hashi_vault/lookup_hashi_vault/templates/vault_config.hcl.j2).
ewjoachim: Oh, cool !
ewjoachim: Well, tried again and... I think I managed to setup the TLS server, and to setup a certificate that's ok, but I still can't manage to achieve cert login.

I give up, whoever wants to pick up where I left...
ewjoachim: Ready for review !
diff --git a/.travis.yml b/.travis.yml
index 19e3f51..e56c957 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -26,7 +26,7 @@ matrix:
 
 
 before_install:
-  - "if [ $COVERAGE_FLAG = integration ]; then ./dev-env; fi"
+  - "if [ $COVERAGE_FLAG = integration ]; then ./dev-env; ./dev-env auth token; fi"
 
 install:
   - pip install tox codecov
diff --git a/.vault.cert.yml b/.vault.cert.yml
new file mode 100644
index 0000000..e1e8ddb
--- /dev/null
+++ b/.vault.cert.yml
@@ -0,0 +1,6 @@
+---
+url: https://localhost:8443
+base_path: secretkvv1/
+ca_bundle: dev_docker_config/certs/server-chain.crt
+login_cert: dev_docker_config/certs/client.crt
+login_cert_key: dev_docker_config/certs/client.key
diff --git a/.vault.token.yml b/.vault.token.yml
new file mode 100644
index 0000000..a479171
--- /dev/null
+++ b/.vault.token.yml
@@ -0,0 +1,5 @@
+---
+url: https://localhost:8443
+base_path: secretkvv1/
+ca_bundle: dev_docker_config/certs/server-chain.crt
+token: some-token
diff --git a/.vault.userpass.yml b/.vault.userpass.yml
new file mode 100644
index 0000000..09d99b9
--- /dev/null
+++ b/.vault.userpass.yml
@@ -0,0 +1,6 @@
+---
+base_path: secretkvv1/
+ca_bundle: dev_docker_config/certs/server-chain.crt
+url: https://localhost:8443
+username: userpass-login
+password: userpass-pass
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index b2fc125..a9e37ca 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -7,18 +7,20 @@ ticket ! We'll be in touch
 
 ## Coding in vault-cli
 
-1. Spin a configured vault (using `docker-compose`) with `./dev-env`
-2. Have tox installed (`pip install tox` in a virtual environment)
-3. Format your code with `black` and `isort` (lauch `tox -e format`)
-4. Write tests. We currently have 100% coverage in unit test. While
+- Spin a configured vault (using `docker-compose`) with `./dev-env`
+- Add your .vault.yml using either token, cert or userpass with:
+`./dev-env auth {token|cert|userpass}`
+- Have tox installed (`pip install tox` in a virtual environment)
+- Format your code with `black` and `isort` (lauch `tox -e format`)
+- Write tests. We currently have 100% coverage in unit test. While
 this doesn't mean we're perfect (far from it), we'd like to keep
 things this way. Whenever you launch the tests (`pytest`), a coverage
 report will be generatedin the console and HTML. Browse it with
 `firefox htmlcov/index.html`
-5. Check lint with `tox -e check-lint`
-6. The doc is part of the code too.
-7. If you have all the supported python versions available locally,
+- Check lint with `tox -e check-lint`
+- The doc is part of the code too.
+- If you have all the supported python versions available locally,
 launch `tox`. Otherwise, don't bother, the CI will do it for you.
-8. Share your work as soon as possible. Don't take the risk of engaging
+- Share your work as soon as possible. Don't take the risk of engaging
 in a lot of work before we can be sure you're going in a direction that
 is aligned with the project.
diff --git a/README.md b/README.md
index f001b47..2abf1a0 100644
--- a/README.md
+++ b/README.md
@@ -24,25 +24,26 @@ Usage: vault [OPTIONS] COMMAND [ARGS]...
   VAULT_CLI_TOKEN).
 
 Options:
-  -U, --url TEXT               URL of the vault instance
-  --verify / --no-verify       Verify HTTPS certificate
-  --ca-bundle PATH             Location of the bundle containing the server
-                               certificate to check against.
-  -c, --certificate-file PATH  Certificate to connect to vault. Configuration
-                               file can also contain a "certificate" key.
-  -T, --token-file PATH        File which contains the token to connect to
-                               Vault. Configuration file can also contain a
-                               "token" key.
-  -u, --username TEXT          Username used for userpass authentication
-  -w, --password-file PATH     Can read from stdin if "-" is used as
-                               parameter. Configuration file can also contain
-                               a "password" key.
-  -b, --base-path TEXT         Base path for requests
-  -v, --verbose                Use multiple times to increase verbosity
-  --config-file PATH           Config file to use. Use 'no' to disable config
-                               file. Default value: first of ./.vault.yml,
-                               ~/.vault.yml, /etc/vault.yml
-  -h, --help                   Show this message and exit.
+  -U, --url TEXT            URL of the vault instance
+  --verify / --no-verify    Verify HTTPS certificate
+  --ca-bundle PATH          Location of the bundle containing the server
+                            certificate to check against.
+  --login-cert PATH           Path to a public client certificate to use for
+                            connecting to vault.
+  --login-cert-key PATH          Path to a private client certificate to use for
+                            connecting to vault.
+  -T, --token-file PATH     File which contains the token to connect to Vault.
+                            Configuration file can also contain a "token" key.
+  -u, --username TEXT       Username used for userpass authentication
+  -w, --password-file PATH  Can read from stdin if "-" is used as parameter.
+                            Configuration file can also contain a "password"
+                            key.
+  -b, --base-path TEXT      Base path for requests
+  -v, --verbose             Use multiple times to increase verbosity
+  --config-file PATH        Config file to use. Use 'no' to disable config
+                            file. Default value: first of ./.vault.yml,
+                            ~/.vault.yml, /etc/vault.yml
+  -h, --help                Show this message and exit.
 
 Commands:
   delete       Delete a single secret.
@@ -62,8 +63,7 @@ Commands:
 There are three ways to authenticate against the vault:
 - Username and password file: provide a username and a file to read the
   password from. The file may be `-` for stdin.
-- Certificate: provide the path to a certificate file. The file may also be
-  read from stdin via `-`.
+- Client certificate: provide the path to a certificate file.
 - Token: Bypass authentication step if you already have a valid token.
 
 ## Showcase
diff --git a/dev-env b/dev-env
index 5fbde7f..f6910cd 100755
--- a/dev-env
+++ b/dev-env
@@ -1,17 +1,10 @@
 #!/bin/bash -eu
 
-docker-compose up -d
-while ! docker-compose logs | grep "Vault server started"; do
-	sleep 1
-done
-docker-compose exec vault vault login some-token
-docker-compose exec vault vault secrets enable -version=1 -path=mybase kv
-
-cat >.vault.yml <<EOF
----
-token-file: .vault-token
-base-path: "mybase/"
-...
-EOF
-
-echo "some-token" > .vault-token
+case ${1-default} in
+    auth)
+        ln -fs .vault.${2}.yml .vault.yml
+        ;;
+    *)
+        exec docker-compose up -d
+        ;;
+esac
diff --git a/dev_docker_config/certs/client-chain.crt b/dev_docker_config/certs/client-chain.crt
new file mode 100644
index 0000000..1bbabf0
--- /dev/null
+++ b/dev_docker_config/certs/client-chain.crt
@@ -0,0 +1,39 @@
+-----BEGIN CERTIFICATE-----
+MIICxDCCAawCFFau3vl0JvjKXXcXnbaG1+Qucp41MA0GCSqGSIb3DQEBCwUAMGYx
+CzAJBgNVBAYTAklOMQ4wDAYDVQQIDAVTdGF0ZTENMAsGA1UEBwwEQ2l0eTEVMBMG
+A1UECgwMT3JnYW5pemF0aW9uMQ0wCwYDVQQLDARyb290MRIwEAYDVQQDDAlsb2Nh
+bGhvc3QwIBcNMTkwNjEzMTAyNjI0WhgPMjE1NjA1MDUxMDI2MjRaMFkxGTAXBgoJ
+kiaJk/IsZAEZFglsb2NhbGhvc3QxFzAVBgNVBAoMDlZhdWx0IENsaSBUZXN0MQ8w
+DQYDVQQLDAZjbGllbnQxEjAQBgNVBAMMCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEAuhh4cOEnDfFbFXs4Nb+AXIG+b8j80VKgetGvhodMD552
+hp01yjM9CSwXLlrJNwgiZfuy47pcFesF+ylupU5Uxt9lSXqUHaGZzDEd7QYMGhHR
+dygOTDgZFQT/WPFA+F6eDQftEuapW0REzM2ofIiTaRfRu96AJ0RpxLviAL19BiMC
+AwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsH0vVhEkkMDvoQxKTyS2kaQFF/TC1odM
+Tb6GHrRUXtHhXJ09nfOtLOqC25GrUwTnf4nsmqY+Uj3VakREc3QTMdumx5Gpq5/H
+YDvksZ1kbtGkvMEhG1qF6kfl7LNvmPx+/QXtk1M1rkC8ar6itvbq4QapeN9wJ2XB
+mTJp1psU+t7Liek8Z2NsSusf4sHCLzJIEcMJp470ra43UHbp5wghf7u/JubDPZS+
+9vZN0rIdrJXuJhEh0dcvtRxaGyPK041P0mX2ymOjIm2Wp1kCqR8NV58Q7E78QUxd
+KCC/e+9NsFFGs0U8+wrCdc/J9Gtpk07aGLQ2YhNAsszF79I9gER4xA==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIUJkcSiAM1/HThxOlooWHwkFwKrV0wDQYJKoZIhvcNAQEL
+BQAwZjELMAkGA1UEBhMCSU4xDjAMBgNVBAgMBVN0YXRlMQ0wCwYDVQQHDARDaXR5
+MRUwEwYDVQQKDAxPcmdhbml6YXRpb24xDTALBgNVBAsMBHJvb3QxEjAQBgNVBAMM
+CWxvY2FsaG9zdDAgFw0xOTA2MTMxMDI2MjRaGA8yMTU2MDUwNTEwMjYyNFowZjEL
+MAkGA1UEBhMCSU4xDjAMBgNVBAgMBVN0YXRlMQ0wCwYDVQQHDARDaXR5MRUwEwYD
+VQQKDAxPcmdhbml6YXRpb24xDTALBgNVBAsMBHJvb3QxEjAQBgNVBAMMCWxvY2Fs
+aG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALssyRCNPVu0Ww6S
+qNpUIShA32ie06kQpGw6mxNZh8/238wNYRKExOa8onAUJCkNGf4FBx2rxP0jPZqU
+s2eBnJ/5q+0FO7TMoo3IBURTlj1+4EGeoSi6RgBFrJT4N8xNk88UBj44R627ORKR
+ozhRvt74RGvLjYserbuSQkER5hqfQdWFhWlvxrLIMYWwxZ3J2Lq/y/iI+HtS27Q+
+BEvOA6TwnUW8gwWdFQAvT0au389TgICCak4svcndjioj0MflBb3vftWrYFWuW1VE
+10vLsE+kspeXToSjEEJintxA79Rrjo96e577DRl3kLfBCrr8kYMQvcHSOUbi4rxp
+VpkD8rkCAwEAAaNTMFEwHQYDVR0OBBYEFGcK/s7Ww3yRQnEQcKVsoW59lGwTMB8G
+A1UdIwQYMBaAFGcK/s7Ww3yRQnEQcKVsoW59lGwTMA8GA1UdEwEB/wQFMAMBAf8w
+DQYJKoZIhvcNAQELBQADggEBAFBo8ZBq9BT2k3182mGrJy7yZeObeSTjW/pk4C6s
+nSzcsUBVptKtni7/QcHq0DXdVgeR0Awb6maSaylFN3MoLydmV8oVddtEmTSftikE
+QlKFxmZ+4IXxqQVvpwehFbq4FjJPxpNhX2qsCu49A/+QsLNQV58OfquspcnmaqXU
+mCEGIurJtuN8Gbq79UZ1IzMtkIsw4kQNYF5Lzi2/3KDDhgh7ns0vMEdMBOyyvKR6
+1k75zO2Rh/tHpgCT2Xw63/81nABLvHZeBp+XsCj+hAdbUsLVXXhCBov90sZCcdyH
+AQ4ZnkYQ9+bSGISuIxPFiwOEjEFZ7pEzKX5y1xftlrscpYY=
+-----END CERTIFICATE-----
diff --git a/dev_docker_config/certs/client.crt b/dev_docker_config/certs/client.crt
new file mode 100644
index 0000000..1e5e793
--- /dev/null
+++ b/dev_docker_config/certs/client.crt
@@ -0,0 +1,17 @@
+-----BEGIN CERTIFICATE-----
+MIICxDCCAawCFFau3vl0JvjKXXcXnbaG1+Qucp41MA0GCSqGSIb3DQEBCwUAMGYx
+CzAJBgNVBAYTAklOMQ4wDAYDVQQIDAVTdGF0ZTENMAsGA1UEBwwEQ2l0eTEVMBMG
+A1UECgwMT3JnYW5pemF0aW9uMQ0wCwYDVQQLDARyb290MRIwEAYDVQQDDAlsb2Nh
+bGhvc3QwIBcNMTkwNjEzMTAyNjI0WhgPMjE1NjA1MDUxMDI2MjRaMFkxGTAXBgoJ
+kiaJk/IsZAEZFglsb2NhbGhvc3QxFzAVBgNVBAoMDlZhdWx0IENsaSBUZXN0MQ8w
+DQYDVQQLDAZjbGllbnQxEjAQBgNVBAMMCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEAuhh4cOEnDfFbFXs4Nb+AXIG+b8j80VKgetGvhodMD552
+hp01yjM9CSwXLlrJNwgiZfuy47pcFesF+ylupU5Uxt9lSXqUHaGZzDEd7QYMGhHR
+dygOTDgZFQT/WPFA+F6eDQftEuapW0REzM2ofIiTaRfRu96AJ0RpxLviAL19BiMC
+AwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsH0vVhEkkMDvoQxKTyS2kaQFF/TC1odM
+Tb6GHrRUXtHhXJ09nfOtLOqC25GrUwTnf4nsmqY+Uj3VakREc3QTMdumx5Gpq5/H
+YDvksZ1kbtGkvMEhG1qF6kfl7LNvmPx+/QXtk1M1rkC8ar6itvbq4QapeN9wJ2XB
+mTJp1psU+t7Liek8Z2NsSusf4sHCLzJIEcMJp470ra43UHbp5wghf7u/JubDPZS+
+9vZN0rIdrJXuJhEh0dcvtRxaGyPK041P0mX2ymOjIm2Wp1kCqR8NV58Q7E78QUxd
+KCC/e+9NsFFGs0U8+wrCdc/J9Gtpk07aGLQ2YhNAsszF79I9gER4xA==
+-----END CERTIFICATE-----
diff --git a/dev_docker_config/certs/client.csr b/dev_docker_config/certs/client.csr
new file mode 100644
index 0000000..8593408
--- /dev/null
+++ b/dev_docker_config/certs/client.csr
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIICDjCCAXcCAQAwWTEZMBcGCgmSJomT8ixkARkWCWxvY2FsaG9zdDEXMBUGA1UE
+CgwOVmF1bHQgQ2xpIFRlc3QxDzANBgNVBAsMBmNsaWVudDESMBAGA1UEAwwJbG9j
+YWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6GHhw4ScN8VsVezg1
+v4Bcgb5vyPzRUqB60a+Gh0wPnnaGnTXKMz0JLBcuWsk3CCJl+7LjulwV6wX7KW6l
+TlTG32VJepQdoZnMMR3tBgwaEdF3KA5MOBkVBP9Y8UD4Xp4NB+0S5qlbRETMzah8
+iJNpF9G73oAnRGnEu+IAvX0GIwIDAQABoHUwcwYJKoZIhvcNAQkOMWYwZDAOBgNV
+HQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB0GA1Ud
+DgQWBBQIixZG+AdxpkgLx0rjEjBrhpOMEjAUBgNVHREEDTALgglsb2NhbGhvc3Qw
+DQYJKoZIhvcNAQELBQADgYEAgSyKsWQmnptlBdCOBt13crQ0EWg3TD8hCEOMgkYT
+LUgoE9xegNV5wgLjBZsb4p04iZ5Mkge68iUOxpQp4Tz4MVzO34wUEK1COp9Dkklq
+qMBC0w9wqWaPKF8j5Xns29NJ4373GszksdUcmNC/5mQ2OZkUCPH82w8Liy/lMZj4
+Dec=
+-----END CERTIFICATE REQUEST-----
diff --git a/dev_docker_config/certs/client.key b/dev_docker_config/certs/client.key
new file mode 100644
index 0000000..a5e1bb1
--- /dev/null
+++ b/dev_docker_config/certs/client.key
@@ -0,0 +1,16 @@
+-----BEGIN PRIVATE KEY-----
+MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALoYeHDhJw3xWxV7
+ODW/gFyBvm/I/NFSoHrRr4aHTA+edoadNcozPQksFy5ayTcIImX7suO6XBXrBfsp
+bqVOVMbfZUl6lB2hmcwxHe0GDBoR0XcoDkw4GRUE/1jxQPheng0H7RLmqVtERMzN
+qHyIk2kX0bvegCdEacS74gC9fQYjAgMBAAECgYBBcLV5zFM1ffgvt6Luk6cJ4L4d
+BSqSWWIBjpcQ0acXnvvDHql5r0b5YL3OGTLE3WFrR3WCy1fyhTEXP1yfWMpKg1+g
+0ckoivp6bfrvLgq/v3uPdvAPjTrng3JpbwGi3wKJhugUhNcfOLbZ3An0O0oKXq2R
+gg+Gu+gmVA1Fv/JJQQJBAN4/S4CUVyirsTz54ys4QPuFBmvVq8p4BAA3UYX25cIk
+BalM0VPMMg4i67hMq5JLNPuTBL9GPUzkSBnDyMVHZfECQQDWW6SEeXN4YrQnM4Kt
+3Lylwf/NtfdkKO8XHFpQqYQQOxsaoDfVKWg4FiowFkxLPBPBVgSvBZAsoZDZFgAx
+WYlTAkEAldCxAsH8Zwwl8+a3PeEz3Nj1VSe6IEf62nJv4BBpHQ/PSSrhSM2zSFg9
+8gSs+3b7BkM6xf2BQR35hHS4GFRi4QJAdGutfK2hwz6IbcoSLW93necxkX5E8Mcy
+o7CodKq8qTwQynM+H62vhtay7w8NPMdSS2z2ekBhP3w4eU7zp9njNQJAcWy2nfu3
+yinGNn1FiLldqhK3WGIcTLr6dXlOf6oczMLVJT2sI41DtC6q4sLljiomvBwovCvj
+M7YdLC8A5CK3QQ==
+-----END PRIVATE KEY-----
diff --git a/dev_docker_config/certs/client.pem b/dev_docker_config/certs/client.pem
new file mode 100644
index 0000000..b5b08da
--- /dev/null
+++ b/dev_docker_config/certs/client.pem
@@ -0,0 +1,33 @@
+-----BEGIN PRIVATE KEY-----
+MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALoYeHDhJw3xWxV7
+ODW/gFyBvm/I/NFSoHrRr4aHTA+edoadNcozPQksFy5ayTcIImX7suO6XBXrBfsp
+bqVOVMbfZUl6lB2hmcwxHe0GDBoR0XcoDkw4GRUE/1jxQPheng0H7RLmqVtERMzN
+qHyIk2kX0bvegCdEacS74gC9fQYjAgMBAAECgYBBcLV5zFM1ffgvt6Luk6cJ4L4d
+BSqSWWIBjpcQ0acXnvvDHql5r0b5YL3OGTLE3WFrR3WCy1fyhTEXP1yfWMpKg1+g
+0ckoivp6bfrvLgq/v3uPdvAPjTrng3JpbwGi3wKJhugUhNcfOLbZ3An0O0oKXq2R
+gg+Gu+gmVA1Fv/JJQQJBAN4/S4CUVyirsTz54ys4QPuFBmvVq8p4BAA3UYX25cIk
+BalM0VPMMg4i67hMq5JLNPuTBL9GPUzkSBnDyMVHZfECQQDWW6SEeXN4YrQnM4Kt
+3Lylwf/NtfdkKO8XHFpQqYQQOxsaoDfVKWg4FiowFkxLPBPBVgSvBZAsoZDZFgAx
+WYlTAkEAldCxAsH8Zwwl8+a3PeEz3Nj1VSe6IEf62nJv4BBpHQ/PSSrhSM2zSFg9
+8gSs+3b7BkM6xf2BQR35hHS4GFRi4QJAdGutfK2hwz6IbcoSLW93necxkX5E8Mcy
+o7CodKq8qTwQynM+H62vhtay7w8NPMdSS2z2ekBhP3w4eU7zp9njNQJAcWy2nfu3
+yinGNn1FiLldqhK3WGIcTLr6dXlOf6oczMLVJT2sI41DtC6q4sLljiomvBwovCvj
+M7YdLC8A5CK3QQ==
+-----END PRIVATE KEY-----
+-----BEGIN CERTIFICATE-----
+MIICxDCCAawCFFau3vl0JvjKXXcXnbaG1+Qucp41MA0GCSqGSIb3DQEBCwUAMGYx
+CzAJBgNVBAYTAklOMQ4wDAYDVQQIDAVTdGF0ZTENMAsGA1UEBwwEQ2l0eTEVMBMG
+A1UECgwMT3JnYW5pemF0aW9uMQ0wCwYDVQQLDARyb290MRIwEAYDVQQDDAlsb2Nh
+bGhvc3QwIBcNMTkwNjEzMTAyNjI0WhgPMjE1NjA1MDUxMDI2MjRaMFkxGTAXBgoJ
+kiaJk/IsZAEZFglsb2NhbGhvc3QxFzAVBgNVBAoMDlZhdWx0IENsaSBUZXN0MQ8w
+DQYDVQQLDAZjbGllbnQxEjAQBgNVBAMMCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEAuhh4cOEnDfFbFXs4Nb+AXIG+b8j80VKgetGvhodMD552
+hp01yjM9CSwXLlrJNwgiZfuy47pcFesF+ylupU5Uxt9lSXqUHaGZzDEd7QYMGhHR
+dygOTDgZFQT/WPFA+F6eDQftEuapW0REzM2ofIiTaRfRu96AJ0RpxLviAL19BiMC
+AwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsH0vVhEkkMDvoQxKTyS2kaQFF/TC1odM
+Tb6GHrRUXtHhXJ09nfOtLOqC25GrUwTnf4nsmqY+Uj3VakREc3QTMdumx5Gpq5/H
+YDvksZ1kbtGkvMEhG1qF6kfl7LNvmPx+/QXtk1M1rkC8ar6itvbq4QapeN9wJ2XB
+mTJp1psU+t7Liek8Z2NsSusf4sHCLzJIEcMJp470ra43UHbp5wghf7u/JubDPZS+
+9vZN0rIdrJXuJhEh0dcvtRxaGyPK041P0mX2ymOjIm2Wp1kCqR8NV58Q7E78QUxd
+KCC/e+9NsFFGs0U8+wrCdc/J9Gtpk07aGLQ2YhNAsszF79I9gER4xA==
+-----END CERTIFICATE-----
diff --git a/dev_docker_config/certs/root.crt b/dev_docker_config/certs/root.crt
new file mode 100644
index 0000000..07bd1f2
--- /dev/null
+++ b/dev_docker_config/certs/root.crt
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIUJkcSiAM1/HThxOlooWHwkFwKrV0wDQYJKoZIhvcNAQEL
+BQAwZjELMAkGA1UEBhMCSU4xDjAMBgNVBAgMBVN0YXRlMQ0wCwYDVQQHDARDaXR5
+MRUwEwYDVQQKDAxPcmdhbml6YXRpb24xDTALBgNVBAsMBHJvb3QxEjAQBgNVBAMM
+CWxvY2FsaG9zdDAgFw0xOTA2MTMxMDI2MjRaGA8yMTU2MDUwNTEwMjYyNFowZjEL
+MAkGA1UEBhMCSU4xDjAMBgNVBAgMBVN0YXRlMQ0wCwYDVQQHDARDaXR5MRUwEwYD
+VQQKDAxPcmdhbml6YXRpb24xDTALBgNVBAsMBHJvb3QxEjAQBgNVBAMMCWxvY2Fs
+aG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALssyRCNPVu0Ww6S
+qNpUIShA32ie06kQpGw6mxNZh8/238wNYRKExOa8onAUJCkNGf4FBx2rxP0jPZqU
+s2eBnJ/5q+0FO7TMoo3IBURTlj1+4EGeoSi6RgBFrJT4N8xNk88UBj44R627ORKR
+ozhRvt74RGvLjYserbuSQkER5hqfQdWFhWlvxrLIMYWwxZ3J2Lq/y/iI+HtS27Q+
+BEvOA6TwnUW8gwWdFQAvT0au389TgICCak4svcndjioj0MflBb3vftWrYFWuW1VE
+10vLsE+kspeXToSjEEJintxA79Rrjo96e577DRl3kLfBCrr8kYMQvcHSOUbi4rxp
+VpkD8rkCAwEAAaNTMFEwHQYDVR0OBBYEFGcK/s7Ww3yRQnEQcKVsoW59lGwTMB8G
+A1UdIwQYMBaAFGcK/s7Ww3yRQnEQcKVsoW59lGwTMA8GA1UdEwEB/wQFMAMBAf8w
+DQYJKoZIhvcNAQELBQADggEBAFBo8ZBq9BT2k3182mGrJy7yZeObeSTjW/pk4C6s
+nSzcsUBVptKtni7/QcHq0DXdVgeR0Awb6maSaylFN3MoLydmV8oVddtEmTSftikE
+QlKFxmZ+4IXxqQVvpwehFbq4FjJPxpNhX2qsCu49A/+QsLNQV58OfquspcnmaqXU
+mCEGIurJtuN8Gbq79UZ1IzMtkIsw4kQNYF5Lzi2/3KDDhgh7ns0vMEdMBOyyvKR6
+1k75zO2Rh/tHpgCT2Xw63/81nABLvHZeBp+XsCj+hAdbUsLVXXhCBov90sZCcdyH
+AQ4ZnkYQ9+bSGISuIxPFiwOEjEFZ7pEzKX5y1xftlrscpYY=
+-----END CERTIFICATE-----
diff --git a/dev_docker_config/certs/root.key b/dev_docker_config/certs/root.key
new file mode 100644
index 0000000..6c3c461
--- /dev/null
+++ b/dev_docker_config/certs/root.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAuyzJEI09W7RbDpKo2lQhKEDfaJ7TqRCkbDqbE1mHz/bfzA1h
+EoTE5ryicBQkKQ0Z/gUHHavE/SM9mpSzZ4Gcn/mr7QU7tMyijcgFRFOWPX7gQZ6h
+KLpGAEWslPg3zE2TzxQGPjhHrbs5EpGjOFG+3vhEa8uNix6tu5JCQRHmGp9B1YWF
+aW/GssgxhbDFncnYur/L+Ij4e1LbtD4ES84DpPCdRbyDBZ0VAC9PRq7fz1OAgIJq
+Tiy9yd2OKiPQx+UFve9+1atgVa5bVUTXS8uwT6Syl5dOhKMQQmKe3EDv1GuOj3p7
+nvsNGXeQt8EKuvyRgxC9wdI5RuLivGlWmQPyuQIDAQABAoIBACgKmKjVzj6EAsbH
+USADx2QZHLIA6D7OtJ4Cm5I0IP24ToAUjKOti4Hg8M8RP/sYNmtFIBSU3ntYwqED
+Fq4Z6CvA+aqm5/LxpAS4uYe4afeV4Nuo18kisD72qMjloOov3mL6YauF1q+v0bHL
+PiOaOT7x1ZFJ5mnQklICI/JPpe4jrfryE5HvuOft8VqDKKjx1uQe08ycRzPuNgrD
+LceobH5dnABBrp7eH1vlDCyNesAtwXADNa/x7+XARhhGZ4MtgHH8I2ZxOVGugfGD
+rdJRiif8PWISeLDdV4hm9tSM3W+Y7dtCCSUl3Zxo3CsNCdgX62KwodpMwhac9qSB
+Rr790tECgYEA4Xwcp1ov54dlZtQnPazPH1r/VaPJt5pTIQJVGWJZpkVE3yImZHuB
++lOr+1cOP6PQTJMnlVCLE25oGpHK/Nli7VnykgzQLtoZbploJMm8C4E4NSrf9x9R
+Pfr+6AdkJY9jJMO5a9WMZiaRPsosQNbd+oiSFL86ylbekEuShlkali8CgYEA1IFv
+B55FlwOHJDr8gj4P+zgPfcqOikdfhREhOG1SZikSnFxz4n3lFowA4TyBvjtHkusB
+eY/ciZGTw+1tgGt1ZLmmyYhsw28Fs/uFpcNL0Z/IDiURa6O6/Vb5YlW1PXFlqCra
+Lfd27ZvK64eY73w5/RyaelumnkcrTTptSVe2M5cCgYBfk18F5Kl3hyGJI5X6g3xL
+uyONpl5DT8u6qyVtHA4J90SJHA2P+/YNKFg2siDdAs+xFZLqrHg25U6FLJUQ9ggD
+uWOjWoEHyvSKt8W4CjaF3eD4UFMciY7DKdfQfAmMDiolFD1NIvhe+CwKpGF7nlf6
+8NaSqrf9ujKekRnrjmtBiwKBgQDUQljZvjB6b86r1LNlkII8BzoKBqor2rDBZGPP
+TfsRChOJ1Rr3b5LE26EBWYOqtOGAEXaOqrC5RIzZFi3bKPrAWmQLR1aEOz/yD9jl
+wtXXk4arAkGNR6S96gL9Qujeb4b/25XEdjr3iTa93dpX07jEZq6yaxtZW3MYF7UT
+niXjDwKBgBNmvD8EdZmRdpLQ7iB5tJ0SkplA3JZ8uw+S7hYfBb7ayB0N3cTt6WQK
++25ffveOeSaGqh7v3nWT9+U8ffQvrpoYJ2feRMrBx96hdgrozo60Xc8Nai8rYQWm
+3zGGPKhk0giCrj3QydVsUeSYG4LFsK5jgM9hJwokVR5m/FUN5L3D
+-----END RSA PRIVATE KEY-----
diff --git a/dev_docker_config/certs/root.srl b/dev_docker_config/certs/root.srl
new file mode 100644
index 0000000..b44baf2
--- /dev/null
+++ b/dev_docker_config/certs/root.srl
@@ -0,0 +1,1 @@
+56AEDEF97426F8CA5D77179DB686D7E42E729E35
diff --git a/dev_docker_config/certs/server-chain.crt b/dev_docker_config/certs/server-chain.crt
new file mode 100644
index 0000000..d1ac534
--- /dev/null
+++ b/dev_docker_config/certs/server-chain.crt
@@ -0,0 +1,39 @@
+-----BEGIN CERTIFICATE-----
+MIICxDCCAawCFFau3vl0JvjKXXcXnbaG1+Qucp40MA0GCSqGSIb3DQEBCwUAMGYx
+CzAJBgNVBAYTAklOMQ4wDAYDVQQIDAVTdGF0ZTENMAsGA1UEBwwEQ2l0eTEVMBMG
+A1UECgwMT3JnYW5pemF0aW9uMQ0wCwYDVQQLDARyb290MRIwEAYDVQQDDAlsb2Nh
+bGhvc3QwIBcNMTkwNjEzMTAyNjI0WhgPMjE1NjA1MDUxMDI2MjRaMFkxGTAXBgoJ
+kiaJk/IsZAEZFglsb2NhbGhvc3QxFzAVBgNVBAoMDlZhdWx0IENsaSBUZXN0MQ8w
+DQYDVQQLDAZzZXJ2ZXIxEjAQBgNVBAMMCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEA02ZAghzKr4urz8H5tlp53BmvxtAQ8yqwRQTzYhZ3Swj3
+E2SvSOfDNHaUfvFu0fwhF+Cv9bIY9xaX7/KO0Z+ReZyOF0Wt0lBmZAoXm4xYGA0F
+rNg4PY4nGIWgeCHWbmMGCbgyrIc2V1PxPYTFrgad5lyhmA556x9ZQ2KDezus1ssC
+AwEAATANBgkqhkiG9w0BAQsFAAOCAQEAHRnkQLND2ShMtjzwAQ5XkePNIZK4a+Hz
+WSLbqFy3QXnK3h8wtx3NAlPNsmZiJsTeFRJzsvMxYz+/2EikGIaBDyKh3I2QtmMi
+mA8sMvuxZPV3buPENZc9UrGMNlJz//JO7twkTASJDx/q3vHZ1IQPDrIJRz+2zRFz
+gyt4Zsdh1MWtI0FTXweKAfrgPq3TbrfAn4J+hCcgLApf/HquVKWMQuxp3RoyjmcA
+719P+6OWdmz+z4wQ5yyghw3ng7jkh0rtKX2191QWR4kZv19xROw0bSFlwDGFCyt/
+wHNVqroEqftwIsg6h4wvq6y+ce/ahsfa3kZoA5kakrTR8dZfmDRclQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIUJkcSiAM1/HThxOlooWHwkFwKrV0wDQYJKoZIhvcNAQEL
+BQAwZjELMAkGA1UEBhMCSU4xDjAMBgNVBAgMBVN0YXRlMQ0wCwYDVQQHDARDaXR5
+MRUwEwYDVQQKDAxPcmdhbml6YXRpb24xDTALBgNVBAsMBHJvb3QxEjAQBgNVBAMM
+CWxvY2FsaG9zdDAgFw0xOTA2MTMxMDI2MjRaGA8yMTU2MDUwNTEwMjYyNFowZjEL
+MAkGA1UEBhMCSU4xDjAMBgNVBAgMBVN0YXRlMQ0wCwYDVQQHDARDaXR5MRUwEwYD
+VQQKDAxPcmdhbml6YXRpb24xDTALBgNVBAsMBHJvb3QxEjAQBgNVBAMMCWxvY2Fs
+aG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALssyRCNPVu0Ww6S
+qNpUIShA32ie06kQpGw6mxNZh8/238wNYRKExOa8onAUJCkNGf4FBx2rxP0jPZqU
+s2eBnJ/5q+0FO7TMoo3IBURTlj1+4EGeoSi6RgBFrJT4N8xNk88UBj44R627ORKR
+ozhRvt74RGvLjYserbuSQkER5hqfQdWFhWlvxrLIMYWwxZ3J2Lq/y/iI+HtS27Q+
+BEvOA6TwnUW8gwWdFQAvT0au389TgICCak4svcndjioj0MflBb3vftWrYFWuW1VE
+10vLsE+kspeXToSjEEJintxA79Rrjo96e577DRl3kLfBCrr8kYMQvcHSOUbi4rxp
+VpkD8rkCAwEAAaNTMFEwHQYDVR0OBBYEFGcK/s7Ww3yRQnEQcKVsoW59lGwTMB8G
+A1UdIwQYMBaAFGcK/s7Ww3yRQnEQcKVsoW59lGwTMA8GA1UdEwEB/wQFMAMBAf8w
+DQYJKoZIhvcNAQELBQADggEBAFBo8ZBq9BT2k3182mGrJy7yZeObeSTjW/pk4C6s
+nSzcsUBVptKtni7/QcHq0DXdVgeR0Awb6maSaylFN3MoLydmV8oVddtEmTSftikE
+QlKFxmZ+4IXxqQVvpwehFbq4FjJPxpNhX2qsCu49A/+QsLNQV58OfquspcnmaqXU
+mCEGIurJtuN8Gbq79UZ1IzMtkIsw4kQNYF5Lzi2/3KDDhgh7ns0vMEdMBOyyvKR6
+1k75zO2Rh/tHpgCT2Xw63/81nABLvHZeBp+XsCj+hAdbUsLVXXhCBov90sZCcdyH
+AQ4ZnkYQ9+bSGISuIxPFiwOEjEFZ7pEzKX5y1xftlrscpYY=
+-----END CERTIFICATE-----
diff --git a/dev_docker_config/certs/server.crt b/dev_docker_config/certs/server.crt
new file mode 100644
index 0000000..eb281cd
--- /dev/null
+++ b/dev_docker_config/certs/server.crt
@@ -0,0 +1,17 @@
+-----BEGIN CERTIFICATE-----
+MIICxDCCAawCFFau3vl0JvjKXXcXnbaG1+Qucp40MA0GCSqGSIb3DQEBCwUAMGYx
+CzAJBgNVBAYTAklOMQ4wDAYDVQQIDAVTdGF0ZTENMAsGA1UEBwwEQ2l0eTEVMBMG
+A1UECgwMT3JnYW5pemF0aW9uMQ0wCwYDVQQLDARyb290MRIwEAYDVQQDDAlsb2Nh
+bGhvc3QwIBcNMTkwNjEzMTAyNjI0WhgPMjE1NjA1MDUxMDI2MjRaMFkxGTAXBgoJ
+kiaJk/IsZAEZFglsb2NhbGhvc3QxFzAVBgNVBAoMDlZhdWx0IENsaSBUZXN0MQ8w
+DQYDVQQLDAZzZXJ2ZXIxEjAQBgNVBAMMCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEA02ZAghzKr4urz8H5tlp53BmvxtAQ8yqwRQTzYhZ3Swj3
+E2SvSOfDNHaUfvFu0fwhF+Cv9bIY9xaX7/KO0Z+ReZyOF0Wt0lBmZAoXm4xYGA0F
+rNg4PY4nGIWgeCHWbmMGCbgyrIc2V1PxPYTFrgad5lyhmA556x9ZQ2KDezus1ssC
+AwEAATANBgkqhkiG9w0BAQsFAAOCAQEAHRnkQLND2ShMtjzwAQ5XkePNIZK4a+Hz
+WSLbqFy3QXnK3h8wtx3NAlPNsmZiJsTeFRJzsvMxYz+/2EikGIaBDyKh3I2QtmMi
+mA8sMvuxZPV3buPENZc9UrGMNlJz//JO7twkTASJDx/q3vHZ1IQPDrIJRz+2zRFz
+gyt4Zsdh1MWtI0FTXweKAfrgPq3TbrfAn4J+hCcgLApf/HquVKWMQuxp3RoyjmcA
+719P+6OWdmz+z4wQ5yyghw3ng7jkh0rtKX2191QWR4kZv19xROw0bSFlwDGFCyt/
+wHNVqroEqftwIsg6h4wvq6y+ce/ahsfa3kZoA5kakrTR8dZfmDRclQ==
+-----END CERTIFICATE-----
diff --git a/dev_docker_config/certs/server.csr b/dev_docker_config/certs/server.csr
new file mode 100644
index 0000000..6994239
--- /dev/null
+++ b/dev_docker_config/certs/server.csr
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIICDjCCAXcCAQAwWTEZMBcGCgmSJomT8ixkARkWCWxvY2FsaG9zdDEXMBUGA1UE
+CgwOVmF1bHQgQ2xpIFRlc3QxDzANBgNVBAsMBnNlcnZlcjESMBAGA1UEAwwJbG9j
+YWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDTZkCCHMqvi6vPwfm2
+WnncGa/G0BDzKrBFBPNiFndLCPcTZK9I58M0dpR+8W7R/CEX4K/1shj3Fpfv8o7R
+n5F5nI4XRa3SUGZkChebjFgYDQWs2Dg9jicYhaB4IdZuYwYJuDKshzZXU/E9hMWu
+Bp3mXKGYDnnrH1lDYoN7O6zWywIDAQABoHUwcwYJKoZIhvcNAQkOMWYwZDAOBgNV
+HQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB0GA1Ud
+DgQWBBSESu39Ayl26IJ1lemoovKKoYUY1jAUBgNVHREEDTALgglsb2NhbGhvc3Qw
+DQYJKoZIhvcNAQELBQADgYEARfKnjrIV5X2Jr+3DXRWt7/KsIm0Po26gk4aNZYYk
+yF+6LG+lHTGsq7Y3VSEZB2FNdii4i+obl22Ev+DToRsolkxR+ILUunJJigCD/FWR
+JI2yqhz6uEuDmmnrtgHFxELb5ix06LT8kdAMYmnw7VZvvRo3doQxZFL68kkKqmVY
+ajQ=
+-----END CERTIFICATE REQUEST-----
diff --git a/dev_docker_config/certs/server.key b/dev_docker_config/certs/server.key
new file mode 100644
index 0000000..87081f0
--- /dev/null
+++ b/dev_docker_config/certs/server.key
@@ -0,0 +1,16 @@
+-----BEGIN PRIVATE KEY-----
+MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANNmQIIcyq+Lq8/B
++bZaedwZr8bQEPMqsEUE82IWd0sI9xNkr0jnwzR2lH7xbtH8IRfgr/WyGPcWl+/y
+jtGfkXmcjhdFrdJQZmQKF5uMWBgNBazYOD2OJxiFoHgh1m5jBgm4MqyHNldT8T2E
+xa4GneZcoZgOeesfWUNig3s7rNbLAgMBAAECgYEAoMXZNZsUAuHkbwMFGMxCdUQL
+zNYcrfK/UB5twyF25FgTIGqobHfmm5W7ZbfUIlrwCCrXZ7JlDjXeo5wDRiVnCoXB
+3053nBOAN5Y+NLdmE2lIpRhRxyJrNj7/ny5hG8nK1KqjlPg+SiX72xGQm1eVrbNW
+qLyj80DmDxcBKufVgEECQQD1+dnOMCNnKWN32IQijHPh86NqRQ47wW4akpvj0XIR
+y0YS+qQ+7WnXh24PbeRKifJKHDwPbkm4Nq1PPcwKbv7RAkEA3AOuOc91ouv6TX5y
+cyjufidhjU6p9rlSOl+mE1ifhYNgvq7bHYD+JYIesV3YGDd4DtdvmYeJlkInT+jC
+l4W62wJBAPK+k7frwcR5D/Sh9CS0P1hpPIgPhjBqf+IxdS6q78uns4vfVl/TpHRS
+7sbDSFxXLoj8vDjuOkpVi0t8TPSu/UECQATLP7yavKF0KtwNaUkBF1FAYmvFzwZF
+O3lyJBg/0hoCptUA0l1uNhtzHmAW/2JnswH/x7q8rU7M2jZvh+3tSAkCQDllcZC+
+OxBzQzC0lnm4x3pSCmRV0KY0L0nQvcb/gS8hBvV0cxDfbkxKSszSsSk73FWWdS9+
+qe2pnLTbrDh5P5E=
+-----END PRIVATE KEY-----
diff --git a/dev_docker_config/certs/server.pem b/dev_docker_config/certs/server.pem
new file mode 100644
index 0000000..8c8e91d
--- /dev/null
+++ b/dev_docker_config/certs/server.pem
@@ -0,0 +1,33 @@
+-----BEGIN PRIVATE KEY-----
+MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANNmQIIcyq+Lq8/B
++bZaedwZr8bQEPMqsEUE82IWd0sI9xNkr0jnwzR2lH7xbtH8IRfgr/WyGPcWl+/y
+jtGfkXmcjhdFrdJQZmQKF5uMWBgNBazYOD2OJxiFoHgh1m5jBgm4MqyHNldT8T2E
+xa4GneZcoZgOeesfWUNig3s7rNbLAgMBAAECgYEAoMXZNZsUAuHkbwMFGMxCdUQL
+zNYcrfK/UB5twyF25FgTIGqobHfmm5W7ZbfUIlrwCCrXZ7JlDjXeo5wDRiVnCoXB
+3053nBOAN5Y+NLdmE2lIpRhRxyJrNj7/ny5hG8nK1KqjlPg+SiX72xGQm1eVrbNW
+qLyj80DmDxcBKufVgEECQQD1+dnOMCNnKWN32IQijHPh86NqRQ47wW4akpvj0XIR
+y0YS+qQ+7WnXh24PbeRKifJKHDwPbkm4Nq1PPcwKbv7RAkEA3AOuOc91ouv6TX5y
+cyjufidhjU6p9rlSOl+mE1ifhYNgvq7bHYD+JYIesV3YGDd4DtdvmYeJlkInT+jC
+l4W62wJBAPK+k7frwcR5D/Sh9CS0P1hpPIgPhjBqf+IxdS6q78uns4vfVl/TpHRS
+7sbDSFxXLoj8vDjuOkpVi0t8TPSu/UECQATLP7yavKF0KtwNaUkBF1FAYmvFzwZF
+O3lyJBg/0hoCptUA0l1uNhtzHmAW/2JnswH/x7q8rU7M2jZvh+3tSAkCQDllcZC+
+OxBzQzC0lnm4x3pSCmRV0KY0L0nQvcb/gS8hBvV0cxDfbkxKSszSsSk73FWWdS9+
+qe2pnLTbrDh5P5E=
+-----END PRIVATE KEY-----
+-----BEGIN CERTIFICATE-----
+MIICxDCCAawCFFau3vl0JvjKXXcXnbaG1+Qucp40MA0GCSqGSIb3DQEBCwUAMGYx
+CzAJBgNVBAYTAklOMQ4wDAYDVQQIDAVTdGF0ZTENMAsGA1UEBwwEQ2l0eTEVMBMG
+A1UECgwMT3JnYW5pemF0aW9uMQ0wCwYDVQQLDARyb290MRIwEAYDVQQDDAlsb2Nh
+bGhvc3QwIBcNMTkwNjEzMTAyNjI0WhgPMjE1NjA1MDUxMDI2MjRaMFkxGTAXBgoJ
+kiaJk/IsZAEZFglsb2NhbGhvc3QxFzAVBgNVBAoMDlZhdWx0IENsaSBUZXN0MQ8w
+DQYDVQQLDAZzZXJ2ZXIxEjAQBgNVBAMMCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEA02ZAghzKr4urz8H5tlp53BmvxtAQ8yqwRQTzYhZ3Swj3
+E2SvSOfDNHaUfvFu0fwhF+Cv9bIY9xaX7/KO0Z+ReZyOF0Wt0lBmZAoXm4xYGA0F
+rNg4PY4nGIWgeCHWbmMGCbgyrIc2V1PxPYTFrgad5lyhmA556x9ZQ2KDezus1ssC
+AwEAATANBgkqhkiG9w0BAQsFAAOCAQEAHRnkQLND2ShMtjzwAQ5XkePNIZK4a+Hz
+WSLbqFy3QXnK3h8wtx3NAlPNsmZiJsTeFRJzsvMxYz+/2EikGIaBDyKh3I2QtmMi
+mA8sMvuxZPV3buPENZc9UrGMNlJz//JO7twkTASJDx/q3vHZ1IQPDrIJRz+2zRFz
+gyt4Zsdh1MWtI0FTXweKAfrgPq3TbrfAn4J+hCcgLApf/HquVKWMQuxp3RoyjmcA
+719P+6OWdmz+z4wQ5yyghw3ng7jkh0rtKX2191QWR4kZv19xROw0bSFlwDGFCyt/
+wHNVqroEqftwIsg6h4wvq6y+ce/ahsfa3kZoA5kakrTR8dZfmDRclQ==
+-----END CERTIFICATE-----
diff --git a/dev_docker_config/config.hcl b/dev_docker_config/config.hcl
new file mode 100644
index 0000000..7c71f3d
--- /dev/null
+++ b/dev_docker_config/config.hcl
@@ -0,0 +1,6 @@
+listener "tcp" {
+  tls_key_file = "/var/vault/certs/server.key"
+  tls_cert_file = "/var/vault/certs/server.crt"
+  tls_disable  = false
+  address = "0.0.0.0:8443"
+}
diff --git a/dev_docker_config/generate-certificates.sh b/dev_docker_config/generate-certificates.sh
new file mode 100755
index 0000000..e82b1ee
--- /dev/null
+++ b/dev_docker_config/generate-certificates.sh
@@ -0,0 +1,65 @@
+#!/bin/bash -eux
+
+# From https://reactpaths.com/how-to-get-https-working-in-localhost-development-environment-f17de34af046
+
+# Whatever the path the script is launched from, assume
+# we're in the script folder.
+READLINK=$(which greadlink || which readlink)
+cd $($READLINK -e $(dirname $BASH_SOURCE))
+
+rm -rf certs/*
+mkdir -p certs
+
+# Generate a CA
+openssl genrsa -out certs/root.key 2048
+openssl req \
+    -x509 -new -nodes -sha256 -days 50000 \
+    -key certs/root.key \
+    -out certs/root.crt \
+    -subj "/C=IN/ST=State/L=City/O=Organization/OU=root/CN=localhost"
+
+generate_certificate(){
+    # Generate a CSR
+    openssl req \
+    -new -nodes \
+    -out "certs/${1}.csr" \
+    -keyout "certs/${1}.key" \
+    -config <(echo " \
+        [ req ]
+        default_bits = 1024
+        encrypt_key = no
+        default_md = sha256
+        utf8only = yes
+        string_mask = utf8only
+        prompt = no
+        distinguished_name = dn
+        req_extensions = reqext
+        x509_extensions = reqext
+
+        [dn]
+        0.domainComponent = "localhost"
+        organizationName = "Vault Cli Test"
+        organizationalUnitName = "${1}"
+        commonName = "localhost"
+
+        [reqext]
+        keyUsage = critical,digitalSignature,keyEncipherment
+        extendedKeyUsage = serverAuth,clientAuth
+        subjectKeyIdentifier = hash
+        subjectAltName = DNS:localhost
+    ")
+
+    # Generate the certificate
+    openssl x509 \
+    -req \
+    -sha256 -days 50000 \
+    -in certs/"${1}.csr" \
+    -CA certs/root.crt -CAkey certs/root.key -CAcreateserial \
+    -out certs/"${1}.crt" \
+
+    cat certs/"${1}.key" certs/"${1}.crt" > certs/"${1}.pem"
+    cat certs/"${1}.crt" certs/root.crt > certs/"${1}-chain.crt"
+}
+
+generate_certificate server
+generate_certificate client
diff --git a/dev_docker_config/policy.hcl b/dev_docker_config/policy.hcl
new file mode 100644
index 0000000..be42692
--- /dev/null
+++ b/dev_docker_config/policy.hcl
@@ -0,0 +1,3 @@
+path "secretkvv1/*" {
+    capabilities = ["create", "read", "update", "delete", "list"]
+}
diff --git a/dev_docker_config/vault-post-startup.sh b/dev_docker_config/vault-post-startup.sh
new file mode 100755
index 0000000..c202ba8
--- /dev/null
+++ b/dev_docker_config/vault-post-startup.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+sleep 3
+
+export VAULT_ADDR=https://localhost:8443 VAULT_SKIP_VERIFY=1
+
+vault login some-token
+
+vault secrets enable -path=secretkvv1 -version=1 kv
+
+vault policy write dev-policy /var/vault/policy.hcl
+
+vault auth enable cert
+
+vault write auth/cert/certs/cert-login certificate=@/var/vault/certs/client.crt policies=dev-policy name=cert-login
+
+vault auth enable userpass
+
+vault write auth/userpass/users/userpass-login password=userpass-pass policies=dev-policy
diff --git a/dev_docker_config/vault-startup.sh b/dev_docker_config/vault-startup.sh
new file mode 100755
index 0000000..0265b1f
--- /dev/null
+++ b/dev_docker_config/vault-startup.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+/var/vault/vault-post-startup.sh &
+
+exec vault server -dev -config /var/vault/config.hcl
diff --git a/docker-compose.yml b/docker-compose.yml
index 1f715f2..51c80ac 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,15 +1,13 @@
 version: '2'
 services:
   vault:
-    image: "vault"
-    command: vault server -dev
+    image: vault
+    command: /var/vault/vault-startup.sh
     environment:
-      VAULT_ADDR: http://127.0.0.1:8200
-      VAULT_DEV_LISTEN_ADDRESS: 0.0.0.0:8200
+      SKIP_SETCAP: 1
       VAULT_DEV_ROOT_TOKEN_ID: some-token
-      VAULT_LOCAL_CONFIG: >
-        {
-          "disable_mlock": true
-        }
     ports:
     - "8200:8200"
+    - "8443:8443"
+    volumes:
+    - ./dev_docker_config:/var/vault/:ro
diff --git a/vault_cli/cli.py b/vault_cli/cli.py
index 13e775a..f69e96a 100644
--- a/vault_cli/cli.py
+++ b/vault_cli/cli.py
@@ -62,11 +62,14 @@ def handle_errors():
     "to check against.",
 )
 @click.option(
-    "--certificate-file",
-    "-c",
+    "--login-cert",
     type=click.Path(),
-    help="Certificate to connect to vault. "
-    'Configuration file can also contain a "certificate" key.',
+    help="Path to a public client certificate to use for connecting to vault.",
+)
+@click.option(
+    "--login-cert-key",
+    type=click.Path(),
+    help="Path to a private client certificate to use for connecting to vault.",
 )
 @click.option(
     "--token-file",
@@ -127,7 +130,7 @@ def extract_special_args(
     config: Mapping[str, Any], environ: Mapping[str, str]
 ) -> Dict[str, Any]:
     result = {}
-    for key in ["password", "certificate", "token"]:
+    for key in ["password", "token"]:
         result[key] = config.get(key)
         env_var_key = "VAULT_CLI_{}".format(key.upper())
         if env_var_key in environ:
diff --git a/vault_cli/client.py b/vault_cli/client.py
index ac26a43..aea6772 100644
--- a/vault_cli/client.py
+++ b/vault_cli/client.py
@@ -5,6 +5,7 @@ import pathlib
 from typing import Iterable, Optional, Tuple, Type
 
 import hvac
+import requests.packages.urllib3
 
 from vault_cli import exceptions, sessions, settings, types, utils
 
@@ -79,7 +80,8 @@ class VaultClientBase:
         verify: bool,
         ca_bundle: str,
         base_path: str,
-        certificate: str,
+        login_cert: Optional[str],
+        login_cert_key: Optional[str],
         token: str,
         username: str,
         password: str,
@@ -92,14 +94,27 @@ class VaultClientBase:
         if verify and ca_bundle:
             verify_ca_bundle = ca_bundle
 
-        self._init_client(url=url, verify=verify_ca_bundle)
+        # Temporary workaround for https://github.com/urllib3/urllib3/issues/497
+        requests.packages.urllib3.disable_warnings()
+
+        self._init_client(
+            url=url,
+            verify=verify_ca_bundle,
+            login_cert=login_cert,
+            login_cert_key=login_cert_key,
+        )
 
         self.base_path = (base_path or "").rstrip("/") + "/"
 
         if token:
             self._authenticate_token(token)
-        elif certificate:
-            self._authenticate_certificate(certificate)
+        elif login_cert:
+            if login_cert_key:
+                self._authenticate_certificate()
+            else:
+                raise exceptions.VaultAuthenticationError(
+                    "Cannot use certificate file for login without key file"
+                )
         elif username:
             if not password:
                 raise exceptions.VaultAuthenticationError(
@@ -267,13 +282,19 @@ class VaultClientBase:
 
         self._set_secret(path=path, value=value)
 
-    def _init_client(self, url: str, verify: types.VerifyOrCABundle) -> None:
+    def _init_client(
+        self,
+        url: str,
+        verify: types.VerifyOrCABundle,
+        login_cert: Optional[str],
+        login_cert_key: Optional[str],
+    ) -> None:
         raise NotImplementedError
 
     def _authenticate_token(self, token: str) -> None:
         raise NotImplementedError
 
-    def _authenticate_certificate(self, certificate: str) -> None:
+    def _authenticate_certificate(self) -> None:
         raise NotImplementedError
 
     def _authenticate_userpass(self, username: str, password: str) -> None:
@@ -314,10 +335,23 @@ def handle_errors():
 
 class VaultClient(VaultClientBase):
     @handle_errors()
-    def _init_client(self, url: str, verify: types.VerifyOrCABundle) -> None:
+    def _init_client(
+        self,
+        url: str,
+        verify: types.VerifyOrCABundle,
+        login_cert: Optional[str],
+        login_cert_key: Optional[str],
+    ) -> None:
         self.session = sessions.Session()
         self.session.verify = verify
-        self.client = hvac.Client(url=url, verify=verify, session=self.session)
+
+        cert = None
+        if login_cert and login_cert_key:
+            cert = (login_cert, login_cert_key)
+
+        self.client = hvac.Client(
+            url=url, verify=verify, session=self.session, cert=cert
+        )
 
     def _authenticate_token(self, token: str) -> None:
         self.client.token = token
@@ -326,6 +360,10 @@ class VaultClient(VaultClientBase):
     def _authenticate_userpass(self, username: str, password: str) -> None:
         self.client.auth_userpass(username, password)
 
+    @handle_errors()
+    def _authenticate_certificate(self) -> None:
+        self.client.auth_tls()
+
     @handle_errors()
     def list_secrets(self, path: str) -> Iterable[str]:
         secrets = self.client.list(self.base_path + path)
diff --git a/vault_cli/settings.py b/vault_cli/settings.py
index 1267734..619998c 100644
--- a/vault_cli/settings.py
+++ b/vault_cli/settings.py
@@ -17,7 +17,8 @@ CONFIG_FILES = ["./.vault.yml", "~/.vault.yml", "/etc/vault.yml"]
 
 DEFAULTS = {
     "base_path": None,
-    "certificate": None,
+    "login_cert": None,
+    "login_cert_key": None,
     "password": None,
     "token": None,
     "url": "http://localhost:8200",
@@ -30,7 +31,7 @@ DEFAULTS = {
 def read_config_file(file_path: str) -> Optional[types.SettingsDict]:
     try:
         with open(os.path.expanduser(file_path), "r") as f:
-            config = yaml.safe_load(f)
+            config = yaml.safe_load(f) or {}
             logger.info(
                 f"Reading yaml config file at {file_path}, "
                 f"contains keys: {', '.join(config)}"
@@ -94,7 +95,6 @@ def build_config_from_env(environ: Dict[str, str]) -> types.SettingsDict:
 def read_all_files(config: types.SettingsDict) -> types.SettingsDict:
     config = config.copy()
 
-    replace_path_with_content(config=config, setting_name="certificate")
     replace_path_with_content(config=config, setting_name="password")
     replace_path_with_content(config=config, setting_name="token")
 

Authenticate using certificate
diff --git a/tests/unit/test_cli.py b/tests/unit/test_cli.py
index 70045bf..e1c0e72 100644
--- a/tests/unit/test_cli.py
+++ b/tests/unit/test_cli.py
@@ -19,8 +19,10 @@ def test_options(cli_runner, mocker):
             "bla",
             "--ca-bundle",
             "yay",
-            "--certificate-file",
-            "a",
+            "--login-cert",
+            "puc",
+            "--login-cert-key",
+            "prc",
             "--password-file",
             "b",
             "--token-file",
@@ -39,7 +41,8 @@ def test_options(cli_runner, mocker):
     assert set(kwargs) == {
         "base_path",
         "ca_bundle",
-        "certificate",
+        "login_cert",
+        "login_cert_key",
         "password",
         "token",
         "url",
@@ -48,7 +51,8 @@ def test_options(cli_runner, mocker):
     }
     assert kwargs["base_path"] == "bla"
     assert kwargs["ca_bundle"] == "yay"
-    assert kwargs["certificate"] == "content of a"
+    assert kwargs["login_cert"] == "puc"
+    assert kwargs["login_cert_key"] == "prc"
     assert kwargs["password"] == "content of b"
     assert kwargs["token"] == "content of c"
     assert kwargs["url"] == "https://foo"
@@ -245,27 +249,18 @@ def test_load_config(mocker, value, expected):
         # Relevant keys is copied from first dict
         ({"password": "e"}, {}, {"password": "e"}),
         ({"token": "f"}, {}, {"token": "f"}),
-        ({"certificate": "g"}, {}, {"certificate": "g"}),
         # Relevant keys is copied from second dict
         ({}, {"VAULT_CLI_PASSWORD": "h"}, {"password": "h"}),
         ({}, {"VAULT_CLI_TOKEN": "i"}, {"token": "i"}),
-        ({}, {"VAULT_CLI_CERTIFICATE": "j"}, {"certificate": "j"}),
         # Second dict has priority
         ({"password": "l"}, {"VAULT_CLI_PASSWORD": "m"}, {"password": "m"}),
         ({"token": "n"}, {"VAULT_CLI_TOKEN": "o"}, {"token": "o"}),
-        ({"certificate": "p"}, {"VAULT_CLI_CERTIFICATE": "q"}, {"certificate": "q"}),
-        # Both dict are used
-        (
-            {"password": "r"},
-            {"VAULT_CLI_CERTIFICATE": "s"},
-            {"password": "r", "certificate": "s"},
-        ),
     ],
 )
 def test_extract_special_args(config, environ, expected):
     result = cli.extract_special_args(config, environ)
 
-    assert set(result) == {"password", "token", "certificate"}
+    assert set(result) == {"password", "token"}
     # remove None
     result = {key: value for key, value in result.items() if value is not None}
 
@@ -283,7 +278,12 @@ def test_set_verbosity(mocker):
 def test_dump_config(cli_runner, vault):
     result = cli_runner.invoke(
         cli.cli,
-        ["--base-path", "mybase/", "--token-file", "-", "dump-config"],
+        [
+            "--config-file=/dev/null",
+            "--base-path=mybase/",
+            "--token-file=-",
+            "dump-config",
+        ],
         input="some-token",
     )
 
diff --git a/tests/unit/test_client_base.py b/tests/unit/test_client_base.py
index 7704f1d..de3021c 100644
--- a/tests/unit/test_client_base.py
+++ b/tests/unit/test_client_base.py
@@ -47,13 +47,19 @@ def test_vault_client_base_call_init_client():
         url="yay",
         token="go",
         base_path=None,
-        certificate=None,
+        login_cert="a",
+        login_cert_key="b",
         username=None,
         password=None,
         ca_bundle=None,
     )
 
-    assert called_with == {"verify": False, "url": "yay"}
+    assert called_with == {
+        "verify": False,
+        "url": "yay",
+        "login_cert": "a",
+        "login_cert_key": "b",
+    }
 
 
 @pytest.mark.parametrize(
@@ -61,7 +67,7 @@ def test_vault_client_base_call_init_client():
     [
         ({"token": "yay"}, ["token", "yay"]),
         ({"username": "a", "password": "b"}, ["userpass", "a", "b"]),
-        ({"certificate": "cert"}, ["certificate", "cert"]),
+        ({"login_cert": "a", "login_cert_key": "b"}, ["certificate"]),
     ],
 )
 def test_vault_client_base_authenticate(test_kwargs, expected):
@@ -74,13 +80,19 @@ def test_vault_client_base_authenticate(test_kwargs, expected):
         def _authenticate_token(self, token):
             auth_params.extend(["token", token])
 
-        def _authenticate_certificate(self, certificate):
-            auth_params.extend(["certificate", certificate])
+        def _authenticate_certificate(self):
+            auth_params.extend(["certificate"])
 
         def _authenticate_userpass(self, username, password):
             auth_params.extend(["userpass", username, password])
 
-    kwargs = {"token": None, "username": None, "password": None, "certificate": None}
+    kwargs = {
+        "token": None,
+        "username": None,
+        "password": None,
+        "login_cert": None,
+        "login_cert_key": None,
+    }
     kwargs.update(test_kwargs)
     TestVaultClient(verify=False, url=None, base_path=None, ca_bundle=None, **kwargs)
 
@@ -100,7 +112,27 @@ def test_vault_client_base_username_without_password():
             url="yay",
             token=None,
             base_path=None,
-            certificate=None,
+            login_cert=None,
+            login_cert_key=None,
+            ca_bundle=None,
+        )
+
+
+def test_vault_client_base_login_cert_without_key():
+    class TestVaultClient(client.VaultClientBase):
+        def _init_client(self, **kwargs):
+            pass
+
+    with pytest.raises(exceptions.VaultAuthenticationError):
+        TestVaultClient(
+            username=None,
+            password=None,
+            verify=False,
+            url="yay",
+            token=None,
+            base_path=None,
+            login_cert="a",
+            login_cert_key=None,
             ca_bundle=None,
         )
 
@@ -118,7 +150,8 @@ def test_vault_client_base_no_auth():
             url="yay",
             token=None,
             base_path=None,
-            certificate=None,
+            login_cert=None,
+            login_cert_key=None,
             ca_bundle=None,
         )
 
@@ -144,7 +177,8 @@ def test_vault_client_ca_bundle_verify(mocker, verify, ca_bundle, expected):
             url=None,
             token=None,
             base_path=None,
-            certificate=None,
+            login_cert=None,
+            login_cert_key=None,
         )
 
     assert session_kwargs["verify"] == expected
diff --git a/tests/unit/test_client_hvac.py b/tests/unit/test_client_hvac.py
index 7966074..e1c86d4 100644
--- a/tests/unit/test_client_hvac.py
+++ b/tests/unit/test_client_hvac.py
@@ -18,7 +18,8 @@ def get_client(**additional_kwargs):
         "url": "http://vault:8000",
         "verify": True,
         "base_path": "bla",
-        "certificate": None,
+        "login_cert": None,
+        "login_cert_key": None,
         "token": "tok",
         "username": None,
         "password": None,
@@ -29,8 +30,13 @@ def get_client(**additional_kwargs):
 
 
 @pytest.fixture
-def mock_hvac(mocker):
-    yield mocker.patch("hvac.Client").return_value
+def mock_hvac_class(mocker):
+    yield mocker.patch("hvac.Client")
+
+
+@pytest.fixture
+def mock_hvac(mock_hvac_class):
+    yield mock_hvac_class.return_value
 
 
 def test_token(mock_hvac):
@@ -46,6 +52,14 @@ def test_userpass(mock_hvac):
     mock_hvac.auth_userpass.assert_called_with("myuser", "pass")
 
 
+def test_certificate(mock_hvac_class, mock_hvac):
+
+    get_client(token=None, login_cert="a", login_cert_key="b")
+
+    assert mock_hvac_class.call_args[1]["cert"] == ("a", "b")
+    mock_hvac.auth_tls.assert_called_with()
+
+
 def test_get_secret(mock_hvac):
 
     mock_hvac.read.return_value = {"data": {"value": "b"}}
diff --git a/tests/unit/test_settings.py b/tests/unit/test_settings.py
index 0828b14..566bcb5 100644
--- a/tests/unit/test_settings.py
+++ b/tests/unit/test_settings.py
@@ -12,6 +12,10 @@ def test_read_config_file_not_existing():
     assert settings.read_config_file("/non-existant-file") is None
 
 
+def test_read_config_file_empty():
+    assert settings.read_config_file("/dev/null") == {}
+
+
 def test_read_config_file_other_error():
     assert settings.read_config_file("/") is None
 
@@ -30,24 +34,18 @@ def test_dash_to_underscores():
 
 
 def test_read_all_files_no_file():
-    d = {"token": "yay", "certificate": "yo", "password": "aaa"}
+    d = {"token": "yay", "password": "aaa"}
     assert settings.read_all_files(d) == d
 
 
 def test_read_all_files(tmpdir):
     token_path = str(tmpdir.join("token"))
     open(token_path, "wb").write(b"yay")
-    certificate_path = str(tmpdir.join("certificate"))
-    open(certificate_path, "wb").write(b"yo")
     password_path = str(tmpdir.join("password"))
     open(password_path, "wb").write(b"aaa")
 
-    d = {
-        "token_file": token_path,
-        "certificate_file": certificate_path,
-        "password_file": password_path,
-    }
-    expected = {"token": "yay", "certificate": "yo", "password": "aaa"}
+    d = {"token_file": token_path, "password_file": password_path}
+    expected = {"token": "yay", "password": "aaa"}
     assert settings.read_all_files(d) == expected
 
 

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest mypy flake8 isort black pytest-cov
apt-get update apt-get install -y gcc
3.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
backports.tarfile==1.2.0
black==25.1.0
certifi==2025.1.31
cffi==1.17.1
charset-normalizer==3.4.1
click==8.1.8
coverage==7.8.0
cryptography==44.0.2
docutils==0.21.2
exceptiongroup==1.2.2
flake8==7.2.0
hvac==2.3.0
id==1.5.0
idna==3.10
importlib_metadata==8.6.1
iniconfig==2.1.0
isort==6.0.1
jaraco.classes==3.4.0
jaraco.context==6.0.1
jaraco.functools==4.1.0
jeepney==0.9.0
Jinja2==3.1.6
keyring==25.6.0
markdown-it-py==3.0.0
MarkupSafe==3.0.2
mccabe==0.7.0
mdurl==0.1.2
more-itertools==10.6.0
mypy==1.15.0
mypy-extensions==1.0.0
nh3==0.2.21
packaging==24.2
pathspec==0.12.1
platformdirs==4.3.7
pluggy==1.5.0
pycodestyle==2.13.0
pycparser==2.22
pyflakes==3.3.1
Pygments==2.19.1
pytest==8.3.5
pytest-cov==6.0.0
PyYAML==6.0.2
readme_renderer==44.0
requests==2.32.3
requests-toolbelt==1.0.0
rfc3986==2.0.0
rich==14.0.0
SecretStorage==3.3.3
tomli==2.2.1
twine==6.1.0
typing_extensions==4.13.0
urllib3==2.3.0
-e git+https://github.com/peopledoc/vault-cli.git@e62ffd504f2e897ba5b9a37688d300201898cb84#egg=vault_cli
zipp==3.21.0

name: vault-cli
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - backports-tarfile==1.2.0
      - black==25.1.0
      - certifi==2025.1.31
      - cffi==1.17.1
      - charset-normalizer==3.4.1
      - click==8.1.8
      - coverage==7.8.0
      - cryptography==44.0.2
      - docutils==0.21.2
      - exceptiongroup==1.2.2
      - flake8==7.2.0
      - hvac==2.3.0
      - id==1.5.0
      - idna==3.10
      - importlib-metadata==8.6.1
      - iniconfig==2.1.0
      - isort==6.0.1
      - jaraco-classes==3.4.0
      - jaraco-context==6.0.1
      - jaraco-functools==4.1.0
      - jeepney==0.9.0
      - jinja2==3.1.6
      - keyring==25.6.0
      - markdown-it-py==3.0.0
      - markupsafe==3.0.2
      - mccabe==0.7.0
      - mdurl==0.1.2
      - more-itertools==10.6.0
      - mypy==1.15.0
      - mypy-extensions==1.0.0
      - nh3==0.2.21
      - packaging==24.2
      - pathspec==0.12.1
      - platformdirs==4.3.7
      - pluggy==1.5.0
      - pycodestyle==2.13.0
      - pycparser==2.22
      - pyflakes==3.3.1
      - pygments==2.19.1
      - pytest==8.3.5
      - pytest-cov==6.0.0
      - pyyaml==6.0.2
      - readme-renderer==44.0
      - requests==2.32.3
      - requests-toolbelt==1.0.0
      - rfc3986==2.0.0
      - rich==14.0.0
      - secretstorage==3.3.3
      - tomli==2.2.1
      - twine==6.1.0
      - typing-extensions==4.13.0
      - urllib3==2.3.0
      - zipp==3.21.0
prefix: /opt/conda/envs/vault-cli

tests/unit/test_cli.py::test_extract_special_args[config0-environ0-expected0] tests/unit/test_cli.py::test_extract_special_args[config1-environ1-expected1] tests/unit/test_cli.py::test_extract_special_args[config2-environ2-expected2] tests/unit/test_cli.py::test_extract_special_args[config3-environ3-expected3] tests/unit/test_cli.py::test_extract_special_args[config4-environ4-expected4] tests/unit/test_cli.py::test_extract_special_args[config5-environ5-expected5] tests/unit/test_cli.py::test_extract_special_args[config6-environ6-expected6] tests/unit/test_cli.py::test_extract_special_args[config7-environ7-expected7] tests/unit/test_client_base.py::test_vault_client_base_call_init_client tests/unit/test_client_base.py::test_vault_client_base_authenticate[test_kwargs0-expected0] tests/unit/test_client_base.py::test_vault_client_base_authenticate[test_kwargs1-expected1] tests/unit/test_client_base.py::test_vault_client_base_authenticate[test_kwargs2-expected2] tests/unit/test_client_base.py::test_vault_client_base_username_without_password tests/unit/test_client_base.py::test_vault_client_base_login_cert_without_key tests/unit/test_client_base.py::test_vault_client_base_no_auth tests/unit/test_client_hvac.py::test_get_secret_no_verify tests/unit/test_settings.py::test_read_config_file_empty
tests/unit/test_client_base.py::test_get_client_class tests/unit/test_client_base.py::test_vault_api_exception[None-Unexpected tests/unit/test_client_base.py::test_vault_api_exception[errors1-Unexpected tests/unit/test_client_hvac.py::test_handle_errors[Forbidden-VaultForbidden] tests/unit/test_client_hvac.py::test_handle_errors[InvalidRequest-VaultInvalidRequest] tests/unit/test_client_hvac.py::test_handle_errors[Unauthorized-VaultUnauthorized] tests/unit/test_client_hvac.py::test_handle_errors[InternalServerError-VaultInternalServerError] tests/unit/test_client_hvac.py::test_handle_errors[VaultDown-VaultSealed] tests/unit/test_client_hvac.py::test_handle_errors[UnexpectedError-VaultAPIException] tests/unit/test_client_hvac.py::test_handle_error_json tests/unit/test_settings.py::test_read_config_file_not_existing tests/unit/test_settings.py::test_read_config_file_other_error tests/unit/test_settings.py::test_read_config_file tests/unit/test_settings.py::test_dash_to_underscores tests/unit/test_settings.py::test_read_all_files_no_file tests/unit/test_settings.py::test_read_all_files tests/unit/test_settings.py::test_load_bool[true-True] tests/unit/test_settings.py::test_load_bool[True-True0] tests/unit/test_settings.py::test_load_bool[True-True1] tests/unit/test_settings.py::test_load_bool[t-True] tests/unit/test_settings.py::test_load_bool[T-True] tests/unit/test_settings.py::test_load_bool[1-True] tests/unit/test_settings.py::test_load_bool[yes-True] tests/unit/test_settings.py::test_load_bool[YES-True] tests/unit/test_settings.py::test_load_bool[y-True] tests/unit/test_settings.py::test_load_bool[false-False] tests/unit/test_settings.py::test_load_bool[False-False] tests/unit/test_settings.py::test_load_bool[FALSE-False] tests/unit/test_settings.py::test_load_bool[f-False] tests/unit/test_settings.py::test_load_bool[F-False] tests/unit/test_settings.py::test_load_bool[0-False] tests/unit/test_settings.py::test_load_bool[no-False] tests/unit/test_settings.py::test_load_bool[NO-False] tests/unit/test_settings.py::test_load_bool[n-False] tests/unit/test_settings.py::test_load_bool[N-False] tests/unit/test_settings.py::test_load_bool_wrong tests/unit/test_settings.py::test_build_config_from_env[value0-expected0] tests/unit/test_settings.py::test_build_config_from_env[value1-expected1] tests/unit/test_settings.py::test_build_config_from_env[value2-expected2] tests/unit/test_settings.py::test_build_config_from_env[value3-expected3] tests/unit/test_settings.py::test_build_config_from_env[value4-expected4] tests/unit/test_settings.py::test_build_config_from_env[value5-expected5]
dev_docker_config/certs/client.crt dev_docker_config/certs/server.key dev_docker_config/certs/client.pem dev_docker_config/config.hcl dev_docker_config/certs/root.srl vault_cli/client.py vault_cli/cli.py dev_docker_config/policy.hcl dev_docker_config/certs/server.crt dev-env dev_docker_config/certs/client.key dev_docker_config/certs/server-chain.crt .vault.token.yml dev_docker_config/certs/client-chain.crt .vault.cert.yml CONTRIBUTING.md dev_docker_config/certs/server.pem dev_docker_config/certs/root.crt vault_cli/settings.py README.md dev_docker_config/certs/client.csr dev_docker_config/generate-certificates.sh .vault.userpass.yml dev_docker_config/vault-post-startup.sh .travis.yml docker-compose.yml dev_docker_config/certs/root.key dev_docker_config/vault-startup.sh dev_docker_config/certs/server.csr
dev_docker_config/certs/client.crt dev_docker_config/certs/server.key dev_docker_config/certs/client.pem dev_docker_config/config.hcl dev_docker_config/certs/root.srl vault_cli/client.py vault_cli/cli.py dev_docker_config/policy.hcl dev_docker_config/certs/server.crt dev-env dev_docker_config/certs/client.key dev_docker_config/certs/server-chain.crt .vault.token.yml dev_docker_config/certs/client-chain.crt .vault.cert.yml CONTRIBUTING.md dev_docker_config/certs/server.pem dev_docker_config/certs/root.crt vault_cli/settings.py README.md dev_docker_config/certs/client.csr dev_docker_config/generate-certificates.sh .vault.userpass.yml dev_docker_config/vault-post-startup.sh .travis.yml docker-compose.yml dev_docker_config/certs/root.key dev_docker_config/vault-startup.sh dev_docker_config/certs/server.csr