Skip to content

Commit 238cd7b

Browse files
authored
Add support for custom certificate packages (#2105)
- Extend installCertificates to collect certificate files from installed APK packages that provide a configured value, in addition to inline certificates from the image config - Certificates from qualifying packages are read from the filesystem, parsed, and appended to the CA bundle (ca-certificates.crt) and Java truststores, replacing what update-ca-certificates post-install scripts would normally do - When no existing CA bundle is present, the primary bundle is now created automatically if certificates need to be installed To enable, set `certificates.providers = ["custom-ca-certificates"]` in config and install packages that provide the given string ("custom-ca-certificates" in this example) containing .pem/.crt files.
1 parent 0a1df0f commit 238cd7b

18 files changed

+767
-122
lines changed

.github/workflows/build-samples.yml

Lines changed: 26 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -237,64 +237,33 @@ jobs:
237237
check-latest: true
238238
- name: test additional certificates
239239
run: |
240-
set -euo pipefail
241-
242-
# Gets all certificate fingerprints from a PEM stream, sorted, so two outputs can
243-
# be semantically compared.
244-
get_fingerprints() {
245-
local cert=""
246-
while IFS= read -r line; do
247-
case "$line" in
248-
"-----BEGIN CERTIFICATE-----")
249-
cert="$line"$'\n' ;;
250-
"-----END CERTIFICATE-----")
251-
cert+="$line"
252-
echo "$cert" | openssl x509 -noout -fingerprint -sha256 2>/dev/null
253-
cert="" ;;
254-
*)
255-
[[ -n "$cert" ]] && cert+="$line"$'\n' || true ;;
256-
esac
257-
done | sort
258-
}
259-
260-
# Verifies that fingerprints file contains at least N certs and the two additional test certs.
261-
verify_fingerprints() {
262-
local file="$1"
263-
local min_count="$2"
264-
local name="$3"
265-
266-
local count=$(wc -l < "$file")
267-
if [ "$count" -lt "$min_count" ]; then
268-
echo "Expected at least $min_count certificates in $name, found $count"
269-
exit 1
270-
fi
271-
272-
grep "E7:05:70:A9:89:F8:56:5A:AB:DF:7C:AE:27:AB:D1:62:18:72:D6:A3:F8:11:E3:FE:F2:7E:3D:BA:02:91:21:98" "$file"
273-
grep "9B:2A:33:9F:E6:A3:E8:55:85:C4:CD:75:53:6C:B8:C1:CF:7C:D6:03:B9:A6:4B:EC:25:21:85:8A:E4:8D:A8:5D" "$file"
274-
echo "$name contains the additional certificates."
275-
}
240+
./hack/test-certificates.sh ./examples/certificates.yaml \
241+
"E7:05:70:A9:89:F8:56:5A:AB:DF:7C:AE:27:AB:D1:62:18:72:D6:A3:F8:11:E3:FE:F2:7E:3D:BA:02:91:21:98" \
242+
"9B:2A:33:9F:E6:A3:E8:55:85:C4:CD:75:53:6C:B8:C1:CF:7C:D6:03:B9:A6:4B:EC:25:21:85:8A:E4:8D:A8:5D"
276243
277-
make apko
278-
279-
# Build the certificates image.
280-
./apko build ./examples/certificates.yaml certificates:build /tmp/certificates.tar --arch amd64
281-
docker load < /tmp/certificates.tar
282-
283-
# Get fingerprints from CA bundle and Java truststore before update-ca-certificates.
284-
docker run --rm certificates:build-amd64 "cat /etc/ssl/certs/ca-certificates.crt" | get_fingerprints > /tmp/ca-bundle-fingerprints.txt
285-
docker run --rm certificates:build-amd64 "trust extract --filter=ca-anchors --purpose=server-auth --format=pem-bundle /tmp/certs.pem && cat /tmp/certs.pem" | get_fingerprints > /tmp/java-truststore-fingerprints.txt
286-
287-
# Verify both stores contain base certs and the additional certificates.
288-
verify_fingerprints /tmp/ca-bundle-fingerprints.txt 10 "CA bundle"
289-
verify_fingerprints /tmp/java-truststore-fingerprints.txt 10 "Java truststore"
244+
package-certificates:
245+
name: package-certificates
246+
runs-on: ubuntu-latest
290247

