Skip to content

Instantly share code, notes, and snippets.

@AfroThundr3007730
Last active April 16, 2025 02:30
Show Gist options
  • Save AfroThundr3007730/ba99753dda66fc4abaf30fb5c0e5d012 to your computer and use it in GitHub Desktop.
Save AfroThundr3007730/ba99753dda66fc4abaf30fb5c0e5d012 to your computer and use it in GitHub Desktop.
Import DoD root certificates into linux CA store
#!/bin/bash
# Imports DoD root certificates into Linux CA store
# Version 0.4.1 updated 20241216 by AfroThundr
# SPDX-License-Identifier: GPL-3.0-or-later
# For issues or updated versions of this script, browse to the following URL:
# https://gist.github.com/AfroThundr3007730/ba99753dda66fc4abaf30fb5c0e5d012
# Dependencies: curl gawk openssl unzip wget
set -euo pipefail
shopt -s extdebug nullglob
add_dod_certs() {
local bundle cert certdir file form tmpdir url update
trap '[[ -d ${tmpdir:-} ]] && rm -fr $tmpdir' EXIT INT TERM
# Location of bundle from DISA site
url='https://public.cyber.mil/pki-pke/pkipke-document-library/'
bundle=$(curl -s $url | awk -F '"' 'tolower($2) ~ /dod.zip/ {print $2}')
# Set cert directory and update command based on OS
[[ -f /etc/os-release ]] && source /etc/os-release
if [[ ${ID:-} =~ (fedora|rhel|centos) ||
${ID_LIKE:-} =~ (fedora|rhel|centos) ]]; then
certdir=/etc/pki/ca-trust/source/anchors
update='update-ca-trust'
elif [[ ${ID:-} =~ (debian|ubuntu|mint) ||
${ID_LIKE:-} =~ (debian|ubuntu|mint) ]]; then
certdir=/usr/local/share/ca-certificates
update='update-ca-certificates'
else
certdir=${1:-} && update=${2:-}
fi
[[ ${certdir:-} && ${update:-} ]] || {
printf 'Unable to autodetect OS using /etc/os-release.\n'
printf 'Please provide CA certificate directory and update command.\n'
printf 'Example: %s /cert/store/location update-cmd\n' "${0##*/}"
exit 1
}
# Extract the bundle
wget -qP "${tmpdir:=$(mktemp -d)}" "$bundle"
unzip -qj "$tmpdir"/"${bundle##*/}" -d "$tmpdir"
# Check for existence of PEM or DER format p7b.
for file in "$tmpdir"/*_dod_{pem,der}.p7b; do
# Iterate over glob instead of testing directly (SC2144)
[[ -f ${file:-} ]] && form=${file%.*} && form=${form##*_} && break
done
[[ ${form:-} && ${file:-} ]] || { printf 'No bundles found!\n' && exit 1; }
# Convert the PKCS#7 bundle into individual PEM files
openssl pkcs7 -print_certs -inform "$form" -in "$file" |
awk -v d="$tmpdir" \
'BEGIN {c=0} /subject=/ {c++} {print > d "/cert." c ".pem"}'
# Rename the files based on the CA name
for cert in "$tmpdir"/cert.*.pem; do
mv "$cert" "$certdir"/"$(
openssl x509 -noout -subject -in "$cert" |
awk -F '(=|= )' '{print gensub(/ /, "_", 1, $NF)}'
)".crt
done
# Remove temp files and update certificate stores
rm -fr "$tmpdir" && $update
}
# Only execute if not being sourced
[[ ${BASH_SOURCE[0]} == "$0" ]] || return 0 && add_dod_certs "$@"
@senterfd-jrg
Copy link

@allebone - I use the code above with some of the modifications that the users have reported. @AfroThundr3007730 did incorporate a bunch of stuff as he mentioned. His script is a big help. The DoD site continually changes their structures which requires a modification to the script. I have come here to this chat and seen recommended updates within a day to hours of required changes based on DoD site changes.

@aaronlippold
Copy link

aaronlippold commented Apr 16, 2025 via email

@allebone
Copy link

@senterfd-jrg @AfroThundr3007730 I hope my comment wasn’t taken as a complaint or criticism. TBH, I was a little tired and on a small screen with a half-wit understanding of the GIST revisions tab. (Which I didn’t see until today)

I’m just getting started on a base install of 72 servers, and this problem plagues us! (Times a ton)

I’m not scripting savvy but if there is anything I can do to help…let me know. Or I can go back to lurking until someone wants a layman to test. :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment