Skip to content

Commit 7b1f4a4

Browse files
authored
Added example for custom claims (smallstep#39)
Add docs and examples for custom claims
1 parent 6b6d61d commit 7b1f4a4

File tree

3 files changed

+228
-54
lines changed

3 files changed

+228
-54
lines changed

docs/GETTING_STARTED.md

+74
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,80 @@ $ bin/step ca provisioner remove jim@smallstep.com --all
379379
The same entity may have multiple provisioners for authorizing different
380380
types of certs. Each of these provisioners must have unique keys.
381381
382+
## Use Custom Claims for Provisioners to Control Certificate Validity etc
383+
384+
It's possible to configure provisioners on the CA to issue certs using propoerties specific to their target environments. Most commonly different validity periods and disabling renewals for certs. Here's how:
385+
386+
```bash
387+
$ step ca init
388+
# complete the init steps
389+
$ step ca provisioner add --create dev@smallstep.com
390+
# lets create a provisioner for dev certs
391+
Please enter a password to encrypt the provisioner private key? password
392+
# add claims inside a provisioner element in ~/.step/config/ca.json
393+
~/.step/config/ca.json
394+
[...]
395+
"authority": {
396+
"provisioners": [
397+
{
398+
"name": "you@smallstep.com",
399+
"type": "jwk",
400+
"key": {
401+
"use": "sig",
402+
"kty": "EC",
403+
"kid": "Kg43gSukHnl8f5NztLPDxqpz_9TNUILnMrIMIa70jOU",
404+
"crv": "P-256",
405+
"alg": "ES256",
406+
"x": "So0JVWFFXo-6GmDwq6WWZZk-AFZt5GKTx5PzdLhdsrQ",
407+
"y": "kVz8pCl2Qx9fZmJZhXGrHpufwNDTp7oHwi8Zaj7rhiQ"
408+
},
409+
"encryptedKey": "...",
410+
+ "claims": {
411+
+ "minTLSCertDuration": "5s",
412+
+ "maxTLSCertDuration": "12h",
413+
+ "defaultTLSCertDuration": "2h",
414+
+ "disableRenewal": true
415+
+ }
416+
}
417+
]
418+
},
419+
[...]
420+
421+
# launch CA...
422+
$ step-ca $(step path)/config/ca.json
423+
Please enter the password to decrypt ~/.step/secrets/intermediate_ca_key: password
424+
2019/02/21 12:09:51 Serving HTTPS on :9443 ...
425+
```
426+
427+
Please [`step ca provisioner`](https://smallstep.com/docs/cli/ca/provisioner/)'s docs for details on all available claims properties. The durations are strings which are a sequence of decimal numbers, each with optional fraction and a unit suffix, such as "300ms" or "2h45m". Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
428+
429+
Now certs issued by the `dev@smallstep.com` provisioner will be valid for two hours and deny renewals. Command line flags allow validity extension up to 12h, please see [`step ca certificate`](https://smallstep.com/docs/cli/ca/certificate/)'s docs for details.
430+
431+
```bash
432+
# grab a cert, will also work with 'step ca token' flow
433+
$ step ca certificate localhost site.crt site.key
434+
Use the arrow keys to navigate: ↓ ↑ → ←
435+
What provisioner key do you want to use?
436+
IY7gYg_cDKmXtcs1sbhdBDDb9K9YvLO5aHzArjaayso (sebastian@smallstep.com)
437+
▸ uBYWYDCpeJu_IYzMGPZ1LJJTdlaiJQfdpkOVewbjy-8 (dev@smallstep.com)
438+
439+
✔ Please enter the password to decrypt the provisioner key: password
440+
✔ CA: https://ca.smallstep.com:9443/1.0/sign
441+
✔ Certificate: site.crt
442+
✔ Private Key: site.key
443+
444+
$ step certificate inspect site.crt --format json | jq .validity
445+
{
446+
"start": "2019-02-21T20:19:06Z",
447+
"end": "2019-02-21T22:19:06Z",
448+
"length": 7200
449+
}
450+
451+
# renewals will be denied for certs issued by this provisioner
452+
$ step ca renew site.crt site.key
453+
error renewing certificate: Unauthorized
454+
```
455+
382456
## Notes on Securing the Step CA and your PKI.
383457

384458
In this section we recommend a few best practices when it comes to

examples/README.md

+63
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,69 @@ Hello kube_client (cert issued by 'Smallstep Kubernetes Root CA') at 2019-01-28
555555

556556
Since the demo server is enrolled with the federated `Cloud CA` that trusts certs issued by the `Kubernetes CA` through federation the connection is successfully established.
557557

558+
## Custom certificate validity periods using Custom Claims
559+
560+
Bring up the certificate authority with the example:
561+
562+
```sh
563+
certificates $ step-ca examples/pki/config/ca.json
564+
2019/03/11 13:37:03 Serving HTTPS on :9000 ...
565+
```
566+
567+
The example comes with multiple provisioner options, two of which have custom claims to expand the validity of certificates:
568+
569+
```sh
570+
$ step ca provisioner list | jq '.[] | "\(.name): \(.claims.defaultTLSCertDuration)"'
571+
# null means step default of 24h for cert validity
572+
"mariano@smallstep.com: null"
573+
"mike@smallstep.com: 2m0s"
574+
"decade: 87600h0m0s"
575+
"90days: 2160h0m0s"
576+
```
577+
578+
A closer look at a duration-bound provisioner, `90days` for instance, reveals the custom configuration for certificate validity.
579+
580+
```sh
581+
$ step ca provisioner list | jq '.[3].claims'
582+
{
583+
"maxTLSCertDuration": "2160h0m0s",
584+
"defaultTLSCertDuration": "2160h0m0s"
585+
}
586+
```
587+
588+
Certificates with different validity periods can be generated using the respective provisioners.
589+
The durations are strings which are a sequence of decimal numbers, each with optional fraction and a unit suffix, such as "300ms" or "2h45m". Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
590+
591+
Please see [Getting Started](https://github.com/smallstep/certificates/blob/master/docs/GETTING_STARTED.md) in the docs directory to learn what custom claims configuration options are available and how to use them.
592+
593+
```sh
594+
$ step ca certificate decade decade.crt decade.key
595+
✔ Key ID: iu7VZxKUcquv1BCWuvEUOyRy4zYyCmgt61OpRW5VbRE (decade)
596+
✔ Please enter the password to decrypt the provisioner key: password
597+
✔ CA: https://localhost:9000/1.0/sign
598+
✔ Certificate: decade.crt
599+
✔ Private Key: decade.key
600+
$ step certificate inspect --format json decade.crt | jq .validity
601+
{
602+
"start": "2019-03-11T22:34:30Z",
603+
"end": "2029-03-08T22:34:30Z",
604+
"length": 315360000
605+
}
606+
607+
$ step ca certificate 90days 90days.crt 90days.key
608+
✔ Key ID: 2LgjIvfirblnFMC6FjUr8jYkO8nOqz4rKoarCc8kiGU (90days)
609+
✔ Please enter the password to decrypt the provisioner key: password
610+
✔ CA: https://localhost:9000/1.0/sign
611+
✔ Certificate: 90days.crt
612+
✔ Private Key: 90days.key
613+
$ step certificate inspect --format json 90days.crt | jq .validity
614+
{
615+
"start": "2019-03-11T22:35:39Z",
616+
"end": "2019-06-09T22:35:39Z",
617+
"length": 7776000
618+
}
619+
```
620+
558621
## Configuration Management Tools
559622

560623
Configuration management tools such as Puppet, Chef, Ansible, Salt, etc. make

examples/pki/config/ca.json

+91-54
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,95 @@
11
{
2-
"root": "examples/pki/secrets/root_ca.crt",
3-
"crt": "examples/pki/secrets/intermediate_ca.crt",
4-
"key": "examples/pki/secrets/intermediate_ca_key",
5-
"password": "password",
6-
"address": ":9000",
7-
"dnsNames": [
8-
"localhost"
9-
],
10-
"logger": {
11-
"format": "text"
12-
},
13-
"authority": {
14-
"provisioners": [
15-
{
16-
"name": "mariano@smallstep.com",
17-
"type": "jwk",
18-
"key": {
19-
"use": "sig",
20-
"kty": "EC",
21-
"kid": "DmAtZt2EhmZr_iTJJ387fr4Md2NbzMXGdXQNW1UWPXk",
22-
"crv": "P-256",
23-
"alg": "ES256",
24-
"x": "jXoO1j4CXxoTC32pNzkVC8l6k2LfP0k5ndhJZmcdVbk",
25-
"y": "c3JDL4GTFxJWHa8EaHdMh4QgwMh64P2_AGWrD0ADXcI"
2+
"root": "examples/pki/secrets/root_ca.crt",
3+
"federatedRoots": null,
4+
"crt": "examples/pki/secrets/intermediate_ca.crt",
5+
"key": "examples/pki/secrets/intermediate_ca_key",
6+
"address": ":9000",
7+
"dnsNames": [
8+
"localhost"
9+
],
10+
"logger": {
11+
"format": "text"
12+
},
13+
"authority": {
14+
"provisioners": [
15+
{
16+
"type": "jwk",
17+
"name": "mariano@smallstep.com",
18+
"key": {
19+
"use": "sig",
20+
"kty": "EC",
21+
"kid": "DmAtZt2EhmZr_iTJJ387fr4Md2NbzMXGdXQNW1UWPXk",
22+
"crv": "P-256",
23+
"alg": "ES256",
24+
"x": "jXoO1j4CXxoTC32pNzkVC8l6k2LfP0k5ndhJZmcdVbk",
25+
"y": "c3JDL4GTFxJWHa8EaHdMh4QgwMh64P2_AGWrD0ADXcI"
26+
},
27+
"encryptedKey": "eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjdHkiOiJqd2sranNvbiIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjEwMDAwMCwicDJzIjoiOTFVWjdzRGw3RlNXcldfX1I1NUh3USJ9.FcWtrBDNgrkA33G9Ll9sXh1cPF-3jVXeYe1FLmSDc_Q2PmfLOPvJOA.0ZoN32ayaRWnufJb.WrkffMmDLWiq1-2kn-w7-kVBGW12gjNCBHNHB1hyEdED0rWH1YWpKd8FjoOACdJyLhSn4kAS3Lw5AH7fvO27A48zzvoxZU5EgSm5HG9IjkIH-LBJ-v79ShkpmPylchgjkFhxa5epD11OIK4rFmI7s-0BCjmJokLR_DZBhDMw2khGnsr_MEOfAz9UnqXaQ4MIy8eT52xUpx68gpWFlz2YP3EqiYyNEv0PpjMtyP5lO2i8-p8BqvuJdus9H3fO5Dg-1KVto1wuqh4BQ2JKTauv60QAnM_4sdxRHku3F_nV64SCrZfDvnN2ve21raFROtyXaqHZhN6lyoPxDncy8v4.biaOblEe0N-gMpJyFZ-3-A"
28+
},
29+
{
30+
"type": "jwk",
31+
"name": "mike@smallstep.com",
32+
"key": {
33+
"use": "sig",
34+
"kty": "EC",
35+
"kid": "YYNxZ0rq0WsT2MlqLCWvgme3jszkmt99KjoGEJJwAKs",
36+
"crv": "P-256",
37+
"alg": "ES256",
38+
"x": "LsI8nHBflc-mrCbRqhl8d3hSl5sYuSM1AbXBmRfznyg",
39+
"y": "F99LoOvi7z-ZkumsgoHIhodP8q9brXe4bhF3szK-c_w"
40+
},
41+
"encryptedKey": "eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjdHkiOiJqd2sranNvbiIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjEwMDAwMCwicDJzIjoiVERQS2dzcEItTUR4ZDJxTGo0VlpwdyJ9.2_j0cZgTm2eFkZ-hrtr1hBIvLxN0w3TZhbX0Jrrq7vBMaywhgFcGTA.mCasZCbZJ-JT7vjA.bW052WDKSf_ueEXq1dyxLq0n3qXWRO-LXr7OzBLdUKWKSBGQrzqS5KJWqdUCPoMIHTqpwYvm-iD6uFlcxKBYxnsAG_hoq_V3icvvwNQQSd_q7Thxr2_KtPIDJWNuX1t5qXp11hkgb-8d5HO93CmN7xNDG89pzSUepT6RYXOZ483mP5fre9qzkfnrjx3oPROCnf3SnIVUvqk7fwfXuniNsg3NrNqncHYUQNReiq3e9I1R60w0ZQTvIReY7-zfiq7iPgVqmu5I7XGgFK4iBv0L7UOEora65b4hRWeLxg5t7OCfUqrS9yxAk8FdjFb9sEfjopWViPRepB0dYPH8dVI.fb6-7XWqp0j6CR9Li0NI-Q",
42+
"claims": {
43+
"minTLSCertDuration": "1m0s",
44+
"defaultTLSCertDuration": "2m0s"
45+
}
46+
},
47+
{
48+
"type": "jwk",
49+
"name": "decade",
50+
"key": {
51+
"use": "sig",
52+
"kty": "EC",
53+
"kid": "iu7VZxKUcquv1BCWuvEUOyRy4zYyCmgt61OpRW5VbRE",
54+
"crv": "P-256",
55+
"alg": "ES256",
56+
"x": "PExnlmHxnnfpvp4bznMKbA6L_9Bk9ZhtsmvbOwh9Kys",
57+
"y": "rrMPGvxscRzDdOYtZ1wsxeQjuuFl0nSzkwTHV_P-K-Y"
2658
},
27-
"encryptedKey": "eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjdHkiOiJqd2sranNvbiIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjEwMDAwMCwicDJzIjoiOTFVWjdzRGw3RlNXcldfX1I1NUh3USJ9.FcWtrBDNgrkA33G9Ll9sXh1cPF-3jVXeYe1FLmSDc_Q2PmfLOPvJOA.0ZoN32ayaRWnufJb.WrkffMmDLWiq1-2kn-w7-kVBGW12gjNCBHNHB1hyEdED0rWH1YWpKd8FjoOACdJyLhSn4kAS3Lw5AH7fvO27A48zzvoxZU5EgSm5HG9IjkIH-LBJ-v79ShkpmPylchgjkFhxa5epD11OIK4rFmI7s-0BCjmJokLR_DZBhDMw2khGnsr_MEOfAz9UnqXaQ4MIy8eT52xUpx68gpWFlz2YP3EqiYyNEv0PpjMtyP5lO2i8-p8BqvuJdus9H3fO5Dg-1KVto1wuqh4BQ2JKTauv60QAnM_4sdxRHku3F_nV64SCrZfDvnN2ve21raFROtyXaqHZhN6lyoPxDncy8v4.biaOblEe0N-gMpJyFZ-3-A"
28-
},
29-
{
30-
"name": "mike@smallstep.com",
31-
"type": "jwk",
32-
"key": {
33-
"use": "sig",
34-
"kty": "EC",
35-
"kid": "YYNxZ0rq0WsT2MlqLCWvgme3jszkmt99KjoGEJJwAKs",
36-
"crv": "P-256",
37-
"alg": "ES256",
38-
"x": "LsI8nHBflc-mrCbRqhl8d3hSl5sYuSM1AbXBmRfznyg",
39-
"y": "F99LoOvi7z-ZkumsgoHIhodP8q9brXe4bhF3szK-c_w"
59+
"claims": {
60+
"maxTLSCertDuration": "87600h",
61+
"defaultTLSCertDuration": "87600h"
4062
},
41-
"encryptedKey": "eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjdHkiOiJqd2sranNvbiIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjEwMDAwMCwicDJzIjoiVERQS2dzcEItTUR4ZDJxTGo0VlpwdyJ9.2_j0cZgTm2eFkZ-hrtr1hBIvLxN0w3TZhbX0Jrrq7vBMaywhgFcGTA.mCasZCbZJ-JT7vjA.bW052WDKSf_ueEXq1dyxLq0n3qXWRO-LXr7OzBLdUKWKSBGQrzqS5KJWqdUCPoMIHTqpwYvm-iD6uFlcxKBYxnsAG_hoq_V3icvvwNQQSd_q7Thxr2_KtPIDJWNuX1t5qXp11hkgb-8d5HO93CmN7xNDG89pzSUepT6RYXOZ483mP5fre9qzkfnrjx3oPROCnf3SnIVUvqk7fwfXuniNsg3NrNqncHYUQNReiq3e9I1R60w0ZQTvIReY7-zfiq7iPgVqmu5I7XGgFK4iBv0L7UOEora65b4hRWeLxg5t7OCfUqrS9yxAk8FdjFb9sEfjopWViPRepB0dYPH8dVI.fb6-7XWqp0j6CR9Li0NI-Q",
63+
"encryptedKey": "eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjdHkiOiJqd2sranNvbiIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjEwMDAwMCwicDJzIjoiZS1OVzRaZlBUNjFCUmR1bjJyNk9OZyJ9.zjToJ_Od6RIzVmo0cnmLZ69am410ftfBW594qNt60KmKX6JEWUufhA.kSrC74fKK3CkqiNS.G-oUqQhYMFIKuSj8thg9B5TeiaIMsQ-o_PTxIZE-Qb8TDU15ehPAsuIQmnbM6dSpkSGCmZgHTscp3xgLyv6QEBBjUHBpLwciWyipj1KBZDKSgLKeV6G2NiVBMETOaD1DsX3DxrHM-K3T1chXJFMJfkDSx1OEtaVfzqVYLyvNb5y_26oeRNSNYuTLzOrk6Ebr6KJE6lSWpvu1dtOrDAhTErouC56EQu2fTeDCa9eN50iRs4OjmF6FtBlR63h6FkvbmjJWC3zbIOe2RXRQx0Po6_dnKXSIqs7JMZSBerlgw6jzHme8YvqBqc2Ccy4Y4gJ23nwLkcsOVuFNdk6Nb7s.SB296DDrS-Wi4a9x_TGv4A"
64+
},
65+
{
66+
"type": "jwk",
67+
"name": "90days",
68+
"key": {
69+
"use": "sig",
70+
"kty": "EC",
71+
"kid": "2LgjIvfirblnFMC6FjUr8jYkO8nOqz4rKoarCc8kiGU",
72+
"crv": "P-256",
73+
"alg": "ES256",
74+
"x": "iHFHMN91iFUDLh2LweFj6o0gDJ-pdmBY4IFIBNfUqd4",
75+
"y": "Yfym7KtzZQaQc1gQoT81ggNBPvAdV_0CW0A5mQgOsOc"
76+
},
4277
"claims": {
43-
"minTLSCertDuration": "60s",
44-
"defaultTLSCertDuration": "120s"
45-
}
46-
}
47-
]
48-
},
49-
"tls": {
50-
"cipherSuites": [
51-
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305",
52-
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
53-
],
54-
"minVersion": 1.2,
55-
"maxVersion": 1.2,
56-
"renegotiation": false
57-
}
58-
}
78+
"maxTLSCertDuration": "2160h",
79+
"defaultTLSCertDuration": "2160h"
80+
},
81+
"encryptedKey": "eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjdHkiOiJqd2sranNvbiIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjEwMDAwMCwicDJzIjoiYk9XV0ZUN29uZldtZTdvbzdCMFZOdyJ9.p3gs2xd-Bdtwz1WGzQUZrcZeA8mpaMn_R_wTInpzZ9G1vIeRk-9T4g.RQNXmZP8uAzF1n8b.WpLqmNV_I0RIetdID2ag-igZryM8ekSimaHrXKoEpRAlBdBDZC-9qkbrJPNcTPRUi-29iZiBxKQ-0GX7ytiyulrQl7UfxUSrtT5vjhJEthSOGYXAOerUAnodGjpLCtIueTwVl6KJA2bXUapUd9xFn3DXfVgFagwqo1MrXKuIR0R5A4sjmEx8d2Kn_KQr0ZNnSOaAod2os4tmh3A87u9Jb51FMxhP-8Qbn7ff-RXwT_015C64Ux1zzS-ok89XbTgyfGxkah0-fVFAgS0zosHLI3C_pvumcglmFXZz7otH596BAU_QkqME6X-PGte6j6eldFobP_96tBxOhIRgVKw.Ky4xLbQZEGaBPjGJnKurng"
82+
}
83+
]
84+
},
85+
"tls": {
86+
"cipherSuites": [
87+
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305",
88+
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"
89+
],
90+
"minVersion": 1.2,
91+
"maxVersion": 1.2,
92+
"renegotiation": false
93+
},
94+
"password": "password"
95+
}

0 commit comments

Comments
 (0)