291-
# Run update-ca-certificates and get fingerprints from both stores after.
292-
docker run --rm certificates:build-amd64 "apk add ca-certificates && update-ca-certificates && cat /etc/ssl/certs/ca-certificates.crt" | get_fingerprints > /tmp/ca-bundle-updated-fingerprints.txt
293-
docker run --rm certificates:build-amd64 "apk add ca-certificates && update-ca-certificates && trust extract --filter=ca-anchors --purpose=server-auth --format=pem-bundle /tmp/certs.pem && cat /tmp/certs.pem" | get_fingerprints > /tmp/java-truststore-updated-fingerprints.txt
248+
permissions:
249+
contents: read
294250

295-
# Verify that the stores are semantically identical before and after update-ca-certificates.
296-
diff /tmp/ca-bundle-fingerprints.txt /tmp/ca-bundle-updated-fingerprints.txt
297-
echo "CA bundles before and after update-ca-certificates are identical."
251+
steps:
252+
- uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
253+
with:
254+
egress-policy: audit
255+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
256+
with:
257+
persist-credentials: false
298258

299-
diff /tmp/java-truststore-fingerprints.txt /tmp/java-truststore-updated-fingerprints.txt
300-
echo "Java truststores before and after update-ca-certificates are identical."
259+
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
260+
with:
261+
go-version-file: 'go.mod'
262+
check-latest: true
263+
- name: test package-provided certificates
264+
run: |
265+
./hack/test-certificates.sh ./examples/package-certificates.yaml \
266+
"E7:05:70:A9:89:F8:56:5A:AB:DF:7C:AE:27:AB:D1:62:18:72:D6:A3:F8:11:E3:FE:F2:7E:3D:BA:02:91:21:98" \
267+
"9B:2A:33:9F:E6:A3:E8:55:85:C4:CD:75:53:6C:B8:C1:CF:7C:D6:03:B9:A6:4B:EC:25:21:85:8A:E4:8D:A8:5D" \
268+
"34:75:37:AF:7A:09:D4:03:F1:9F:58:F8:3C:35:68:91:2A:F2:4B:7C:12:E7:45:F1:D5:55:70:79:70:8C:91:AD" \
269+
"12:AE:34:99:9A:A6:4D:CD:1A:69:47:E8:38:A5:3A:AB:AB:FC:FA:CA:45:AB:CA:8D:C0:CB:B8:DC:B7:BD:06:3C"

examples/package-certificates.yaml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
contents:
2+
keyring:
3+
- https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
4+
- ./internal/cli/testdata/melange.rsa.pub
5+
repositories:
6+
- https://packages.wolfi.dev/os
7+
- ./internal/cli/testdata/packages
8+
packages:
9+
- ca-certificates-bundle
10+
- busybox
11+
- apk-tools
12+
- java-cacerts
13+
- custom-ca-certs-1
14+
- custom-ca-certs-2
15+
16+
certificates:
17+
providers:
18+
- custom-ca-certificates
19+
20+
entrypoint:
21+
command: /bin/sh -c
22+
23+
archs:
24+
- amd64

