first pass at README
This commit is contained in:
parent
fb3a54e3ff
commit
e8baba3e30
3 changed files with 375 additions and 1 deletions
13
CHANGELOG.md
Normal file
13
CHANGELOG.md
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# Changelog
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||||
|
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [Unreleased - 0.0.1] - DATE
|
||||||
|
### Added
|
||||||
|
### Changed
|
||||||
|
### Deprecated
|
||||||
|
### Removed
|
||||||
|
### Fixed
|
||||||
|
### Security
|
247
README.md
247
README.md
|
@ -1 +1,246 @@
|
||||||
## SHHHH, THIS PROJECT HASN'T OFFICIALLY LAUNCHED YET AND THIS REPO IS SUPER SECRET!!!
|
# SHHHH, THIS PROJECT HASN'T OFFICIALLY LAUNCHED YET AND THIS REPO IS SUPER SECRET!!!
|
||||||
|
|
||||||
|
# Step Certificates
|
||||||
|
|
||||||
|
An online certificate authority and related tools for secure automated
|
||||||
|
certificate management, so you can use TLS everywhere.
|
||||||
|
|
||||||
|
For more information and docs see [the Step website](https://smallstep.com/cli/)
|
||||||
|
and the [blog post](https://smallstep.com/blog/zero-trust-swiss-army-knife.html)
|
||||||
|
announcing Step Certificate Authority.
|
||||||
|
|
||||||
|
### Table of Contents
|
||||||
|
|
||||||
|
- [Installing](#installing)
|
||||||
|
- [Documentation](#documentation)
|
||||||
|
- [Terminology](#terminology)
|
||||||
|
- [Getting Started](#getting-started)
|
||||||
|
- [I've Got a Running CA! Now What?](#now-what)
|
||||||
|
- [Versioning](#versioning)
|
||||||
|
- [How To Create A New Release](./distribution.md)
|
||||||
|
- [LICENSE](./LICENSE)
|
||||||
|
- [CHANGELOG](./CHANGELOG.md)
|
||||||
|
|
||||||
|
## Installing
|
||||||
|
|
||||||
|
These instructions will install an OS specific version of the `step` binary on
|
||||||
|
your local machine.
|
||||||
|
|
||||||
|
### Mac OS
|
||||||
|
|
||||||
|
Install `step-ca` via [Homebrew](https://brew.sh/):
|
||||||
|
|
||||||
|
```
|
||||||
|
brew install smallstep/smallstep/step-ca
|
||||||
|
```
|
||||||
|
|
||||||
|
### Linux
|
||||||
|
|
||||||
|
Download the latest Debian package from [releases](https://github.com/smallstep/certificates/releases):
|
||||||
|
|
||||||
|
```
|
||||||
|
wget https://github.com/smallstep/certificates/releases/download/X.Y.Z/step_X.Y.Z_amd64.deb
|
||||||
|
```
|
||||||
|
|
||||||
|
Install the Debian package:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo dpkg -i step-ca_X.Y.Z_amd64.deb
|
||||||
|
```
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
Documentation can be found in three places:
|
||||||
|
|
||||||
|
1. On the command line with `step ca help xxx` where `xxx` is the subcommand you are interested in. Ex: `step help ca provisioners list`
|
||||||
|
|
||||||
|
2. On the web at https://smallstep.com/docs/step-ca
|
||||||
|
|
||||||
|
3. In your browser with `step ca help --http :8080` and visiting http://localhost:8080
|
||||||
|
|
||||||
|
## Terminology
|
||||||
|
|
||||||
|
### PKI - Public Key Infrastructure
|
||||||
|
|
||||||
|
Blah blah
|
||||||
|
|
||||||
|
### Provisioners
|
||||||
|
|
||||||
|
Provisioners are people or code that are registered with the CA and authorized
|
||||||
|
to issue "provisioning tokens". Provisioning tokens are single use tokens that
|
||||||
|
can be used to authenticate with the CA and get a certificate.
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
Demonstrates setting up your own PKI and certificate authority using `step ca`
|
||||||
|
and getting certificates using the `step` command line tool and SDK.
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
|
||||||
|
1. [Step Cli](https://github.com/smallstep/cli/README.md#installing)
|
||||||
|
|
||||||
|
2. [Step CA](#installing)
|
||||||
|
|
||||||
|
### Initializing PKI and configuring the Certificate Authority
|
||||||
|
|
||||||
|
To initialize a PKI and configure the Step Certificate Authority run:
|
||||||
|
|
||||||
|
```
|
||||||
|
step ca init
|
||||||
|
```
|
||||||
|
|
||||||
|
You'll be asked for a name for your PKI. This name will appear in your CA
|
||||||
|
certificates. It doesn't really matter what you choose. The name of your
|
||||||
|
organization or your project will suffice.
|
||||||
|
|
||||||
|
If you run:
|
||||||
|
|
||||||
|
```
|
||||||
|
tree .
|
||||||
|
```
|
||||||
|
|
||||||
|
You should see:
|
||||||
|
|
||||||
|
```
|
||||||
|
...
|
||||||
|
├── config
|
||||||
|
│ └── ca.json
|
||||||
|
└── secrets
|
||||||
|
├── intermediate_ca.crt
|
||||||
|
├── intermediate_ca_key
|
||||||
|
├── root_ca.crt
|
||||||
|
├── root_ca_key
|
||||||
|
```
|
||||||
|
|
||||||
|
The files created include:
|
||||||
|
|
||||||
|
* `root_ca.crt` and `root_ca_key`: the root certificate and private key for
|
||||||
|
your PKI
|
||||||
|
* `intermediate_ca.crt` and `intermediate_ca_key`: the intermediate certificate
|
||||||
|
and private key that will be used to sign leaf certificates
|
||||||
|
* `ca.json`: the configuration file necessary for running the Step CA.
|
||||||
|
|
||||||
|
All of the files endinging in `_key` are password protected using the password
|
||||||
|
you chose during PKI initialization.
|
||||||
|
|
||||||
|
### What's Inside `ca.json`?
|
||||||
|
|
||||||
|
`ca.json` is responsible for configuring communication, authorization, and
|
||||||
|
default new certificate values for the Step CA. Below is a short list of
|
||||||
|
definitions and descriptions of available configuration attributes.
|
||||||
|
|
||||||
|
* `root`: location of the root certificate on the filesystem. The root certificate
|
||||||
|
is used to mutually authenticate all api clients of the CA.
|
||||||
|
|
||||||
|
* `crt`: location of the intermediate certificate on the filesystem. The
|
||||||
|
intermediate certificate is returned alongside each new certificate,
|
||||||
|
allowing the client to complete the certificate chain.
|
||||||
|
|
||||||
|
* `key`: location of the intermediate private key on the filesystem. The
|
||||||
|
intermediate key signs all new certificates generated by the CA.
|
||||||
|
|
||||||
|
* `password`: optionally store the password for decrypting the intermediate private
|
||||||
|
key (this should be the same password you chose during PKI initialization). If
|
||||||
|
the value is not stored in configuration then you will be prompted for it when
|
||||||
|
starting the CA.
|
||||||
|
|
||||||
|
* `address`: e.g. `127.0.0.1:8080` - address and port on which the CA will bind
|
||||||
|
and respond to requests.
|
||||||
|
|
||||||
|
* `dnsNames`: comma separated list of DNS Name(s) for the CA.
|
||||||
|
|
||||||
|
* `logger`: the default logging format for the CA is `text`. The other options
|
||||||
|
is `json`.
|
||||||
|
|
||||||
|
* `tls`: settings for negotiating communication with the CA; includes acceptable
|
||||||
|
ciphersuites, min/max TLS version, etc.
|
||||||
|
|
||||||
|
* `authority`: controls the request authorization and signature processes.
|
||||||
|
|
||||||
|
- `template`: default ASN1DN values for new certificates.
|
||||||
|
|
||||||
|
- `claims`: default validation for requested attributes in the certificate request.
|
||||||
|
Can be overriden by similar claims objects defined by individual provisioners.
|
||||||
|
|
||||||
|
* `minTLSCertDuration`: do not allow certificates with a duration less
|
||||||
|
than this value.
|
||||||
|
|
||||||
|
* `maxTLSCertDuration`: do not allow certificates with a duration greater
|
||||||
|
than this value.
|
||||||
|
|
||||||
|
* `defaultTLSCertDuration`: if not certificat validity period is specified,
|
||||||
|
use this value.
|
||||||
|
|
||||||
|
* `disableIssuedAtCheck`: disable a check verifying that provisioning
|
||||||
|
tokens must be issued after the CA has booted. This is one prevention
|
||||||
|
against token reuse. The default value is `false`. Do not change this
|
||||||
|
unless you know what you are doing.
|
||||||
|
|
||||||
|
- `provisioners`: list of provisioners. Each provisioner has a `name`,
|
||||||
|
associated public/private keys, and an optional `claims` attribute that will
|
||||||
|
override any values set in the global `claims` directly underneath `authority`.
|
||||||
|
|
||||||
|
|
||||||
|
`step ca init` will generate one provisioner. New provisioners can be added by
|
||||||
|
running `step ca provisioner add`.
|
||||||
|
|
||||||
|
### Running the CA
|
||||||
|
|
||||||
|
To start the CA run:
|
||||||
|
|
||||||
|
```
|
||||||
|
step-ca $STEPPATH/config/ca.step
|
||||||
|
```
|
||||||
|
|
||||||
|
## [I've got a running CA! Now What?](#now-what)
|
||||||
|
|
||||||
|
Now that you have an online CA that authenticates requests before issuing
|
||||||
|
certificates you can begin automating the distribution and maintenance of your
|
||||||
|
PKI.
|
||||||
|
|
||||||
|
### Issuing x.509 certificates for TLS (HTTPS)
|
||||||
|
|
||||||
|
There are two steps to issuing a certificate at the command line:
|
||||||
|
|
||||||
|
1. Generate a provisioning token using your provisioning credentials.
|
||||||
|
2. Generate a CSR and exchange it, along with the provisioning token, for a certificate.
|
||||||
|
|
||||||
|
If you would like to generate a certificate from the command line, the Step CLI
|
||||||
|
provides a single command that will prompt you to select and decrypt an
|
||||||
|
authorized provisioner and then request a new certificate.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ step ca new-certificate "foo.example.com" foo.crt foo.key --ca-url ca.smallstep.com \
|
||||||
|
--root /path/to/root_ca.crt
|
||||||
|
```
|
||||||
|
|
||||||
|
If you would like to generate certificates on demand from an automated configuration
|
||||||
|
configuration management solution (no user input) you would split the above flow
|
||||||
|
into two commands.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ TOKEN=$(step ca new-token foo.example.com \
|
||||||
|
--kid 4vn46fbZT68Uxfs9LBwHkTvrjEvxQqx-W8nnE-qDjts \
|
||||||
|
--ca-url https://ca.example.com \
|
||||||
|
--root /path/to/root_ca.crt --password-file /path/to/provisioner/password)
|
||||||
|
|
||||||
|
$ step ca new-certificate "foo.example.com" foo.crt foo.key --token "$TOKEN" \
|
||||||
|
--ca-url https://ca.example.com --root /path/to/root_ca.crt
|
||||||
|
```
|
||||||
|
|
||||||
|
You can take a closer look at the contents of the certificate using `step certificate inspect`:
|
||||||
|
|
||||||
|
```
|
||||||
|
step certificate inspect foo.crt
|
||||||
|
```
|
||||||
|
|
||||||
|
## Versioning
|
||||||
|
|
||||||
|
We use [SemVer](http://semver.org/) for versioning. For the versions available,
|
||||||
|
see the [tags on this repository](https://github.com/smallstep/cli).
|
||||||
|
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This project is licensed under the MIT License - see the
|
||||||
|
[LICENSE](./LICENSE) file for details
|
||||||
|
|
116
distribution.md
Normal file
116
distribution.md
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
# Distribution
|
||||||
|
|
||||||
|
This section describes how to build and deploy publicly available releases of
|
||||||
|
the Step CLI.
|
||||||
|
|
||||||
|
## Creating A New Release
|
||||||
|
|
||||||
|
New releases are (almost) entirely built and deployed by Travis-CI. Creating a new
|
||||||
|
release is as simple as pushing a new github tag.
|
||||||
|
|
||||||
|
**Definitions**:
|
||||||
|
|
||||||
|
* *Standard Release*: ready for public use. no `-rc*` suffix on the version.
|
||||||
|
e.g. `v1.0.2`
|
||||||
|
* *Release Candidate*: not ready for public use, still testing. must have a
|
||||||
|
`-rc*` suffix. e.g. `v1.0.2-rc` or `v1.0.2-rc.4`
|
||||||
|
|
||||||
|
|
||||||
|
1. Figure out the most recent existing tag.
|
||||||
|
|
||||||
|
```
|
||||||
|
git fetch --tags
|
||||||
|
git tag
|
||||||
|
```
|
||||||
|
|
||||||
|
The new tag needs to be the logical successor of the most recent existing tag.
|
||||||
|
See [versioning](./README.md#versioning) section for more information on version numbers.
|
||||||
|
|
||||||
|
2. Select the next tag (but don't actually tag anything yet!!).
|
||||||
|
|
||||||
|
Is the new release a *release candidate* or a *standard release*?
|
||||||
|
|
||||||
|
1. Release Candidate
|
||||||
|
|
||||||
|
If the most recent tag is a standard release, say `v1.0.2`, then the version
|
||||||
|
of the next release candidate should be `v1.0.3-rc.1`. If the most recent tag
|
||||||
|
is a release candidate, say `v1.0.2-rc.3`, then the version of the next
|
||||||
|
release candidate should be `v1.0.2-rc.4`.
|
||||||
|
|
||||||
|
2. Standard Release
|
||||||
|
|
||||||
|
If the most recent tag is a standard release, say `v1.0.2`, then the version
|
||||||
|
of the next standard release should be `v1.0.3`. If the most recent tag
|
||||||
|
is a release candidate, say `v1.0.2-rc.3`, then the version of the next
|
||||||
|
standard release should be `v1.0.3`.
|
||||||
|
|
||||||
|
3. Update the [debian/changelog](./debian/changelog).
|
||||||
|
|
||||||
|
1. Update the version to match the tag selected in the previous step. Leave
|
||||||
|
off the `v` prefix.
|
||||||
|
|
||||||
|
```
|
||||||
|
step-cli (1.0.2) UNRELEASED; urgency=medium
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
becomes...
|
||||||
|
|
||||||
|
```
|
||||||
|
step-cli (1.0.3) UNRELEASED; urgency=medium
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Update the change log.
|
||||||
|
|
||||||
|
*sigh* Honestly, this entire step should be handled programmatically.
|
||||||
|
|
||||||
|
3. Commit the changes.
|
||||||
|
|
||||||
|
3. Update the remote origin with your commits.
|
||||||
|
|
||||||
|
Make sure that the local checkout is up to date with
|
||||||
|
with the remote origin and that all local changes have been pushed.
|
||||||
|
|
||||||
|
```
|
||||||
|
git pull --rebase origin master
|
||||||
|
git push
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Create a local tag.
|
||||||
|
|
||||||
|
```
|
||||||
|
git tag v1.0.3 # standard release
|
||||||
|
...or
|
||||||
|
git tag v1.0.3-rc.1 # release candidate
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Push the new tag to the remote origin.
|
||||||
|
|
||||||
|
```
|
||||||
|
git push origin tag v1.0.3 # standard release
|
||||||
|
...or
|
||||||
|
git push origin tag v1.0.3-rc.1 # release candidate
|
||||||
|
```
|
||||||
|
|
||||||
|
6. Check the build status at
|
||||||
|
[Travis-CI](https://travis-ci.com/smallstep/certificates/builds/).
|
||||||
|
|
||||||
|
Travis will begin by verifying that there are no compilation or linting errors
|
||||||
|
and then run the unit tests. Assuming all the checks have passed, Travis will
|
||||||
|
build Darwin and Linux artifacts (for easily installing `step`) and upload them
|
||||||
|
as part of the [Github Release](https://github.com/smallstep/certificates/releases).
|
||||||
|
|
||||||
|
Travis will build and upload the following artifacts:
|
||||||
|
|
||||||
|
* *step-ca_1.0.3_amd64.deb*: debian package for installation on linux.
|
||||||
|
* *step-ca_1.0.3_linux_amd64.tar.gz*: tarball containing a statically compiled linux binary.
|
||||||
|
* *step-ca_1.0.3_darwin_amd64.tar.gz*: tarball containing a statically compiled darwin binary.
|
||||||
|
|
||||||
|
7. Update the Homebrew formula.
|
||||||
|
|
||||||
|
**NOTE**: this only needs to be done for standard releases.
|
||||||
|
|
||||||
|
Follow the steps [here](https://github.com/smallstep/homebrew-smallstep#how-to-update-the-formula).
|
||||||
|
|
||||||
|
*All Done!*
|
Loading…
Reference in a new issue