mirror of https://github.com/istio/istio.io.git
Add task on plugging existing key/cert into Istio CA (#695)
* Add task on plugging existing key/cert into Istio CA * Small fixes. * Small fix. * Add verification steps.
This commit is contained in:
parent
e0d4759e24
commit
4a2931459f
|
|
@ -0,0 +1,147 @@
|
|||
---
|
||||
title: Plugging in CA certificate and key
|
||||
overview: This task shows how operators can plug existing certificate and key into Istio CA.
|
||||
|
||||
order: 40
|
||||
|
||||
layout: docs
|
||||
type: markdown
|
||||
---
|
||||
{% include home.html %}
|
||||
|
||||
This task shows how operators can plug existing certificate and key into Istio CA.
|
||||
|
||||
By default, the Istio CA generates self-signed CA certificate and key and uses them to sign the workload certificates.
|
||||
The Istio CA can also use the operator-specified certificate and key to sign workload certificates.
|
||||
This task demonstrates an example to plug certificate and key into the Istio CA.
|
||||
|
||||
## Before you begin
|
||||
|
||||
* Set up Istio on auth-enabled Kubernetes by following the instructions in the
|
||||
[quick start]({{home}}/docs/setup/kubernetes/quick-start.html).
|
||||
Note that authentication should be enabled at step 4 in the
|
||||
[installation steps]({{home}}/docs/setup/kubernetes/quick-start.html#installation-steps).
|
||||
|
||||
## Plugging in the existing certificate and key
|
||||
|
||||
Suppose we want to have Istio CA use the existing certificate `ca-cert.pem` and key `ca-key.pem`.
|
||||
Furthermore, the certificate `ca-cert.pem` is signed by the root certificate `root-cert.pem`,
|
||||
and we would like to use `root-cert.pem` as the root certificate for Istio workloads.
|
||||
|
||||
In this example, because the Istio CA certificate (`ca-cert.pem`) is not set as the workloads' root certificate (`root-cert.pem`),
|
||||
the workload cannot validate the workload certificates directly from the root certificate.
|
||||
The workload needs a `cert-chain.pem` file to specify the chain of trust,
|
||||
which should include the certificates of all the intermediate CAs between the workloads and the root CA.
|
||||
In this example, it only contains the Istio CA certificate, so `cert-chain.pem` is the same as `ca-cert.pem`.
|
||||
Note that if your `ca-cert.pem` is the same as `root-cert.pem`, you can have an empty `cert-chain.pem` file.
|
||||
|
||||
Download the example files:
|
||||
```bash
|
||||
wget -P /tmp https://raw.githubusercontent.com/istio/istio/master/security/samples/plugin_ca_certs/ca-cert.pem
|
||||
wget -P /tmp https://raw.githubusercontent.com/istio/istio/master/security/samples/plugin_ca_certs/ca-key.pem
|
||||
wget -P /tmp https://raw.githubusercontent.com/istio/istio/master/security/samples/plugin_ca_certs/root-cert.pem
|
||||
wget -P /tmp https://raw.githubusercontent.com/istio/istio/master/security/samples/plugin_ca_certs/cert-chain.pem
|
||||
```
|
||||
|
||||
The following steps enable plugging in the certificate and key into the Istio CA:
|
||||
1. Create a secret `cacert` including all the input files `ca-cert.pem`, `ca-key.pem`, `root-cert.pem` and `cert-chain.pem`:
|
||||
```bash
|
||||
kubectl create secret generic cacerts -n istio-system --from-file=/tmp/ca-cert.pem --from-file=/tmp/ca-key.pem \
|
||||
--from-file=/tmp/root-cert.pem --from-file=/tmp/cert-chain.pem
|
||||
```
|
||||
|
||||
1. Redeploy the Istio CA, which reads the certificates and key from the secret-mount files:
|
||||
```bash
|
||||
kubectl apply -f install/kubernetes/istio-ca-plugin-certs.yaml
|
||||
```
|
||||
|
||||
1. To make sure the workloads obtain the new certificates promptly,
|
||||
delete the secrets generated by Istio CA (named as istio.\*).
|
||||
In this example, `istio.default`. The Istio CA will issue new certificates for the workloads.
|
||||
```bash
|
||||
kubectl delete secret istio.default
|
||||
```
|
||||
Note that if you are using different certificate/key file or secret names,
|
||||
you need to change corresponding arguments in `istio-ca-plugin-certs.yaml`.
|
||||
|
||||
## Verifying the new certificates
|
||||
|
||||
In this section, we verify that the new workload certificates and root certificates are propagated.
|
||||
This requires you have `openssl` installed on your machine.
|
||||
|
||||
1. Deploy the bookinfo application following the [instructions]({{home}}/docs/guides/bookinfo.html).
|
||||
|
||||
1. Retrieve the mounted certificates.
|
||||
|
||||
Get the pods:
|
||||
```bash
|
||||
kubectl get pods
|
||||
```
|
||||
|
||||
which produces:
|
||||
```bash
|
||||
NAME READY STATUS RESTARTS AGE
|
||||
details-v1-1520924117-48z17 2/2 Running 0 6m
|
||||
productpage-v1-560495357-jk1lz 2/2 Running 0 6m
|
||||
ratings-v1-734492171-rnr5l 2/2 Running 0 6m
|
||||
reviews-v1-874083890-f0qf0 2/2 Running 0 6m
|
||||
reviews-v2-1343845940-b34q5 2/2 Running 0 6m
|
||||
reviews-v3-1813607990-8ch52 2/2 Running 0 6m
|
||||
```
|
||||
|
||||
In the following, we take the pod `ratings-v1-734492171-rnr5l` as an example, and verify the mounted certificates.
|
||||
Run the following commands to retrieve the certificates mounted on the proxy:
|
||||
|
||||
```bash
|
||||
kubectl exec -it ratings-v1-734492171-rnr5l -c istio-proxy -- /bin/cat /etc/certs/root-cert.pem > /tmp/pod-root-cert.pem
|
||||
```
|
||||
The file `/tmp/pod-root-cert.pem` should contain the root certificate specified by the operator.
|
||||
|
||||
```bash
|
||||
kubectl exec -it ratings-v1-734492171-rnr5l -c istio-proxy -- /bin/cat /etc/certs/cert-chain.pem > /tmp/pod-cert-chain.pem
|
||||
```
|
||||
The file `/tmp/pod-cert-chain.pem` should contain the workload certificate and the CA certificate.
|
||||
|
||||
1. Verify the root certificate is the same as the one specified by operator:
|
||||
```bash
|
||||
openssl x509 -in /tmp/root-cert.pem -text -noout > /tmp/root-cert.crt.txt
|
||||
openssl x509 -in /tmp/pod-root-cert.pem -text -noout > /tmp/pod-root-cert.crt.txt
|
||||
diff /tmp/root-cert.crt.txt /tmp/pod-root-cert.crt.txt
|
||||
```
|
||||
|
||||
1. Verify that the CA certificate is the same as the one specified by operator:
|
||||
```bash
|
||||
tail /tmp/pod-cert-chain.pem -n 22 > /tmp/pod-cert-chain-ca.pem
|
||||
openssl x509 -in /tmp/ca-cert.pem -text -noout > /tmp/ca-cert.crt.txt
|
||||
openssl x509 -in /tmp/pod-cert-chain-ca.pem -text -noout > /tmp/pod-cert-chain-ca.crt.txt
|
||||
diff /tmp/ca-cert.crt.txt /tmp/pod-cert-chain-ca.crt.txt
|
||||
```
|
||||
Expect that the output to be empty.
|
||||
|
||||
1. Verify the certificate chain from the root certificate to the workload certificate:
|
||||
```bash
|
||||
head /tmp/pod-cert-chain.pem -n 18 > /tmp/pod-cert-chain-workload.pem
|
||||
openssl verify -CAfile <(cat /tmp/ca-cert.pem /tmp/root-cert.pem) /tmp/pod-cert-chain-workload.pem
|
||||
```
|
||||
Expect the following output:
|
||||
```bash
|
||||
/tmp/pod-cert-chain-workload.pem: OK
|
||||
```
|
||||
|
||||
## Cleanup
|
||||
|
||||
* To remove the secret `cacerts`:
|
||||
|
||||
```bash
|
||||
kubectl delete secret cacerts -n istio-system
|
||||
```
|
||||
|
||||
* To remove the Istio components:
|
||||
```bash
|
||||
kubectl delete -f install/kubernetes/istio-auth.yaml
|
||||
```
|
||||
|
||||
## Further reading
|
||||
|
||||
* Read the [Istio CA arguments](https://github.com/istio/istio/blob/master/security/cmd/istio_ca/main.go).
|
||||
* Read [how the sample certificates and keys are generated](https://github.com/istio/istio/blob/master/security/samples/plugin_ca_certs).
|
||||
Loading…
Reference in New Issue