hack/test-certificates.sh

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
#!/usr/bin/env bash
2+
3+
# Copyright 2025 Chainguard, Inc.
4+
# SPDX-License-Identifier: Apache-2.0
5+
6+
# Tests that an apko-built image contains expected certificates in both the CA
7+
# bundle and Java truststore, and that running update-ca-certificates doesn't
8+
# change them.
9+
#
10+
# Usage: hack/test-certificates.sh <yaml> <fingerprint> [<fingerprint> ...]
11+
#
12+
# Example:
13+
# hack/test-certificates.sh ./examples/certificates.yaml \
14+
# "E7:05:70:A9:..." "9B:2A:33:9F:..."
15+
16+
set -euo pipefail
17+
18+
if [ $# -lt 2 ]; then
19+
echo "Usage: $0 <yaml> <fingerprint> [<fingerprint> ...]"
20+
exit 1
21+
fi
22+
23+
yaml="$1"
24+
shift
25+
fingerprints=("$@")
26+
27+
name=$(basename "${yaml}" .yaml)
28+
image="${name}:build"
29+
image_arch="${name}:build-amd64"
30+
tarball="/tmp/${name}.tar"
31+
32+
# Gets all certificate fingerprints from a PEM stream, sorted, so two outputs can
33+
# be semantically compared.
34+
get_fingerprints() {
35+
local cert=""
36+
while IFS= read -r line; do
37+
case "$line" in
38+
"-----BEGIN CERTIFICATE-----")
39+
cert="$line"$'\n' ;;
40+
"-----END CERTIFICATE-----")
41+
cert+="$line"
42+
echo "$cert" | openssl x509 -noout -fingerprint -sha256 2>/dev/null
43+
cert="" ;;
44+
*)
45+
[[ -n "$cert" ]] && cert+="$line"$'\n' || true ;;
46+
esac
47+
done | sort
48+
}
49+
50+
# Verifies that fingerprints file contains at least N certs and all expected fingerprints.
51+
verify_fingerprints() {
52+
local file="$1"
53+
local min_count="$2"
54+
local store_name="$3"
55+
56+
local count
57+
count=$(wc -l < "$file")
58+
if [ "$count" -lt "$min_count" ]; then
59+
echo "Expected at least $min_count certificates in $store_name, found $count"
60+
exit 1
61+
fi
62+
63+
for fp in "${fingerprints[@]}"; do
64+
grep "$fp" "$file"
65+
done
66+
echo "$store_name contains all expected certificates."
67+
}
68+
69+
# Build the image.
70+
make apko
71+
./apko build "${yaml}" "${image}" "${tarball}" --arch amd64
72+
docker load < "${tarball}"
73+
74+
# Get fingerprints from CA bundle and Java truststore before update-ca-certificates.
75+
docker run --rm "${image_arch}" "cat /etc/ssl/certs/ca-certificates.crt" | get_fingerprints > /tmp/ca-bundle-fingerprints.txt
76+
docker run --rm "${image_arch}" "trust extract --filter=ca-anchors --purpose=server-auth --format=pem-bundle /tmp/certs.pem && cat /tmp/certs.pem" | get_fingerprints > /tmp/java-truststore-fingerprints.txt
77+
78+
# Verify both stores contain base certs and all expected certificates.
79+
verify_fingerprints /tmp/ca-bundle-fingerprints.txt 10 "CA bundle"
80+
verify_fingerprints /tmp/java-truststore-fingerprints.txt 10 "Java truststore"
81+
82+
# Run update-ca-certificates and get fingerprints from both stores after.
83+
docker run --rm "${image_arch}" "apk add ca-certificates && update-ca-certificates && cat /etc/ssl/certs/ca-certificates.crt" | get_fingerprints > /tmp/ca-bundle-updated-fingerprints.txt
84+
docker run --rm "${image_arch}" "apk add ca-certificates && update-ca-certificates && trust extract --filter=ca-anchors --purpose=server-auth --format=pem-bundle /tmp/certs.pem && cat /tmp/certs.pem" | get_fingerprints > /tmp/java-truststore-updated-fingerprints.txt
85+
86+
# Verify that the stores are semantically identical before and after update-ca-certificates.
87+
diff /tmp/ca-bundle-fingerprints.txt /tmp/ca-bundle-updated-fingerprints.txt
88+
echo "CA bundles before and after update-ca-certificates are identical."
89+
90+
diff /tmp/java-truststore-fingerprints.txt /tmp/java-truststore-updated-fingerprints.txt
91+
echo "Java truststores before and after update-ca-certificates are identical."

hack/update-packages.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ set -ex
77

