Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add test for caServerCert profile #4577

Merged
merged 1 commit into from
Sep 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
192 changes: 192 additions & 0 deletions .github/workflows/ca-profile-caServerCert-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
name: CA with caServerCert profile

on:
workflow_call:
inputs:
db-image:
required: false
type: string

jobs:
test:
name: Test
runs-on: ubuntu-latest
env:
SHARED: /tmp/workdir/pki
steps:
- name: Clone repository
uses: actions/checkout@v3

- name: Retrieve PKI images
uses: actions/cache@v3
with:
key: pki-images-${{ github.sha }}
path: pki-images.tar

- name: Load PKI images
run: docker load --input pki-images.tar

- name: Create network
run: docker network create example

- name: Set up DS container
run: |
tests/bin/ds-container-create.sh ds
env:
IMAGE: ${{ inputs.db-image }}
HOSTNAME: ds.example.com
PASSWORD: Secret.123

- name: Connect DS container to network
run: docker network connect example ds --alias ds.example.com

- name: Set up PKI container
run: |
tests/bin/runner-init.sh pki
env:
HOSTNAME: pki.example.com

- name: Connect PKI container to network
run: docker network connect example pki --alias pki.example.com

- name: Install CA
run: |
docker exec pki pkispawn \
-f /usr/share/pki/server/examples/installation/ca.cfg \
-s CA \
-D pki_ds_url=ldap://ds.example.com:3389 \
-D pki_cert_id_generator=random \
-D pki_request_id_generator=random \
-v

- name: Configure caServerCert profile
run: |
# allow user-specified SAN extension
docker exec pki sed -i \
-e "s/^\(policyset.serverCertSet.list\)=\(.*\)$/\1=\2,13/" \
-e '$ a policyset.serverCertSet.13.constraint.class_id=noConstraintImpl' \
-e '$ a policyset.serverCertSet.13.constraint.name=No Constraint' \
-e '$ a policyset.serverCertSet.13.default.class_id=userExtensionDefaultImpl' \
-e '$ a policyset.serverCertSet.13.default.name=User supplied extension in CSR' \
-e '$ a policyset.serverCertSet.13.default.params.userExtOID=2.5.29.17' \
/etc/pki/pki-tomcat/ca/profiles/ca/caServerCert.cfg

# require unique subject name
docker exec pki sed -i \
-e "s/^\(policyset.serverCertSet.list\)=\(.*\)$/\1=\2,14/" \
-e '$ a policyset.serverCertSet.14.constraint.class_id=uniqueSubjectNameConstraintImpl' \
-e '$ a policyset.serverCertSet.14.constraint.name=Unique Subject Name Constraint' \
-e '$ a policyset.serverCertSet.14.default.class_id=noDefaultImpl' \
-e '$ a policyset.serverCertSet.14.default.name=No Default' \
/etc/pki/pki-tomcat/ca/profiles/ca/caServerCert.cfg

# check updated profile
docker exec pki cat /etc/pki/pki-tomcat/ca/profiles/ca/caServerCert.cfg

docker exec pki pki-server ca-redeploy --wait

- name: Set up CA admin
run: |
docker exec pki pki-server cert-export ca_signing --cert-file ca_signing.crt
docker exec pki pki client-cert-import ca_signing --ca-cert ca_signing.crt
docker exec pki pki pkcs12-import \
--pkcs12 /root/.dogtag/pki-tomcat/ca_admin_cert.p12 \
--pkcs12-password Secret.123

- name: Create SSL server cert
run: |
# generate cert request
docker exec pki pki \
nss-cert-request \
--subject "CN=server.example.com" \
--ext /usr/share/pki/server/certs/sslserver.conf \
--subjectAltName "critical, DNS:www.example.com" \
--csr sslserver.csr

docker exec pki openssl req -text -noout -in sslserver.csr | tee output

# verfiy SAN extension in cert request
echo "X509v3 Subject Alternative Name: critical" > expected
echo "DNS:www.example.com" >> expected
sed -En 'N; s/^ *(X509v3 Subject Alternative Name: .*)\n *(.*)$/\1\n\2/p; D' output | tee actual
diff actual expected

# submit cert request
docker exec pki pki \
ca-cert-request-submit \
--profile caServerCert \
--csr-file sslserver.csr | tee output

REQUEST_ID=$(sed -n -e 's/^ *Request ID: *\(.*\)$/\1/p' output)
echo "REQUEST_ID: $REQUEST_ID"

# issue cert
docker exec pki pki \
-n caadmin \
ca-cert-request-approve \
--force \
$REQUEST_ID | tee output

CERT_ID=$(sed -n -e 's/^ *Certificate ID: *\(.*\)$/\1/p' output)
echo "CERT_ID: $CERT_ID"

# export cert
docker exec pki pki ca-cert-export $CERT_ID --output-file sslserver.crt

docker exec pki openssl x509 -text -noout -in sslserver.crt | tee output

# verfiy SAN extension in cert
echo "X509v3 Subject Alternative Name: critical" > expected
echo "DNS:www.example.com" >> expected
sed -En 'N; s/^ *(X509v3 Subject Alternative Name: .*)\n *(.*)$/\1\n\2/p; D' output | tee actual
diff actual expected

- name: Create SSL server cert with same subject name
run: |
# generate cert request
docker exec pki pki \
nss-cert-request \
--subject "CN=server.example.com" \
--ext /usr/share/pki/server/certs/sslserver.conf \
--subjectAltName "critical, DNS:pki.example.com" \
--csr sslserver.csr

docker exec pki openssl req -text -noout -in sslserver.csr | tee output

# verfiy SAN extension
echo "X509v3 Subject Alternative Name: critical" > expected
echo "DNS:pki.example.com" >> expected
sed -En 'N; s/^ *(X509v3 Subject Alternative Name: .*)\n *(.*)$/\1\n\2/p; D' output | tee actual
diff actual expected

# submit cert request
docker exec pki pki \
ca-cert-request-submit \
--profile caServerCert \
--csr-file sslserver.csr | tee output

echo "Request Status: rejected" > expected
sed -n "s/^\s*\(Request Status:.*\)$/\1/p" output > actual
diff expected actual

echo "Reason: Subject Name Not Unique CN=server.example.com" > expected
sed -n "s/^\s*\(Reason:.*\)$/\1/p" output > actual
diff expected actual

- name: Gather artifacts
if: always()
run: |
tests/bin/ds-artifacts-save.sh --output=/tmp/artifacts/pki ds
tests/bin/pki-artifacts-save.sh pki
continue-on-error: true

- name: Remove CA
run: docker exec pki pkidestroy -i pki-tomcat -s CA -v

- name: Upload artifacts
if: always()
uses: actions/upload-artifact@v3
with:
name: ca-profile-caServerCert
path: |
/tmp/artifacts/pki
7 changes: 7 additions & 0 deletions .github/workflows/ca-tests2.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,13 @@ jobs:
with:
db-image: ${{ needs.init.outputs.db-image }}

ca-profile-caServerCert-test:
name: CA with caServerCert profile
needs: [init, build]
uses: ./.github/workflows/ca-profile-caServerCert-test.yml
with:
db-image: ${{ needs.init.outputs.db-image }}

ca-secure-ds-test:
name: CA with secure DS
needs: [init, build]
Expand Down
Loading