From 9dd9fb46357ed6c9e2770798db737379c9f1f70d Mon Sep 17 00:00:00 2001 From: John Dilley Date: Wed, 6 Feb 2019 16:03:08 +0000 Subject: [PATCH] Add support for freezing ingress TLS secrets --- README.md | 2 +- engine/processor/freeze.go | 8 ++++++ ...nx-with-data-from-file.rendered+frozen.yml | 27 +++++++++++++++++++ .../nginx-with-data-from-file.rendered.yml | 27 +++++++++++++++++++ example/nginx-with-data-from-file.yml | 27 +++++++++++++++++++ example/tls.crt | 19 +++++++++++++ example/tls.key | 27 +++++++++++++++++++ 7 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 example/tls.crt create mode 100644 example/tls.key diff --git a/README.md b/README.md index cf66d95..411b074 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ source <(kubetpl completion zsh) ## ConfigMap/Secret freezing When `kubetpl render --freeze ...` is used, kubetpl rewrites `ConfigMap`/`Secret`'s name to include hash of the content -and then updates all the references (in `Pod`s / `DaemonSet`s / `Deployment`s / `Job`s / `ReplicaSet`s / `ReplicationController`s / `StatefulSet`s / `CronJob`s) with a new value. +and then updates all the references (in `Pod`s / `DaemonSet`s / `Deployment`s / `Job`s / `ReplicaSet`s / `ReplicationController`s / `StatefulSet`s / `CronJob`s / `Ingress`s) with a new value. For example, executing [`kubetpl render --freeze example/nginx-with-data-from-file.yml -s NAME=app -s MESSAGE=msg`](example/nginx-with-data-from-file.yml) should produce [example/nginx-with-data-from-file.rendered+frozen.yml](example/nginx-with-data-from-file.rendered+frozen.yml#L15). diff --git a/engine/processor/freeze.go b/engine/processor/freeze.go index 9851aae..dcb4e9e 100644 --- a/engine/processor/freeze.go +++ b/engine/processor/freeze.go @@ -24,6 +24,7 @@ const ( kindReplicationController = "ReplicationController" kindStatefulSet = "StatefulSet" kindCronJob = "CronJob" + kindIngress = "Ingress" ) type frozenObjectRef struct { @@ -62,6 +63,9 @@ func init() { "spec.envFrom[*].secretRef.name", "spec.volumes[*].secret.secretName", } + secret[kindIngress] = []string{ + "spec.tls[*].secretName", + } for _, kind := range []string{ kindDaemonSet, kindDeployment, @@ -247,6 +251,10 @@ func traverseRefs( last := path[d+1:] rr := []interface{}{obj} for _, p := range strings.Split(path[0:d], "[*].") { + // Special case if there isn't a sub-key after the [*] + if strings.HasSuffix(p, "[*]") { + p = strings.TrimSuffix(p, "[*]") + } var rn []interface{} for _, r := range rr { m, ok := r.(map[interface{}]interface{}) diff --git a/example/nginx-with-data-from-file.rendered+frozen.yml b/example/nginx-with-data-from-file.rendered+frozen.yml index 8581819..03e44ad 100644 --- a/example/nginx-with-data-from-file.rendered+frozen.yml +++ b/example/nginx-with-data-from-file.rendered+frozen.yml @@ -14,6 +14,15 @@ kind: ConfigMap metadata: name: app-fba46ca --- +apiVesion: v1 +data: + tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUREVENDQWZXZ0F3SUJBZ0lKQUwvTXJjMVFJMWdNTUEwR0NTcUdTSWIzRFFFQkJRVUFNQjB4R3pBWkJnTlYKQkFNTUVuTnpiR1Y0WVcxd2JHVXVabTl2TG1OdmJUQWVGdzB4T1RBeU1EWXhNVEkxTlRsYUZ3MHlPVEF5TURNeApNVEkxTlRsYU1CMHhHekFaQmdOVkJBTU1Fbk56YkdWNFlXMXdiR1V1Wm05dkxtTnZiVENDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSzNoUjZMSjBsMUJQY0pIMjVxcXVtRmx1Q1MrVGhaKzBOVDMKdzVDRDZyRXFDMTZwM0xZRWVhdjBIUEJWRzNQcGoxd2FCbEVyTFBaMmphQlR1dWtFRi81aUJTcWFDTDYwajV1WApQSVBnQUQvbTF5RGhFQWpyQTZrQTZzekhkU1U5RG44cVRuMm8zdUZXQWRqTDlxS0RMTEZRTHZRY1R1OFFSQVFXCnhZK2x3dk9ueCtZNDhad1pOcjhVQnJPcjdPR0pSZnQzeXhNd0RSSk0zemhOTXlnb1lyZTVpSzFVaVEzM2d5akMKcHE2YldUYVBtV0FxSlJyQjArYUlpZHhxMXFQL3JhYWs3d0hNWHI5clRNVWhybjhLaDlvcnFFdjl1NHBZelhaQQpRUk9MKzJhOGY0bDB0UVRZRUtsN2poYXordXlicUpIQWhGZVZlNExNMGIwempvSVFMTkVDQXdFQUFhTlFNRTR3CkhRWURWUjBPQkJZRUZKMXFKOWMwdVhnbzVKU0REWXlwL1dhcFduSERNQjhHQTFVZEl3UVlNQmFBRkoxcUo5YzAKdVhnbzVKU0REWXlwL1dhcFduSERNQXdHQTFVZEV3UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQgpBS0tsV2t3ZzRqMVdvMWxKQTVqVUJQVmpieWRqc2ZCbThZK01FSUZKbWw2UTRzZUc3ekIvRzFYZWMxeGRaSmorCmZ0eVZpKzh0ZXZ6TlY2OFpNaklTNFFyN0Y4aUg4OXlwOHlSYzhMeG5ySE9lQ1NFMHNnekpuSkIvaWZRYXBxemoKdjBubHBUdmdacGF6aVdLZHEyS0VpaEZWMGdlQi9HSWFURjdPZFVKd2VFTXFYcjAxclc4NVhNZ0FvYlRjZkhlUQpHVjIxZlN3Z3VaOFdPbEJMZjdtMGc4T3NTV2ZVRUNrOHgxeGFwRERmMWJ5Q0lIT3U5T1hhZGRmMXdYUldMck9sClhiSjdZVGFITHJSNkZJckM4WURDRGlXUXN3SWpaaFdzZDFBS3h6SEMxc1dzbmhsSjZBVTgwYnNVK0dHTHhLY3kKTzB1b1dMaURSaUtxaWRuN1paM3lTUDA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K + tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBcmVGSG9zblNYVUU5d2tmYm1xcTZZV1c0Skw1T0ZuN1ExUGZEa0lQcXNTb0xYcW5jCnRnUjVxL1FjOEZVYmMrbVBYQm9HVVNzczluYU5vRk82NlFRWC9tSUZLcG9JdnJTUG01YzhnK0FBUCtiWElPRVEKQ09zRHFRRHF6TWQxSlQwT2Z5cE9mYWplNFZZQjJNdjJvb01zc1ZBdTlCeE83eEJFQkJiRmo2WEM4NmZINWpqeApuQmsydnhRR3M2dnM0WWxGKzNmTEV6QU5Fa3pmT0UwektDaGl0N21JclZTSkRmZURLTUttcnB0Wk5vK1pZQ29sCkdzSFQ1b2lKM0dyV28vK3RwcVR2QWN4ZXYydE14U0d1ZndxSDJpdW9TLzI3aWxqTmRrQkJFNHY3WnJ4L2lYUzEKQk5nUXFYdU9GclA2N0p1b2tjQ0VWNVY3Z3N6UnZUT09naEFzMFFJREFRQUJBb0lCQVFDaXBqRFVYZVdoeGYxMwpWckJkcFlaaXhUdlRZeEM0aWpmZWYwVTRVYTJmdTZ5WENGMmxCZHFxdHRhN0dXRnNzL1dlT2RuZTQzeFRyK0liCkx6ZVA4SHhoUUYrRTBrR0w0bXJUS0UwN0xyWU5FR244SDR0WVRENUlRTXRpY3RGcDNBdExlTStqUyt2dzdQc2QKU08yVVp3L1BiU24rdnR3M1ZBZkxxMkZ5VmFSZk5lOUtpQW1ETVdZcXFVK01TUEtZNDhEaWY3WEZtektMczlJTQpQcEdCNEhOaGRIYk9NbHlkd3Z1amtJZGlpRWM2TmtyNnZOVmZlajlzNVYvcEc5dEhON0VidGszMFRBbzc2UHlFCit2blpRaEl1Y25Fc0RQeTM0WDZBWUtHWjVtb1dZWFVEcU1QOVp6SERDVnRjTHhSY0RiTTZydTJWbThhRlRkYmEKdWR4QmgzRGhBb0dCQU9MN203OGlETVZNRWVYczhka3VaMnhzVkloSWZhNVBZdUpUZ1I4NXdMblR3Y0tGaUY2ZAo3UW1HVjNMV2g3SDhBUEhldzdOamhZcXM2bm1tdVVhcVpJSHk4YVAxaDBRYWozNmtyaERhWXlkcmVBQmFDR2hSClIyV1NlNGQwWVM3SEN3eGVKT3VBSE0wM2kzbXorbkpqQk5XZXBaKzBFUkhob3JUN0dZOEtEdHVmQW9HQkFNUWIKeXRrWlNmbEVMR21VcmtGa3FsZzJvNjFuMXk4eHFuMXgxeFFIbGZsQ3Jadlp5V0dYc25EcjFKK2k5ZW5WSEJROQo2eElXREFSZ1VRR00zdkhQNXNVZ25FMVBDdks0OU5OUU9lU1ZJdStVbVloN1ZqUDNmempwU01hYlNyaFRWN3kxCjdZRWg3dEI3Tmtab0Y5Yi9naDFRQ1B4V3htaDlPOFIxM1BlU0RDR1BBb0dBUWtza1dQV1Q3MGZoYmxyKzQrU20KdGtjSmhXaE90TXRnNFNOc2NmZEhMNzhHTjA4UzNqZVgxSkZWRnloTEo1T25udnptQVkzT29nc1F6SWtDVWY1UQpMcGdMTlV6dnZkZFlFNi83V3RhOTRQU0ZidXpjeWNMN2JGSVZIQ0hFaElvRDB3L29EcFF6VlVpa3h0M25CdU9lCnRObUtIQlBXYkhlUE12YW5wMXhUckpjQ2dZQnhJWk5Zd0pVREhvZjhkSkErRzBPRjFpZUFUcW85aUlwUkNjNUkKdU1PVTR4bGlFalp4ZldDc2NlL2NFOWVIaUxCRklSOHQ5TmdENGtoNCszcFZ4MWphbWFCeG5NcTFFV3Z6UjVITwpReGEvWFZ0Zzk3M1lCc3cyMmFWcEpZYnFaUEgxWklKWi8yaFVqdS9WbUJGQXIyK3hWMDJIdk11QzFkUVgxdUtkClUzeDZFd0tCZ0Y3aWdzSFBxdzg4TkZzTGtUSTlqcEJRaWRta1lhdkcyaWh2REpnb2pZS1ppMnpxUWkzcUFkR0IKREFxbWg1S3hwUzZFNWdsVzdhckVuanJMdjYwQkxKdEdaRXI3MHlGanRMOUl4ZzlHM0tIU29JWTY0SFJML2Z3RworTW9wQTFuWFpMM0ZPTnhQdzFzbXdVdU5DRExpcDU2NzVCbmtjeC9tMTNRNFQ2QnZpMTlECi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== +kind: Secret +metadata: + name: app-ingress-secret-c9c41f2 +type: Opaque +--- apiVersion: apps/v1beta1 kind: Deployment metadata: @@ -46,3 +55,21 @@ spec: - configMap: name: app-fba46ca name: app-volume +--- +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: app-ingress +spec: + rules: + - host: sslexample.foo.com + http: + paths: + - backend: + serviceName: service1 + servicePort: 80 + path: / + tls: + - hosts: + - sslexample.foo.com + secretName: app-ingress-secret-c9c41f2 diff --git a/example/nginx-with-data-from-file.rendered.yml b/example/nginx-with-data-from-file.rendered.yml index 18ff328..8cee6f4 100644 --- a/example/nginx-with-data-from-file.rendered.yml +++ b/example/nginx-with-data-from-file.rendered.yml @@ -14,6 +14,15 @@ kind: ConfigMap metadata: name: app --- +apiVesion: v1 +data: + tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUREVENDQWZXZ0F3SUJBZ0lKQUwvTXJjMVFJMWdNTUEwR0NTcUdTSWIzRFFFQkJRVUFNQjB4R3pBWkJnTlYKQkFNTUVuTnpiR1Y0WVcxd2JHVXVabTl2TG1OdmJUQWVGdzB4T1RBeU1EWXhNVEkxTlRsYUZ3MHlPVEF5TURNeApNVEkxTlRsYU1CMHhHekFaQmdOVkJBTU1Fbk56YkdWNFlXMXdiR1V1Wm05dkxtTnZiVENDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSzNoUjZMSjBsMUJQY0pIMjVxcXVtRmx1Q1MrVGhaKzBOVDMKdzVDRDZyRXFDMTZwM0xZRWVhdjBIUEJWRzNQcGoxd2FCbEVyTFBaMmphQlR1dWtFRi81aUJTcWFDTDYwajV1WApQSVBnQUQvbTF5RGhFQWpyQTZrQTZzekhkU1U5RG44cVRuMm8zdUZXQWRqTDlxS0RMTEZRTHZRY1R1OFFSQVFXCnhZK2x3dk9ueCtZNDhad1pOcjhVQnJPcjdPR0pSZnQzeXhNd0RSSk0zemhOTXlnb1lyZTVpSzFVaVEzM2d5akMKcHE2YldUYVBtV0FxSlJyQjArYUlpZHhxMXFQL3JhYWs3d0hNWHI5clRNVWhybjhLaDlvcnFFdjl1NHBZelhaQQpRUk9MKzJhOGY0bDB0UVRZRUtsN2poYXordXlicUpIQWhGZVZlNExNMGIwempvSVFMTkVDQXdFQUFhTlFNRTR3CkhRWURWUjBPQkJZRUZKMXFKOWMwdVhnbzVKU0REWXlwL1dhcFduSERNQjhHQTFVZEl3UVlNQmFBRkoxcUo5YzAKdVhnbzVKU0REWXlwL1dhcFduSERNQXdHQTFVZEV3UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQgpBS0tsV2t3ZzRqMVdvMWxKQTVqVUJQVmpieWRqc2ZCbThZK01FSUZKbWw2UTRzZUc3ekIvRzFYZWMxeGRaSmorCmZ0eVZpKzh0ZXZ6TlY2OFpNaklTNFFyN0Y4aUg4OXlwOHlSYzhMeG5ySE9lQ1NFMHNnekpuSkIvaWZRYXBxemoKdjBubHBUdmdacGF6aVdLZHEyS0VpaEZWMGdlQi9HSWFURjdPZFVKd2VFTXFYcjAxclc4NVhNZ0FvYlRjZkhlUQpHVjIxZlN3Z3VaOFdPbEJMZjdtMGc4T3NTV2ZVRUNrOHgxeGFwRERmMWJ5Q0lIT3U5T1hhZGRmMXdYUldMck9sClhiSjdZVGFITHJSNkZJckM4WURDRGlXUXN3SWpaaFdzZDFBS3h6SEMxc1dzbmhsSjZBVTgwYnNVK0dHTHhLY3kKTzB1b1dMaURSaUtxaWRuN1paM3lTUDA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K + tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBcmVGSG9zblNYVUU5d2tmYm1xcTZZV1c0Skw1T0ZuN1ExUGZEa0lQcXNTb0xYcW5jCnRnUjVxL1FjOEZVYmMrbVBYQm9HVVNzczluYU5vRk82NlFRWC9tSUZLcG9JdnJTUG01YzhnK0FBUCtiWElPRVEKQ09zRHFRRHF6TWQxSlQwT2Z5cE9mYWplNFZZQjJNdjJvb01zc1ZBdTlCeE83eEJFQkJiRmo2WEM4NmZINWpqeApuQmsydnhRR3M2dnM0WWxGKzNmTEV6QU5Fa3pmT0UwektDaGl0N21JclZTSkRmZURLTUttcnB0Wk5vK1pZQ29sCkdzSFQ1b2lKM0dyV28vK3RwcVR2QWN4ZXYydE14U0d1ZndxSDJpdW9TLzI3aWxqTmRrQkJFNHY3WnJ4L2lYUzEKQk5nUXFYdU9GclA2N0p1b2tjQ0VWNVY3Z3N6UnZUT09naEFzMFFJREFRQUJBb0lCQVFDaXBqRFVYZVdoeGYxMwpWckJkcFlaaXhUdlRZeEM0aWpmZWYwVTRVYTJmdTZ5WENGMmxCZHFxdHRhN0dXRnNzL1dlT2RuZTQzeFRyK0liCkx6ZVA4SHhoUUYrRTBrR0w0bXJUS0UwN0xyWU5FR244SDR0WVRENUlRTXRpY3RGcDNBdExlTStqUyt2dzdQc2QKU08yVVp3L1BiU24rdnR3M1ZBZkxxMkZ5VmFSZk5lOUtpQW1ETVdZcXFVK01TUEtZNDhEaWY3WEZtektMczlJTQpQcEdCNEhOaGRIYk9NbHlkd3Z1amtJZGlpRWM2TmtyNnZOVmZlajlzNVYvcEc5dEhON0VidGszMFRBbzc2UHlFCit2blpRaEl1Y25Fc0RQeTM0WDZBWUtHWjVtb1dZWFVEcU1QOVp6SERDVnRjTHhSY0RiTTZydTJWbThhRlRkYmEKdWR4QmgzRGhBb0dCQU9MN203OGlETVZNRWVYczhka3VaMnhzVkloSWZhNVBZdUpUZ1I4NXdMblR3Y0tGaUY2ZAo3UW1HVjNMV2g3SDhBUEhldzdOamhZcXM2bm1tdVVhcVpJSHk4YVAxaDBRYWozNmtyaERhWXlkcmVBQmFDR2hSClIyV1NlNGQwWVM3SEN3eGVKT3VBSE0wM2kzbXorbkpqQk5XZXBaKzBFUkhob3JUN0dZOEtEdHVmQW9HQkFNUWIKeXRrWlNmbEVMR21VcmtGa3FsZzJvNjFuMXk4eHFuMXgxeFFIbGZsQ3Jadlp5V0dYc25EcjFKK2k5ZW5WSEJROQo2eElXREFSZ1VRR00zdkhQNXNVZ25FMVBDdks0OU5OUU9lU1ZJdStVbVloN1ZqUDNmempwU01hYlNyaFRWN3kxCjdZRWg3dEI3Tmtab0Y5Yi9naDFRQ1B4V3htaDlPOFIxM1BlU0RDR1BBb0dBUWtza1dQV1Q3MGZoYmxyKzQrU20KdGtjSmhXaE90TXRnNFNOc2NmZEhMNzhHTjA4UzNqZVgxSkZWRnloTEo1T25udnptQVkzT29nc1F6SWtDVWY1UQpMcGdMTlV6dnZkZFlFNi83V3RhOTRQU0ZidXpjeWNMN2JGSVZIQ0hFaElvRDB3L29EcFF6VlVpa3h0M25CdU9lCnRObUtIQlBXYkhlUE12YW5wMXhUckpjQ2dZQnhJWk5Zd0pVREhvZjhkSkErRzBPRjFpZUFUcW85aUlwUkNjNUkKdU1PVTR4bGlFalp4ZldDc2NlL2NFOWVIaUxCRklSOHQ5TmdENGtoNCszcFZ4MWphbWFCeG5NcTFFV3Z6UjVITwpReGEvWFZ0Zzk3M1lCc3cyMmFWcEpZYnFaUEgxWklKWi8yaFVqdS9WbUJGQXIyK3hWMDJIdk11QzFkUVgxdUtkClUzeDZFd0tCZ0Y3aWdzSFBxdzg4TkZzTGtUSTlqcEJRaWRta1lhdkcyaWh2REpnb2pZS1ppMnpxUWkzcUFkR0IKREFxbWg1S3hwUzZFNWdsVzdhckVuanJMdjYwQkxKdEdaRXI3MHlGanRMOUl4ZzlHM0tIU29JWTY0SFJML2Z3RworTW9wQTFuWFpMM0ZPTnhQdzFzbXdVdU5DRExpcDU2NzVCbmtjeC9tMTNRNFQ2QnZpMTlECi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== +kind: Secret +metadata: + name: app-ingress-secret +type: Opaque +--- apiVersion: apps/v1beta1 kind: Deployment metadata: @@ -46,3 +55,21 @@ spec: - configMap: name: app name: app-volume +--- +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: app-ingress +spec: + rules: + - host: sslexample.foo.com + http: + paths: + - backend: + serviceName: service1 + servicePort: 80 + path: / + tls: + - hosts: + - sslexample.foo.com + secretName: app-ingress-secret diff --git a/example/nginx-with-data-from-file.yml b/example/nginx-with-data-from-file.yml index 1f8cbf1..60d196a 100644 --- a/example/nginx-with-data-from-file.yml +++ b/example/nginx-with-data-from-file.yml @@ -12,6 +12,15 @@ kubetpl/data-from-file: metadata: name: $NAME --- +apiVesion: v1 +kind: Secret +metadata: + name: $NAME-ingress-secret +type: Opaque +kubetpl/data-from-file: +- tls.key +- tls.crt +--- apiVersion: apps/v1beta1 kind: Deployment metadata: @@ -44,3 +53,21 @@ spec: - configMap: name: $NAME name: $NAME-volume +--- +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: $NAME-ingress +spec: + tls: + - hosts: + - sslexample.foo.com + secretName: $NAME-ingress-secret + rules: + - host: sslexample.foo.com + http: + paths: + - path: / + backend: + serviceName: service1 + servicePort: 80 diff --git a/example/tls.crt b/example/tls.crt new file mode 100644 index 0000000..580a6e4 --- /dev/null +++ b/example/tls.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDDTCCAfWgAwIBAgIJAL/Mrc1QI1gMMA0GCSqGSIb3DQEBBQUAMB0xGzAZBgNV +BAMMEnNzbGV4YW1wbGUuZm9vLmNvbTAeFw0xOTAyMDYxMTI1NTlaFw0yOTAyMDMx +MTI1NTlaMB0xGzAZBgNVBAMMEnNzbGV4YW1wbGUuZm9vLmNvbTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAK3hR6LJ0l1BPcJH25qqumFluCS+ThZ+0NT3 +w5CD6rEqC16p3LYEeav0HPBVG3Ppj1waBlErLPZ2jaBTuukEF/5iBSqaCL60j5uX +PIPgAD/m1yDhEAjrA6kA6szHdSU9Dn8qTn2o3uFWAdjL9qKDLLFQLvQcTu8QRAQW +xY+lwvOnx+Y48ZwZNr8UBrOr7OGJRft3yxMwDRJM3zhNMygoYre5iK1UiQ33gyjC +pq6bWTaPmWAqJRrB0+aIidxq1qP/raak7wHMXr9rTMUhrn8Kh9orqEv9u4pYzXZA +QROL+2a8f4l0tQTYEKl7jhaz+uybqJHAhFeVe4LM0b0zjoIQLNECAwEAAaNQME4w +HQYDVR0OBBYEFJ1qJ9c0uXgo5JSDDYyp/WapWnHDMB8GA1UdIwQYMBaAFJ1qJ9c0 +uXgo5JSDDYyp/WapWnHDMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKKlWkwg4j1Wo1lJA5jUBPVjbydjsfBm8Y+MEIFJml6Q4seG7zB/G1Xec1xdZJj+ +ftyVi+8tevzNV68ZMjIS4Qr7F8iH89yp8yRc8LxnrHOeCSE0sgzJnJB/ifQapqzj +v0nlpTvgZpaziWKdq2KEihFV0geB/GIaTF7OdUJweEMqXr01rW85XMgAobTcfHeQ +GV21fSwguZ8WOlBLf7m0g8OsSWfUECk8x1xapDDf1byCIHOu9OXaddf1wXRWLrOl +XbJ7YTaHLrR6FIrC8YDCDiWQswIjZhWsd1AKxzHC1sWsnhlJ6AU80bsU+GGLxKcy +O0uoWLiDRiKqidn7ZZ3ySP0= +-----END CERTIFICATE----- diff --git a/example/tls.key b/example/tls.key new file mode 100644 index 0000000..1f75be5 --- /dev/null +++ b/example/tls.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAreFHosnSXUE9wkfbmqq6YWW4JL5OFn7Q1PfDkIPqsSoLXqnc +tgR5q/Qc8FUbc+mPXBoGUSss9naNoFO66QQX/mIFKpoIvrSPm5c8g+AAP+bXIOEQ +COsDqQDqzMd1JT0OfypOfaje4VYB2Mv2ooMssVAu9BxO7xBEBBbFj6XC86fH5jjx +nBk2vxQGs6vs4YlF+3fLEzANEkzfOE0zKChit7mIrVSJDfeDKMKmrptZNo+ZYCol +GsHT5oiJ3GrWo/+tpqTvAcxev2tMxSGufwqH2iuoS/27iljNdkBBE4v7Zrx/iXS1 +BNgQqXuOFrP67JuokcCEV5V7gszRvTOOghAs0QIDAQABAoIBAQCipjDUXeWhxf13 +VrBdpYZixTvTYxC4ijfef0U4Ua2fu6yXCF2lBdqqtta7GWFss/WeOdne43xTr+Ib +LzeP8HxhQF+E0kGL4mrTKE07LrYNEGn8H4tYTD5IQMtictFp3AtLeM+jS+vw7Psd +SO2UZw/PbSn+vtw3VAfLq2FyVaRfNe9KiAmDMWYqqU+MSPKY48Dif7XFmzKLs9IM +PpGB4HNhdHbOMlydwvujkIdiiEc6Nkr6vNVfej9s5V/pG9tHN7Ebtk30TAo76PyE ++vnZQhIucnEsDPy34X6AYKGZ5moWYXUDqMP9ZzHDCVtcLxRcDbM6ru2Vm8aFTdba +udxBh3DhAoGBAOL7m78iDMVMEeXs8dkuZ2xsVIhIfa5PYuJTgR85wLnTwcKFiF6d +7QmGV3LWh7H8APHew7NjhYqs6nmmuUaqZIHy8aP1h0Qaj36krhDaYydreABaCGhR +R2WSe4d0YS7HCwxeJOuAHM03i3mz+nJjBNWepZ+0ERHhorT7GY8KDtufAoGBAMQb +ytkZSflELGmUrkFkqlg2o61n1y8xqn1x1xQHlflCrZvZyWGXsnDr1J+i9enVHBQ9 +6xIWDARgUQGM3vHP5sUgnE1PCvK49NNQOeSVIu+UmYh7VjP3fzjpSMabSrhTV7y1 +7YEh7tB7NkZoF9b/gh1QCPxWxmh9O8R13PeSDCGPAoGAQkskWPWT70fhblr+4+Sm +tkcJhWhOtMtg4SNscfdHL78GN08S3jeX1JFVFyhLJ5OnnvzmAY3OogsQzIkCUf5Q +LpgLNUzvvddYE6/7Wta94PSFbuzcycL7bFIVHCHEhIoD0w/oDpQzVUikxt3nBuOe +tNmKHBPWbHePMvanp1xTrJcCgYBxIZNYwJUDHof8dJA+G0OF1ieATqo9iIpRCc5I +uMOU4xliEjZxfWCsce/cE9eHiLBFIR8t9NgD4kh4+3pVx1jamaBxnMq1EWvzR5HO +Qxa/XVtg973YBsw22aVpJYbqZPH1ZIJZ/2hUju/VmBFAr2+xV02HvMuC1dQX1uKd +U3x6EwKBgF7igsHPqw88NFsLkTI9jpBQidmkYavG2ihvDJgojYKZi2zqQi3qAdGB +DAqmh5KxpS6E5glW7arEnjrLv60BLJtGZEr70yFjtL9Ixg9G3KHSoIY64HRL/fwG ++MopA1nXZL3FONxPw1smwUuNCDLip5675Bnkcx/m13Q4T6Bvi19D +-----END RSA PRIVATE KEY-----