88
(cd internal/cli/testdata && \
99
melange build --arch arm64 --arch amd64 -r https://packages.wolfi.dev/os -k https://packages.wolfi.dev/os/wolfi-signing.rsa.pub --signing-key ./melange.rsa pretend-baselayout.melange.yaml && \
10-
melange build --arch arm64 --arch amd64 -r https://packages.wolfi.dev/os -k https://packages.wolfi.dev/os/wolfi-signing.rsa.pub --signing-key ./melange.rsa replayout.melange.yaml)
10+
melange build --arch arm64 --arch amd64 -r https://packages.wolfi.dev/os -k https://packages.wolfi.dev/os/wolfi-signing.rsa.pub --signing-key ./melange.rsa replayout.melange.yaml && \
11+
melange build --arch arm64 --arch amd64 -r https://packages.wolfi.dev/os -k https://packages.wolfi.dev/os/wolfi-signing.rsa.pub --signing-key ./melange.rsa custom-ca-certs-1.melange.yaml && \
12+
melange build --arch arm64 --arch amd64 -r https://packages.wolfi.dev/os -k https://packages.wolfi.dev/os/wolfi-signing.rsa.pub --signing-key ./melange.rsa custom-ca-certs-2.melange.yaml)
1113
(cd internal/cli &&
1214
apko lock ./testdata/apko.yaml)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
contents:
2+
keyring:
3+
- ./testdata/melange.rsa.pub
4+
repositories:
5+
- ./testdata/packages
6+
packages:
7+
- pretend-baselayout
8+
- custom-ca-certs-1
9+
- custom-ca-certs-2
10+
11+
certificates:
12+
providers:
13+
- custom-ca-certificates
14+
15+
archs:
16+
- x86_64
17+
- aarch64
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package:
2+
name: custom-ca-certs-1
3+
version: 1.0.0
4+
epoch: 0
5+
description: "custom CA certificates package 1 (test)"
6+
copyright:
7+
- license: MIT
8+
dependencies:
9+
provides:
10+
- custom-ca-certificates
11+
12+
environment:
13+
contents:
14+
packages:
15+
- busybox
16+
17+
pipeline:
18+
- name: Install certificates
19+
runs: |
20+
mkdir -p ${{targets.destdir}}/usr/local/share/ca-certificates
21+
cat >${{targets.destdir}}/usr/local/share/ca-certificates/cert-a.crt <<'CERTEOF'
22+
-----BEGIN CERTIFICATE-----
23+
MIIFmDCCA4CgAwIBAgIQU9C87nMpOIFKYpfvOHFHFDANBgkqhkiG9w0BAQsFADBm
24+
MQswCQYDVQQGEwJVUzEzMDEGA1UEChMqKFNUQUdJTkcpIEludGVybmV0IFNlY3Vy
25+
aXR5IFJlc2VhcmNoIEdyb3VwMSIwIAYDVQQDExkoU1RBR0lORykgUHJldGVuZCBQ
26+
ZWFyIFgxMB4XDTE1MDYwNDExMDQzOFoXDTM1MDYwNDExMDQzOFowZjELMAkGA1UE
27+
BhMCVVMxMzAxBgNVBAoTKihTVEFHSU5HKSBJbnRlcm5ldCBTZWN1cml0eSBSZXNl
28+
YXJjaCBHcm91cDEiMCAGA1UEAxMZKFNUQUdJTkcpIFByZXRlbmQgUGVhciBYMTCC
29+
AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALbagEdDTa1QgGBWSYkyMhsc
30+
ZXENOBaVRTMX1hceJENgsL0Ma49D3MilI4KS38mtkmdF6cPWnL++fgehT0FbRHZg
31+
jOEr8UAN4jH6omjrbTD++VZneTsMVaGamQmDdFl5g1gYaigkkmx8OiCO68a4QXg4
32+
wSyn6iDipKP8utsE+x1E28SA75HOYqpdrk4HGxuULvlr03wZGTIf/oRt2/c+dYmD
33+
oaJhge+GOrLAEQByO7+8+vzOwpNAPEx6LW+crEEZ7eBXih6VP19sTGy3yfqK5tPt
34+
TdXXCOQMKAp+gCj/VByhmIr+0iNDC540gtvV303WpcbwnkkLYC0Ft2cYUyHtkstO
35+
fRcRO+K2cZozoSwVPyB8/J9RpcRK3jgnX9lujfwA/pAbP0J2UPQFxmWFRQnFjaq6
36+
rkqbNEBgLy+kFL1NEsRbvFbKrRi5bYy2lNms2NJPZvdNQbT/2dBZKmJqxHkxCuOQ
37+
FjhJQNeO+Njm1Z1iATS/3rts2yZlqXKsxQUzN6vNbD8KnXRMEeOXUYvbV4lqfCf8
38+
mS14WEbSiMy87GB5S9ucSV1XUrlTG5UGcMSZOBcEUpisRPEmQWUOTWIoDQ5FOia/
39+
GI+Ki523r2ruEmbmG37EBSBXdxIdndqrjy+QVAmCebyDx9eVEGOIpn26bW5LKeru
40+
mJxa/CFBaKi4bRvmdJRLAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
41+
Af8EBTADAQH/MB0GA1UdDgQWBBS182Xy/rAKkh/7PH3zRKCsYyXDFDANBgkqhkiG
42+
9w0BAQsFAAOCAgEAncDZNytDbrrVe68UT6py1lfF2h6Tm2p8ro42i87WWyP2LK8Y
43+
nLHC0hvNfWeWmjZQYBQfGC5c7aQRezak+tHLdmrNKHkn5kn+9E9LCjCaEsyIIn2j
44+
qdHlAkepu/C3KnNtVx5tW07e5bvIjJScwkCDbP3akWQixPpRFAsnP+ULx7k0aO1x
45+
qAeaAhQ2rgo1F58hcflgqKTXnpPM02intVfiVVkX5GXpJjK5EoQtLceyGOrkxlM/
46+
sTPq4UrnypmsqSagWV3HcUlYtDinc+nukFk6eR4XkzXBbwKajl0YjztfrCIHOn5Q
47+
CJL6TERVDbM/aAPly8kJ1sWGLuvvWYzMYgLzDul//rUF10gEMWaXVZV51KpS9DY/
48+
5CunuvCXmEQJHo7kGcViT7sETn6Jz9KOhvYcXkJ7po6d93A/jy4GKPIPnsKKNEmR
49+
xUuXY4xRdh45tMJnLTUDdC9FIU0flTeO9/vNpVA8OPU1i14vCz+MU8KX1bV3GXm/
50+
fxlB7VBBjX9v5oUep0o/j68R/iDlCOM4VVfRa8gX6T2FU7fNdatvGro7uQzIvWof
51+
gN9WUwCbEMBy/YhBSrXycKA8crgGg3x1mIsopn88JKwmMBa68oS7EHM9w7C4y71M
52+
7DiA+/9Qdp9RBWJpTS9i/mDnJg1xvo8Xz49mrrgfmcAXTCJqXi24NatI3Oc=
53+
-----END CERTIFICATE-----
54+
CERTEOF
55+
cat >${{targets.destdir}}/usr/local/share/ca-certificates/cert-b.crt <<'CERTEOF'
56+
-----BEGIN CERTIFICATE-----
57+
MIICTjCCAdSgAwIBAgIRAIPgc3k5LlLVLtUUvs4K/QcwCgYIKoZIzj0EAwMwaDEL
58+
MAkGA1UEBhMCVVMxMzAxBgNVBAoTKihTVEFHSU5HKSBJbnRlcm5ldCBTZWN1cml0
59+
eSBSZXNlYXJjaCBHcm91cDEkMCIGA1UEAxMbKFNUQUdJTkcpIEJvZ3VzIEJyb2Nj
60+
b2xpIFgyMB4XDTIwMDkwNDAwMDAwMFoXDTQwMDkxNzE2MDAwMFowaDELMAkGA1UE
61+
BhMCVVMxMzAxBgNVBAoTKihTVEFHSU5HKSBJbnRlcm5ldCBTZWN1cml0eSBSZXNl
62+
YXJjaCBHcm91cDEkMCIGA1UEAxMbKFNUQUdJTkcpIEJvZ3VzIEJyb2Njb2xpIFgy
63+
MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEOvS+w1kCzAxYOJbA06Aw0HFP2tLBLKPo
64+
FQqR9AMskl1nC2975eQqycR+ACvYelA8rfwFXObMHYXJ23XLB+dAjPJVOJ2OcsjT
65+
VqO4dcDWu+rQ2VILdnJRYypnV1MMThVxo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
66+
VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU3tGjWWQOwZo2o0busBB2766XlWYwCgYI
67+
KoZIzj0EAwMDaAAwZQIwRcp4ZKBsq9XkUuN8wfX+GEbY1N5nmCRc8e80kUkuAefo
68+
uc2j3cICeXo1cOybQ1iWAjEA3Ooawl8eQyR4wrjCofUE8h44p0j7Yl/kBlJZT8+9
69+
vbtH7QiVzeKCOTQPINyRql6P
70+
-----END CERTIFICATE-----
71+
CERTEOF
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package:
2+
name: custom-ca-certs-2
3+
version: 1.0.0
4+
epoch: 0
5+
description: "custom CA certificates package 2 (test)"
6+
copyright:
7+
- license: MIT
8+
dependencies:
9+
provides:
10+
- custom-ca-certificates
11+
12+
environment:
13+
contents:
14+
packages:
15+
- busybox
16+
17+
pipeline:
18+
- name: Install certificates
19+
runs: |
20+
mkdir -p ${{targets.destdir}}/usr/local/share/ca-certificates
21+
cat >${{targets.destdir}}/usr/local/share/ca-certificates/cert-c.crt <<'CERTEOF'
22+
-----BEGIN CERTIFICATE-----
23+
MIIBwjCCAWegAwIBAgIUBKZDifzRAz30jwlcoQLIOxkBPLMwCgYIKoZIzj0EAwIw
24+
NTEeMBwGA1UEAwwVVGVzdCBDQSBDZXJ0aWZpY2F0ZSAzMRMwEQYDVQQKDApUZXN0
25+
IE9yZyAzMCAXDTI2MDIyNzIwMzk1OVoYDzIxMjYwMjAzMjAzOTU5WjA1MR4wHAYD
26+
VQQDDBVUZXN0IENBIENlcnRpZmljYXRlIDMxEzARBgNVBAoMClRlc3QgT3JnIDMw
27+
WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARx/10O/q2rOnQtpBXHjARAUryfNWjD
28+
UXeshzFk44hrv45loTsGQcyb5vAL6h3FSdBN91njUch4eF1NEYLKoR3Qo1MwUTAd
29+
BgNVHQ4EFgQUhLbWEa0IUIixKPBVvuKxhK6UMnMwHwYDVR0jBBgwFoAUhLbWEa0I
30+
UIixKPBVvuKxhK6UMnMwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNJADBG
31+
AiEAqgTlOPOiNJLPJhMjRl9Zpaq6TTGfh+awe7N3fcEdHVICIQDfgVRRkuv1KTWk
32+
44YBh2/IaTSFwFo8cd39Fnv7CYi/2g==
33+
-----END CERTIFICATE-----
34+
CERTEOF
35+
cat >${{targets.destdir}}/usr/local/share/ca-certificates/cert-d.crt <<'CERTEOF'
36+
-----BEGIN CERTIFICATE-----
37+
MIIBwTCCAWegAwIBAgIUPrm4YvABD98JhdU93qPsAgryo0UwCgYIKoZIzj0EAwIw
38+
NTEeMBwGA1UEAwwVVGVzdCBDQSBDZXJ0aWZpY2F0ZSA0MRMwEQYDVQQKDApUZXN0
39+
IE9yZyA0MCAXDTI2MDIyNzIwNDAwMFoYDzIxMjYwMjAzMjA0MDAwWjA1MR4wHAYD
40+
VQQDDBVUZXN0IENBIENlcnRpZmljYXRlIDQxEzARBgNVBAoMClRlc3QgT3JnIDQw
41+
WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQbR9hBg7/IeSBYJzUvBUxnnaNmoOJj
42+
ESG5CiOa2980CC5aixcLof5kk/9K16B+OLIGSUE+Ya98N0vNP8KmDmvBo1MwUTAd
43+
BgNVHQ4EFgQU6ZlpZtkvodhxZX1aRsM44dY0SJ8wHwYDVR0jBBgwFoAU6ZlpZtkv
44+
odhxZX1aRsM44dY0SJ8wDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNIADBF
45+
AiARCNSY4WZ7Tl1oAmWghJz0Sxzi57JY4pdrvzyzYQNrhgIhAPMAzTOf33fVRhaX
46+
wB7TKj2HAGTDpoliTH80SMWJN3jK
47+
-----END CERTIFICATE-----
48+
CERTEOF
169 Bytes
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)