show_client_crt.sh 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #!/bin/bash
  2. set -o errexit
  3. set -o nounset
  4. set -o pipefail
  5. show_usage() {
  6. echo "Usage: $0 <login> [pki_dir]"
  7. echo "Default pki_dir: /etc/openvpn/server/server/rsa/pki"
  8. exit 1
  9. }
  10. validate_pki_dir() {
  11. local pki_dir=$1
  12. if [[ ! -d "${pki_dir}" || ! -f "${pki_dir}/index.txt" ]]; then
  13. echo "Error: Invalid PKI directory - missing index.txt" >&2
  14. exit 2
  15. fi
  16. }
  17. find_cert_file() {
  18. local cn=$1 pki_dir=$2
  19. local cert_file
  20. # Try standard location first
  21. cert_file="${pki_dir}/issued/${cn}.crt"
  22. [[ -f "${cert_file}" ]] && echo "${cert_file}" && return 0
  23. # Fallback to serial-based lookup
  24. local serial
  25. serial=$(awk -v cn="${cn}" '$0 ~ "/CN=" cn "/" && $1 == "V" {print $3}' "${pki_dir}/index.txt")
  26. [[ -z "${serial}" ]] && return 1
  27. cert_file="${pki_dir}/certs_by_serial/${serial}.pem"
  28. [[ -f "${cert_file}" ]] && echo "${cert_file}" && return 0
  29. return 1
  30. }
  31. find_key_file() {
  32. local cn=$1 pki_dir=$2 serial=$3
  33. local key_file
  34. # Try standard locations
  35. for candidate in "${pki_dir}/private/${cn}.key" "${pki_dir}/private/${serial}.key"; do
  36. if [[ -f "${candidate}" ]]; then
  37. echo "${candidate}"
  38. return 0
  39. fi
  40. done
  41. return 1
  42. }
  43. main() {
  44. # Argument handling
  45. [[ $# -lt 1 ]] && show_usage
  46. local CN=$1
  47. local PKI_DIR=${2:-/etc/openvpn/server/server/rsa/pki}
  48. validate_pki_dir "${PKI_DIR}"
  49. # Find certificate
  50. local CERT_FILE
  51. CERT_FILE=$(find_cert_file "${CN}" "${PKI_DIR}") || {
  52. echo "Error: Certificate for CN=${CN} not found" >&2
  53. exit 3
  54. }
  55. # Find serial number for key lookup
  56. local SERIAL
  57. SERIAL=$(openssl x509 -in "${CERT_FILE}" -noout -serial | cut -d= -f2)
  58. # Find private key
  59. local KEY_FILE
  60. KEY_FILE=$(find_key_file "${CN}" "${PKI_DIR}" "${SERIAL}") || {
  61. echo "Error: Private key for CN=${CN} not found" >&2
  62. exit 4
  63. }
  64. # Output results
  65. echo "<cert>"
  66. # openssl x509 -in "${CERT_FILE}" -notext
  67. openssl x509 -in "${CERT_FILE}"
  68. echo "</cert>"
  69. echo
  70. echo "<key>"
  71. cat "${KEY_FILE}"
  72. echo "</key>"
  73. }
  74. main "$@"