gen-x509-stuff 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #!/bin/sh
  2. set -eu
  3. revoke=
  4. san=
  5. base_dir="$1"
  6. export OPENSSL_CONFIG="$base_dir/openssl.cnf"
  7. export OPENSSL_SAN_CONFIG="$base_dir/openssl.cnf"
  8. while [ "${2##--}" != "$2" ]; do
  9. case "$2" in
  10. --revoke)
  11. revoke=1
  12. ;;
  13. --san)
  14. san=1
  15. # need an extra configuration file for that
  16. export OPENSSL_SAN_CONFIG="$base_dir/openssl.san.cnf"
  17. ;;
  18. *)
  19. echo "E: Unknown option '$2'"
  20. exit 1
  21. ;;
  22. esac
  23. shift
  24. done
  25. ca_name="$2"
  26. server_name="$3"
  27. if [ "${server_name##--}" != "$server_name" ]; then
  28. echo "F: Parameter mismatch"
  29. exit 1
  30. fi
  31. if [ -z "$server_name" ]; then
  32. echo "Usage: $(dirname "$0") <base-directory> <CA name> <server name>"
  33. exit 1
  34. fi
  35. dh_params="$base_dir/dhparams.pem"
  36. if [ ! -f "$dh_params" ]; then
  37. echo 'I: Generating dh parameter file. This may take some time.'
  38. openssl dhparam -2 -out "$dh_params" 2048
  39. fi
  40. export KEY_SIZE=4096
  41. export KEY_COUNTRY=DE
  42. export KEY_PROVINCE=Badenia
  43. export KEY_CITY=Littenweiler
  44. export KEY_ORG='A ngIRCd test site'
  45. export CA_DIR="$base_dir/$ca_name"
  46. export SERVER_DIR="$base_dir/$server_name"
  47. CRL_FILE="$CA_DIR/crl.pem"
  48. if [ ! -d "$CA_DIR" ]; then
  49. echo 'I: Setting up CA first'
  50. mkdir -p "$CA_DIR"
  51. touch "$CA_DIR/index.txt"
  52. echo '01' >"$CA_DIR/serial"
  53. export KEY_COMMON='CA'
  54. export KEY_EMAIL='ca@invalid.invalid'
  55. openssl req \
  56. -batch \
  57. -days 10 \
  58. -nodes \
  59. -new \
  60. -x509 \
  61. -sha1 \
  62. -newkey rsa:4096 \
  63. -keyout "$CA_DIR/root-ca.key" \
  64. -out "$CA_DIR/root-ca.crt" \
  65. -config "$OPENSSL_CONFIG"
  66. chmod 400 "$CA_DIR/root-ca.key"
  67. openssl ca \
  68. -gencrl \
  69. -out "$CRL_FILE" \
  70. -config "$OPENSSL_CONFIG"
  71. fi
  72. if [ "$san" ]; then
  73. export KEY_COMMON="$server_name.bogus"
  74. export SUBJ_ALT_NAME="$server_name"
  75. else
  76. export KEY_COMMON="$server_name"
  77. fi
  78. export KEY_EMAIL='ca@invalid.invalid'
  79. server_csr="$CA_DIR/$server_name.csr"
  80. server_crt="$CA_DIR/$server_name.crt"
  81. server_key="$CA_DIR/$server_name.key"
  82. if [ -f "$server_crt" ]; then
  83. echo "I: Certificate for '$server_name' already exists"
  84. exit 1
  85. fi
  86. echo 'I: Creating CSR'
  87. openssl req \
  88. -batch \
  89. -days 10 \
  90. -nodes \
  91. -new \
  92. -sha1 \
  93. -newkey rsa:4096 \
  94. -keyout "$server_key" \
  95. -out "$server_csr" \
  96. -config "$OPENSSL_SAN_CONFIG"
  97. echo 'I: Signing certificate'
  98. openssl ca \
  99. -extensions v3_ca \
  100. -batch \
  101. -days 10 \
  102. -out "$server_crt" \
  103. -in "$server_csr" \
  104. -config "$OPENSSL_SAN_CONFIG"
  105. if [ "$revoke" ]; then
  106. echo 'I: Revoking certificate'
  107. openssl ca \
  108. -revoke "$server_crt" \
  109. -config "$OPENSSL_CONFIG"
  110. openssl ca \
  111. -gencrl \
  112. -out "$CRL_FILE" \
  113. -config "$OPENSSL_CONFIG"
  114. fi
  115. exit 0