Just like for the JBoss Admin password (here), this blog will be for both Content Servers and Full Text Servers. I will provide commands below to change the passwords of the Java KeyStore for the Java Method Server (JMS) and Full Text Servers (Dsearch/IndexAgent). Again, JKS aren’t only used in the scope of Documentum so if you are here for the JKS and not for Documentum, that’s fine too ;).
The steps are exactly the same for all JKS files, it’s just a matter of integrating that inside Documentum. Therefore, I will continue to use the JMS for single JKS update and I will use the Dsearch/IndexAgent for multiple updates. The steps are pretty simple:
- Store the current and new password in variables
- Backup the old configuration and JKS files
- Update the JKS password
- Restart the components
- Verify that the components are running over https
I. JMS Java KeyStore
For the JMS Java KeyStore, you obviously need to connect to all Content Servers and then perform the steps. Below, I’m using a JKS named “my.keystore” which is placed right next to the standalone.xml file. So let’s do that:
[dmadmin@content_server_01 ~]$ read -s -p "Please enter the CURRENT JKS password: " currentpw; echo Please enter the CURRENT JKS password: [dmadmin@content_server_01 ~]$ read -s -p "Please enter the NEW JKS password: " newpw; echo Please enter the NEW JKS password: [dmadmin@content_server_01 ~]$ read -p "Please enter the name of the JKS file with extension: " jks_name Please enter the name of the JKS file with extension: my.keystore [dmadmin@content_server_01 ~]$ [dmadmin@content_server_01 ~]$ cd $DOCUMENTUM_SHARED/jboss7.1.1/server/DctmServer_MethodServer/configuration/ [dmadmin@content_server_01 ~]$ cp ${jks_name} ${jks_name}_bck_$(date +"%Y%m%d-%H%M%S") [dmadmin@content_server_01 ~]$ cp standalone.xml standalone.xml_bck_$(date +"%Y%m%d-%H%M%S") [dmadmin@content_server_01 ~]$ [dmadmin@content_server_01 ~]$ keytool -storepasswd -keystore ${jks_name} -storepass ${currentpw} -new ${newpw} [dmadmin@content_server_01 ~]$ keytool -keypasswd -keystore ${jks_name} -storepass ${newpw} -alias jms_alias -keypass ${currentpw} -new ${newpw} [dmadmin@content_server_01 ~]$
These last two commands are the ones updating the Java KeyStore and the key passwords. In case your JKS and its included key do not have the same password, you will have to use the real passwords at the end of the second line. If the last command (the 2nd keytool command) is working, it means that you changed the JKS password properly in the first keytool command because you are now able to change the key password using the new JKS password (-storepass ${newpw}). Still following me?
Once this has been done, the next step is simply to update the password in the JMS configuration file and restart the JMS:
[dmadmin@content_server_01 ~]$ grep "password=" standalone.xml <ssl name="https" password="Old_JKS_Password" certificate-key-file="$DOCUMENTUM_SHARED/jboss7.1.1/server/DctmServer_MethodServer/configuration/my.keystore" cipher-suite="TLS_RSA_WITH_AES_128_CBC_SHA"/> [dmadmin@content_server_01 ~]$ [dmadmin@content_server_01 ~]$ sed -i 's,(<[sk][se][ly].*password=")[^"]*,1'${newpw}',' standalone.xml [dmadmin@content_server_01 ~]$ [dmadmin@content_server_01 ~]$ grep "password=" standalone.xml <ssl name="https" password="New_JKS_Password" certificate-key-file="$DOCUMENTUM_SHARED/jboss7.1.1/server/DctmServer_MethodServer/configuration/my.keystore" cipher-suite="TLS_RSA_WITH_AES_128_CBC_SHA"/> [dmadmin@content_server_01 ~]$ [dmadmin@content_server_01 ~]$ cd $DOCUMENTUM_SHARED/jboss7.1.1/server [dmadmin@content_server_01 ~]$ ./stopMethodServer.sh [dmadmin@content_server_01 ~]$ [dmadmin@content_server_01 ~]$ nohup ./startMethodServer.sh >> nohup-JMS.out 2>&1 & [dmadmin@content_server_01 ~]$ [dmadmin@content_server_01 ~]$ sleep 30 [dmadmin@content_server_01 ~]$ [dmadmin@content_server_01 ~]$ curl -k -D - https://localhost:9082/DmMethods/servlet/DoMethod; echo HTTP/1.1 200 OK Content-Length: 144 Date: Sat, 22 Jul 2017 09:58:41 GMT Server: MethodServer <html><title>Documentum Java Method Server</title><body><font face="Verdana, Arial" size="-1"><p>Documentum Java Method Server</p></body></html> [dmadmin@content_server_01 ~]$
If the password of the JKS has been changed properly for the JKS file as well as in the configuration file, then you should get an HTTP 200 OK return code.
II. Dsearch/IndexAgent Java KeyStores
For the Dsearch/IndexAgent Java KeyStores, you obviously need to connect to all Full Text Servers and then perform the steps again. Below, I’m using a JKS named “my.keystore”. It doesn’t matter where this file is placed since the commands below will anyway just find them. However, by default this file will be placed right next to the standalone.xml file: this is the default setup if you used the “ConfigSSL.groovy” script to setup the xPlore in SSL (see this blog for information about that and a lot of other of my blogs to see issues related to this script/setup in SSL). These commands are adapted in case you have several IndexAgents installed. Please note that the commands below will set the same JKS password for all JBoss instances (all Dsearch/IndexAgents). Therefore, if that’s not what you want (if you have Subject Alternative Names for example), you will have to execute the commands for each keystore, one by one.
[xplore@full_text_server_01 ~]$ read -s -p "Please enter the CURRENT JKS password: " currentpw; echo Please enter the CURRENT JKS password: [xplore@full_text_server_01 ~]$ read -s -p "Please enter the NEW JKS password: " newpw; echo Please enter the NEW JKS password: [xplore@full_text_server_01 ~]$ read -p "Please enter the name of the JKS file with extension: " jks_name Please enter the name of the JKS file with extension: my.keystore [xplore@full_text_server_01 ~]$ [xplore@full_text_server_01 ~]$ for i in `find $XPLORE_HOME -name ${jks_name}`; do cp ${i} ${i}_bck_$(date +"%Y%m%d-%H%M%S"); done [xplore@full_text_server_01 ~]$ for i in `find $XPLORE_HOME -name standalone.xml`; do if [[ ${i} != */template/* ]]; then cp ${i} ${i}_bck_$(date +"%Y%m%d-%H%M%S"); fi; done [xplore@full_text_server_01 ~]$ [xplore@full_text_server_01 ~]$ for i in `find $XPLORE_HOME -name ${jks_name}`; do keytool -storepasswd -keystore ${i} -storepass ${currentpw} -new ${newpw}; done [xplore@full_text_server_01 ~]$ for i in `find $XPLORE_HOME -name ${jks_name}`; do keytool -keypasswd -keystore ${i} -storepass ${newpw} -alias ft_alias -keypass ${currentpw} -new ${newpw}; done [xplore@full_text_server_01 ~]$
At this point, all the Java KeyStore have been backed up and updated and the related standalone.xml files have been backed up too. The only remaining step is to replace the passwords in the standalone.xml files, restart the components and test again the availability of the xPlore components:
[xplore@full_text_server_01 ~]$ for i in `find $XPLORE_HOME -name standalone.xml`; do if [[ ${i} != */template/* ]]; then grep "password=" ${i}; fi; done <ssl name="https" password="Old_JKS_Password" certificate-key-file="$XPLORE_HOME/jboss7.1.1/server/DctmServer_PrimaryDsearch/configuration/my.keystore" cipher-suite="TLS_RSA_WITH_AES_128_CBC_SHA"/> <ssl name="https" password="Old_JKS_Password" certificate-key-file="$XPLORE_HOME/jboss7.1.1/server/DctmServer_Indexagent_DocBase1/configuration/my.keystore" cipher-suite="TLS_RSA_WITH_AES_128_CBC_SHA"/> <ssl name="https" password="Old_JKS_Password" certificate-key-file="$XPLORE_HOME/jboss7.1.1/server/DctmServer_Indexagent_DocBase2/configuration/my.keystore" cipher-suite="TLS_RSA_WITH_AES_128_CBC_SHA"/> <ssl name="https" password="Old_JKS_Password" certificate-key-file="$XPLORE_HOME/jboss7.1.1/server/DctmServer_Indexagent_DocBase3/configuration/my.keystore" cipher-suite="TLS_RSA_WITH_AES_128_CBC_SHA"/> [xplore@full_text_server_01 ~]$ [xplore@full_text_server_01 ~]$ for i in `find $XPLORE_HOME -name standalone.xml`; do if [[ ${i} != */template/* ]]; then sed -i 's,(<[sk][se][ly].*password=")[^"]*,1'${newpw}',' ${i}; fi; done [xplore@full_text_server_01 ~]$ [xplore@full_text_server_01 ~]$ for i in `find $XPLORE_HOME -name standalone.xml`; do if [[ ${i} != */template/* ]]; then grep "password=" ${i}; fi; done <ssl name="https" password="New_JKS_Password" certificate-key-file="$XPLORE_HOME/jboss7.1.1/server/DctmServer_PrimaryDsearch/configuration/my.keystore" cipher-suite="TLS_RSA_WITH_AES_128_CBC_SHA"/> <ssl name="https" password="New_JKS_Password" certificate-key-file="$XPLORE_HOME/jboss7.1.1/server/DctmServer_Indexagent_DocBase1/configuration/my.keystore" cipher-suite="TLS_RSA_WITH_AES_128_CBC_SHA"/> <ssl name="https" password="New_JKS_Password" certificate-key-file="$XPLORE_HOME/jboss7.1.1/server/DctmServer_Indexagent_DocBase2/configuration/my.keystore" cipher-suite="TLS_RSA_WITH_AES_128_CBC_SHA"/> <ssl name="https" password="New_JKS_Password" certificate-key-file="$XPLORE_HOME/jboss7.1.1/server/DctmServer_Indexagent_DocBase3/configuration/my.keystore" cipher-suite="TLS_RSA_WITH_AES_128_CBC_SHA"/> [xplore@full_text_server_01 ~]$ [xplore@full_text_server_01 ~]$ cd $XPLORE_HOME/jboss7.1.1/server [xplore@full_text_server_01 ~]$ for i in `ls stop*.sh`; do ./${i}; done [xplore@full_text_server_01 ~]$ [xplore@full_text_server_01 ~]$ nohup ./startPrimaryDsearch.sh >> nohup-PrimaryDsearch.out 2>&1 & [xplore@full_text_server_01 ~]$ for i in `ls startIndexag*.sh`; do ia=`echo $i|sed 's,start(.*).sh,1,'`; nohup ./$i >> nohup-$ia.out 2>&1 &; done [xplore@full_text_server_01 ~]$ [xplore@full_text_server_01 ~]$ sleep 30 [xplore@full_text_server_01 ~]$ [xplore@full_text_server_01 ~]$ curl -k -D - https://localhost:9302/dsearch/; echo HTTP/1.1 259 Server: Apache-Coyote/1.1 Pragma: No-cache Cache-Control: no-cache Expires: Thu, 01 Jan 1970 00:00:00 UTC Content-Type: text/html;charset=UTF-8 Content-Length: 65 Date: Sat, 22 Jul 2017 11:33:38 GMT The xPlore instance PrimaryDsearch [version=1.5.0020.0048] normal [xplore@full_text_server_01 ~]$ [xplore@full_text_server_01 ~]$ for i in `ls -d DctmServer_Indexag*`; do port=`grep '<socket-binding .*name="https"' ./${i}/configuration/standalone.xml|sed 's,.*port="([0-9]*).*,1,'`; echo; echo " ** Accessing IndexAgent URL of '${i}' (${port})"; curl -k -D - https://localhost:${port}/IndexAgent; done ** Accessing IndexAgent URL of 'DctmServer_Indexagent_DocBase1' (9202) HTTP/1.1 302 Moved Temporarily Server: Apache-Coyote/1.1 Location: https://localhost:9202/IndexAgent/ Transfer-Encoding: chunked Date: Sat, 22 Jul 2017 11:36:57 GMT ** Accessing IndexAgent URL of 'DctmServer_Indexagent_DocBase2' (9222) HTTP/1.1 302 Moved Temporarily Server: Apache-Coyote/1.1 Location: https://localhost:9222/IndexAgent/ Transfer-Encoding: chunked Date: Sat, 22 Jul 2017 11:36:57 GMT ** Accessing IndexAgent URL of 'DctmServer_Indexagent_DocBase3' (9242) HTTP/1.1 302 Moved Temporarily Server: Apache-Coyote/1.1 Location: https://localhost:9242/IndexAgent/ Transfer-Encoding: chunked Date: Sat, 22 Jul 2017 11:36:58 GMT [dmadmin@content_server_01 ~]$
For the Dsearch, the proper answer is a HTTP 259 return code while for the IndexAgent, I didn’t put an ending “/” in the URL so that we don’t have the full page of the IA loaded but only some header. Therefore HTTP 302 Moved Temporarily is the proper return code there.
Please note that for the “sed” commands above, I deliberately used “<[sk][se][ly]” even if for all JBoss 7.1.1 instances, the SSL configuration will always start with “<ssl “. The reason for that is to make the steps compatible with WidlFly 9.0.1 too (xPlore 1.6). There are a few differences between JBoss 7.1.1 and WildFly 9.0.1 and one of them is that the JKS password is now on a line starting with “<keystore ” so that’s why :).