show_servers_crt.sh 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #!/bin/bash
  2. set -o errexit
  3. set -o nounset
  4. set -o pipefail
  5. show_usage() {
  6. echo "Usage: $0 <index.txt>"
  7. echo "Default index_txt: /etc/openvpn/server/server/rsa/pki/index.txt"
  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. main() {
  29. # Argument handling
  30. [[ $# -lt 1 ]] && show_usage
  31. check_permissions
  32. PKI_DIR=$(dirname "${1}")
  33. validate_pki_dir "${PKI_DIR}"
  34. find "${PKI_DIR}/issued/" \( -name "*.crt" -o -name "*.pem" -o -name "*.cer" \) -print0 | while IFS= read -r -d '' cert; do
  35. # Одновременно получаем subject и проверяем расширения
  36. openssl_output=$(openssl x509 -in "$cert" -subject -noout -ext extendedKeyUsage -purpose 2>/dev/null)
  37. username=$(basename "${cert}" | sed 's/\.[^.]*$//')
  38. CN=$(echo "$openssl_output" | grep 'subject=' | sed 's/.*CN=//;s/,.*//')
  39. # Проверяем расширения из одного вывода openssl
  40. if echo "$openssl_output" | grep -q "TLS Web Server Authentication\|serverAuth" ||
  41. echo "$openssl_output" | grep -q "SSL server : Yes"; then
  42. echo "$username"
  43. [ "${username}" != "${CN}" ] && echo "$CN"
  44. fi
  45. done
  46. }
  47. main "$@"