generate-jks.sh 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. #! /bin/sh
  2. set -ex
  3. function generate_JKS_chain() {
  4. dir=${SCRATCH_DIR:-_output}
  5. ADD_OID=$1
  6. NODE_NAME=$2
  7. CERT_NAMES=${3:-$NODE_NAME}
  8. ks_pass=${KS_PASS:-kspass}
  9. ts_pass=${TS_PASS:-tspass}
  10. rm -rf $NODE_NAME
  11. extension_names=""
  12. for name in ${CERT_NAMES//,/ }; do
  13. extension_names="${extension_names},dns:${name}"
  14. done
  15. if [ "$ADD_OID" = true ]; then
  16. extension_names="${extension_names},oid:1.2.3.4.5.5"
  17. fi
  18. echo Generating keystore and certificate for node $NODE_NAME
  19. keytool -genkey \
  20. -alias $NODE_NAME \
  21. -keystore $dir/$NODE_NAME.jks \
  22. -keypass $ks_pass \
  23. -storepass $ks_pass \
  24. -keyalg RSA \
  25. -keysize 2048 \
  26. -validity 712 \
  27. -dname "CN=$NODE_NAME, OU=OpenShift, O=Logging" \
  28. -ext san=dns:localhost,ip:127.0.0.1"${extension_names}"
  29. echo Generating certificate signing request for node $NODE_NAME
  30. keytool -certreq \
  31. -alias $NODE_NAME \
  32. -keystore $dir/$NODE_NAME.jks \
  33. -storepass $ks_pass \
  34. -file $dir/$NODE_NAME.csr \
  35. -keyalg rsa \
  36. -dname "CN=$NODE_NAME, OU=OpenShift, O=Logging" \
  37. -ext san=dns:localhost,ip:127.0.0.1"${extension_names}"
  38. echo Sign certificate request with CA
  39. openssl ca \
  40. -in $dir/$NODE_NAME.csr \
  41. -notext \
  42. -out $dir/$NODE_NAME.crt \
  43. -config $dir/signing.conf \
  44. -extensions v3_req \
  45. -batch \
  46. -extensions server_ext
  47. echo "Import back to keystore (including CA chain)"
  48. keytool \
  49. -import \
  50. -file $dir/ca.crt \
  51. -keystore $dir/$NODE_NAME.jks \
  52. -storepass $ks_pass \
  53. -noprompt -alias sig-ca
  54. keytool \
  55. -import \
  56. -file $dir/$NODE_NAME.crt \
  57. -keystore $dir/$NODE_NAME.jks \
  58. -storepass $ks_pass \
  59. -noprompt \
  60. -alias $NODE_NAME
  61. echo All done for $NODE_NAME
  62. }
  63. function generate_JKS_client_cert() {
  64. NODE_NAME="$1"
  65. ks_pass=${KS_PASS:-kspass}
  66. ts_pass=${TS_PASS:-tspass}
  67. dir=${SCRATCH_DIR:-_output} # for writing files to bundle into secrets
  68. echo Generating keystore and certificate for node ${NODE_NAME}
  69. keytool -genkey \
  70. -alias $NODE_NAME \
  71. -keystore $dir/$NODE_NAME.jks \
  72. -keyalg RSA \
  73. -keysize 2048 \
  74. -validity 712 \
  75. -keypass $ks_pass \
  76. -storepass $ks_pass \
  77. -dname "CN=$NODE_NAME, OU=OpenShift, O=Logging"
  78. echo Generating certificate signing request for node $NODE_NAME
  79. keytool -certreq \
  80. -alias $NODE_NAME \
  81. -keystore $dir/$NODE_NAME.jks \
  82. -file $dir/$NODE_NAME.jks.csr \
  83. -keyalg rsa \
  84. -keypass $ks_pass \
  85. -storepass $ks_pass \
  86. -dname "CN=$NODE_NAME, OU=OpenShift, O=Logging"
  87. echo Sign certificate request with CA
  88. openssl ca \
  89. -in "$dir/$NODE_NAME.jks.csr" \
  90. -notext \
  91. -out "$dir/$NODE_NAME.jks.crt" \
  92. -config $dir/signing.conf \
  93. -extensions v3_req \
  94. -batch \
  95. -extensions server_ext
  96. echo "Import back to keystore (including CA chain)"
  97. keytool \
  98. -import \
  99. -file $dir/ca.crt \
  100. -keystore $dir/$NODE_NAME.jks \
  101. -storepass $ks_pass \
  102. -noprompt -alias sig-ca
  103. keytool \
  104. -import \
  105. -file $dir/$NODE_NAME.jks.crt \
  106. -keystore $dir/$NODE_NAME.jks \
  107. -storepass $ks_pass \
  108. -noprompt \
  109. -alias $NODE_NAME
  110. echo All done for $NODE_NAME
  111. }
  112. function join { local IFS="$1"; shift; echo "$*"; }
  113. function createTruststore() {
  114. echo "Import CA to truststore for validating client certs"
  115. keytool \
  116. -import \
  117. -file $dir/ca.crt \
  118. -keystore $dir/truststore.jks \
  119. -storepass $ts_pass \
  120. -noprompt -alias sig-ca
  121. }
  122. dir="$CERT_DIR"
  123. SCRATCH_DIR=$dir
  124. if [[ ! -f $dir/system.admin.jks || -z "$(keytool -list -keystore $dir/system.admin.jks -storepass kspass | grep sig-ca)" ]]; then
  125. generate_JKS_client_cert "system.admin"
  126. fi
  127. if [[ ! -f $dir/elasticsearch.jks || -z "$(keytool -list -keystore $dir/elasticsearch.jks -storepass kspass | grep sig-ca)" ]]; then
  128. generate_JKS_chain true elasticsearch "$(join , logging-es{,-ops})"
  129. fi
  130. if [[ ! -f $dir/logging-es.jks || -z "$(keytool -list -keystore $dir/logging-es.jks -storepass kspass | grep sig-ca)" ]]; then
  131. generate_JKS_chain false logging-es "$(join , logging-es{,-ops}{,-cluster}{,.${PROJECT}.svc.cluster.local})"
  132. fi
  133. [ ! -f $dir/truststore.jks ] && createTruststore
  134. # necessary so that the job knows it completed successfully
  135. exit 0