show_client_crt.sh 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. log() {
  11. logger -t "openvpn-www" -p user.info "$1"
  12. echo "$1" # Также выводим в консоль для обратной связи
  13. }
  14. # Проверка прав
  15. check_permissions() {
  16. if [[ $EUID -ne 0 ]]; then
  17. log "Error: This script must be run as root" >&2
  18. exit 1
  19. fi
  20. }
  21. validate_pki_dir() {
  22. local pki_dir=$1
  23. if [[ ! -d "${pki_dir}" || ! -f "${pki_dir}/index.txt" ]]; then
  24. log "Error: Invalid PKI directory - missing index.txt"
  25. exit 2
  26. fi
  27. }
  28. find_cert_file() {
  29. local cn=$1 pki_dir=$2
  30. local cert_file
  31. # Try standard location first
  32. cert_file="${pki_dir}/issued/${cn}.crt"
  33. [[ -f "${cert_file}" ]] && echo "${cert_file}" && return 0
  34. # Fallback to serial-based lookup
  35. local serial
  36. serial=$(awk -v cn="${cn}" '$0 ~ "/CN=" cn "/" && $1 == "V" {print $3}' "${pki_dir}/index.txt")
  37. [[ -z "${serial}" ]] && return 1
  38. cert_file="${pki_dir}/certs_by_serial/${serial}.pem"
  39. [[ -f "${cert_file}" ]] && echo "${cert_file}" && return 0
  40. return 1
  41. }
  42. find_key_file() {
  43. local cn=$1 pki_dir=$2 serial=$3
  44. local key_file
  45. # Try standard locations
  46. for candidate in "${pki_dir}/private/${cn}.key" "${pki_dir}/private/${serial}.key"; do
  47. if [[ -f "${candidate}" ]]; then
  48. echo "${candidate}"
  49. return 0
  50. fi
  51. done
  52. return 1
  53. }
  54. main() {
  55. # Argument handling
  56. [[ $# -lt 1 ]] && show_usage
  57. check_permissions
  58. local CN=$1
  59. local PKI_DIR=${2:-/etc/openvpn/server/server/rsa/pki}
  60. validate_pki_dir "${PKI_DIR}"
  61. # Find certificate
  62. local CERT_FILE
  63. CERT_FILE=$(find_cert_file "${CN}" "${PKI_DIR}") || {
  64. log "Error: Certificate for CN=${CN} not found"
  65. exit 3
  66. }
  67. # Find serial number for key lookup
  68. local SERIAL
  69. SERIAL=$(openssl x509 -in "${CERT_FILE}" -noout -serial | cut -d= -f2)
  70. # Find private key
  71. local KEY_FILE
  72. KEY_FILE=$(find_key_file "${CN}" "${PKI_DIR}" "${SERIAL}") || {
  73. log "Error: Private key for CN=${CN} not found"
  74. exit 4
  75. }
  76. # Output results
  77. echo "<cert>"
  78. openssl x509 -in "${CERT_FILE}"
  79. echo "</cert>"
  80. echo
  81. echo "<key>"
  82. cat "${KEY_FILE}"
  83. echo "</key>"
  84. exit 0
  85. }
  86. main "$@"