I described here different ways of logging on to the MQ Web Server on z/OS. This post describes how to use a digital certificate to logon. There is a lot of description, but the RACF statements needed are listed at the bottom.
I had set up my keystore and could logon to MQWEB on z/OS using certificates. I just wanted to not be prompted for a password.
Once it is set up it works well. I thought I would deliberately try to get as many things wrong, so I could document the symptoms and the cure. Despite this, I often had my head in the hands, asking “Why! – it worked yesterday”.
Can I use CHLAUTH ? No – because that is for the CHINIT, and you do not need to have the CHINIT running to run the web server.
Within one MQ Web Server, you can use both “certificate only” logon as well as using “certificate, userid and password” logon.
When using the SAF interface you specify parameters in the mqwebuser.xml file, such as keyrings, and what level of certificate checking you want.
Enable SAF messages.
If you use <safCredentials suppressAuthFailureMessage=”false” …> in the mqwebuser.xml then if a SAF request fails, there will be a message on the z/OS console. You would normally have this value set to “true” because when the browser (or REST client) reauthenticates (it could be every 10 seconds) you will get a message saying a userid does not have access to an APPL, or EJBROLE profile. If you change this (or make any change the mqwebuser.xnml file), issue the command
f CSQ9WEB,refresh,config
To pick up the changes.
Configure the server name
In the mqwebuser.xml file is <safCredentials profilePrefix=”MQWEB“…> there MQWEB identifies the server, and is used in the security profiles (see below).
SSL parameters
In the mqwebuser.xml file you specify
- <ssl …
- clientAuthenticationSupported=”true”|”false. The doc says The server requests that a client sends a certificate. The client’s certificate is optional
- clientAuthentication=”true”|”false” if true, then client must send a certificate.
- ssslProtocol=”TLSV1.2″
- keyStoreRef=”…”
- trustStoreRef=”…”
- id=”…”
- <sslDefault … sslRef=”…” this points to a particular <ssl id=…> definition. It allows you to have more than one <ssl definition, and pick one.
I think it would have been clearer if the parameters were clientAuthentication=”yes”|”no”|”optional”. See my interpretation of what these mean here.
Client authentication
The client certificate maps to a userid on z/OS, and this userid is used for access control.
The TLS handshake: You have a certificate on your client machine. There is a handshake with the server, where the certificate from the server is sent to the client, and the client verifies it. With TLS client authentication the client sends a certificate to the server. The server validates it.
If any of the following are false, it drops through to Connecting with a client certificate, and authenticate with userid and password below.
Find the z/OS userid for the certificate
The certificate is looked up in a RACDCERT MAP to get a userid for the certificate (see below for example statements). It could be a one to one mapping, or depending on say OU=TEST or C=GB, it can check on part of the DN. If this fails you get
ICH408I USER(START1 ) GROUP(SYS1 ) NAME(####################)
DIGITAL CERTIFICATE IS NOT DEFINED. CERTIFICATE SERIAL NUMBER(0194)
SUBJECT(CN=ADCDC.O=cpwebuser.C=GB) ISSUER(CN=SSCARSA1024.OU=CA.O=SSS.
C=GB).
Check the userid against the APPL class.
The userid is checked against the MQWEB profiles in the APPL class. (Where MQWEB is the name you configured in the web server configuration files). If this fails you get
ICH408I USER(ADCDE ) GROUP(TEST ) NAME(ADCDE ) MQWEB CL(APPL )
WARNING: INSUFFICIENT AUTHORITY ACCESS INTENT(READ ) ACCESS ALLOWED(NONE )
Pick the EJBROLE for the userid
There are several profiles in the EJBROLES class. If the userid has read access to the class, it userid gets the attribute. For example for the profile MQWEB.com.ibm.mq.console.MQWebAdmin, if the userid has at least READ access to the profile, it gets MQWEBADMIN privileges.
If these fail you get messages in the MQWEB message logs(s).
To suppress the RACF messages use option suppressAuthFailureMessage=”false” described above.
The userid needs access to at least one profile to be able to use the MQ Web server.
Use the right URL
The URL is like https://10.1.1.2:9443/ibmmq/console/
No password is needed to logon. If you get this far, displaying the userid information (click on the ⓘ icon) gives you Principal:ADCDE – Read-Only Administrator (Client Certificate Authentication) where ADCDE is the userid from the RACDDEF MAP mapping.
Connecting with a client certificate, and authenticate with userid and password.
The handshake as described above is done as above. If clientAuthentication=”true” is specified, and the handshake fails, then the client gets This site can’t be reached or similar message.
If the site can be reached, and a URL like https://10.1.1.2:9443/ibmmq/console/login.html is used, this displays a userid and password panel.
The password is verified, and if successful the specified userid is looked up in the APPL and EJBROLES profiles as described above.
If you get this far, and have logged on, displaying the userid information (click on the ⓘ icon) gives you Principal:colin – Read-Only Administrator (Client Certificate Authentication) where colin is the userid I entered.
The short solution to implement certificate authentication
If you already have TLS certificates for connecting to the MQ Web Server, you may be able to use a URL like https://10.1.1.2:9443/ibmmq/console/ to do the logon. If you use an invalid URL, it will substitute it with https://10.1.1.2:9443/ibmmq/console/login.html .
My set up.
I set up a certificate on Linux with a DN of C=GB,O=cpwebuser,CN=ADCDC and signed by C=GB,O=SSS,OU=CA,CN=SSCARSA1024. The Linux CA had been added to the trust store on z/OS.
Associate a certificate with a z/OS userid
I set up a RACF MAP of certificate to userid. It is sensible to run these using JCL, and to save the JCL for each definition.
/*RACDCERT DELMAP( LABEL('ADCDZXX' )) ID(ADCDE ) /*RACDCERT DELMAP( LABEL('CA' )) ID(ADCDZ ) RACDCERT MAP ID(ADCDE ) - SDNFILTER('CN=ADCDC.O=cpwebuser.C=GB') - WITHLABEL('ADCDZXX') RACDCERT MAP ID(ADCDZ ) - IDNFILTER('CN=SSCARSA1024.OU=CA.O=SSS.C=GB') WITHLABEL('CA ') RACDCERT LISTMAP ID(ADCDE) RACDCERT LISTMAP ID(ADCDZ) SETROPTS RACLIST(DIGTNMAP, DIGTCRIT) REFRESH
This mapped the certificate CN=ADCDC.OU=cpwebuser.C=GB to userid ADCDE. Note the “.” between the parts, and the order has changed from least significant to most significant. For other certificates coming in with the Issuer CA of CN=SSCARSA1024.OU=CA.O=SSS.C=GB they will get a userid of ADCDZ.
You do not need to refresh anything as this change becomes visible when the SETROPTS RACLIST REFESH is issued.
First logon attempt
I stopped and restarted my Chrome browser, and used the URL https://10.1.1.2:9443/ibmmq/console. I was prompted for a list of valid certificates. I chose “Subject:ADCD: Issuer:SSCARSA1024 Serial:0194”.
Sometimes it gave me a blank screen, other times it gave me the logon screen with username and Password fields. It had a URL of https://10.1.1.2:9443/ibmmq/console/login.html.
On the z/OS console I got
ICH408I USER(ADCDE ) GROUP(TEST ) NAME(ADCDE ) MQWEB CL(APPL )
WARNING: INSUFFICIENT AUTHORITY ACCESS INTENT(READ ) ACCESS ALLOWED(NONE )
I could see the the userid(ADCDE) from the RACDCERT MAP was being used (as expected). To give the userid access to the MQWEB resource, I issued the commands
/* RDEFINE APPL MQWEB UACC(NONE) PERMIT MQWEB CLASS(APPL) ACCESS(READ) ID(ADCDE) SETROPTS RACLIST(APPL) REFRESH
And tried again. The web screen remained blank (even with the correct URL). There were no messages on the MQWEB job log. Within the MQWEB stdout (and /u/mqweb/servers/mqweb/logs/messages.log) were messages like
[AUDIT ] CWWKS9104A: Authorization failed for user ADCDE while invoking com.ibm.mq.console on
/ui/userregistry/userinfo. The user is not granted access to any of the required roles: [MQWebAdmin, MQWebAdminRO, MQWebUser].
Give the userid access to the EJBroles
In my mqwebuser.xml I have <safCredentials profilePrefix=”MQWEB”. The MQWEB is the prefix of the EJBROLE resource name. I had set up a group MQPA Web Readonly Admin (MQPAWRA) to make the administration easier. Give the group permission, and connect the userid to the group.
/* RDEFINE EJBROLE MQWEB.com.ibm.mq.console.MQWebAdminRO UACC(NONE) PERMIT MQWEB.com.ibm.mq.console.MQWebAdminRO CLASS(EJBROLE) - ACCESS(READ) ID(MQPAWRA) CONNECT ADCDE group(MQPAWRA) SETROPTS RACLIST(EJBROLE) REFRESH
Once the security change has been made, it is visible immediately to the MQWEB server. I clicked the browser’s refresh button and successfully got the IBM MQ welcome page (without having to enter a userid or password). When I clicked on the ⓘ icon it said
Principal:ADCDE – Read-Only Administrator (Client Certificate Authentication)
Logoff doesn’t
If you click the logoff icon, you get logged off – but immediately get logged on again – that’s what certificate authorisation does for you. You need to go to a different web site. If you come back to the ibmmq/console web site, it will use the same certificate as you used before.
One thought on “Certificate logon to MQWEB on z/OS, the hard way.”