show_servers_crt.sh 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #!/bin/bash
  2. set -o pipefail
  3. show_usage() {
  4. echo "Usage: $0 <index.txt>"
  5. echo "Default index_txt: /etc/openvpn/server/server/rsa/pki/index.txt"
  6. exit 1
  7. }
  8. log() {
  9. logger -t "openvpn-www" -p user.info "$1"
  10. echo "$1" # Также выводим в консоль для обратной связи
  11. }
  12. # Проверка прав
  13. check_permissions() {
  14. if [[ $EUID -ne 0 ]]; then
  15. log "Error: This script must be run as root" >&2
  16. exit 1
  17. fi
  18. }
  19. validate_pki_dir() {
  20. local pki_dir=$1
  21. if [[ ! -d "${pki_dir}" || ! -f "${pki_dir}/index.txt" ]]; then
  22. log "Error: Invalid PKI directory - missing index.txt"
  23. exit 2
  24. fi
  25. }
  26. main() {
  27. # Argument handling
  28. [[ $# -lt 1 ]] && show_usage
  29. check_permissions
  30. PKI_DIR=$(dirname "${1}")
  31. validate_pki_dir "${PKI_DIR}"
  32. find "${PKI_DIR}/issued/" \( -name "*.crt" -o -name "*.pem" -o -name "*.cer" \) -print0 | while IFS= read -r -d '' cert; do
  33. # Одновременно получаем subject и проверяем расширения
  34. openssl_output=$(openssl x509 -in "$cert" -subject -noout -ext extendedKeyUsage -purpose 2>/dev/null)
  35. username=$(basename "${cert}" | sed 's/\.[^.]*$//')
  36. CN=$(echo "$openssl_output" | grep 'subject=' | sed 's/.*CN=//;s/,.*//')
  37. # Проверяем расширения из одного вывода openssl
  38. # if echo "$openssl_output" | grep -q "TLS Web Server Authentication\|serverAuth" ||
  39. # echo "$openssl_output" | grep -q "SSL server : Yes"; then
  40. if echo "$openssl_output" | grep -q "TLS Web Server Authentication\|serverAuth"; then
  41. echo "$username"
  42. [ "${username}" != "${CN}" ] && echo "$CN"
  43. fi
  44. done
  45. exit 0
  46. }
  47. main "$@"