I want to create a certificate for my NetScaler and get it working in Chrome. Creating a certificate is easy – there are Citrix docs etc for it – but Chrome keeps complaining about missing subjectAlternativeName. This is because Chrome 58 and upwards ignore the Common Name (CN) field in a certificate and only check the Subject Alternative Names (SAN) field. Other browsers too might ignore the CN field if the SAN field is present (they are supposed to at least); so as a best practice it’s a good idea to fill the SAN field in my NetScaler certificate and put all the names (including the CN) in this field.
Problem is the NetScaler web UI doesn’t have an option for specifying the SAN field. Windows CA (which is what I use internally) supports SAN when making requests, but since the CSR is usually created on the NetScaler and that doesn’t have a way of mentioning SAN, I need an alternative approach.
Here’s one approach from a Citrix blog post. Typically the CLI loving geek in me would have taken that route and stopped at that, but today I feel like exploring GUI options. :)
So I came across the DigiCert Certificate Utility and a guide on how to generate a CSR using that. I don’t need to use the guide entirely as my CA is internal, but the tool (download link) is useful. So I downloaded it and created a certificate request.
A bit of background on the above. I have two NetScalers: ns105-01.rockylabs.zero (IP 10.10.1.150) and ns105-02.rockylabs.zero (IP 10.10.1.160) in an HA pair. For management purposes I have a SNIP 10.10.1.170 (DNS name ns105.rockylabs.zero) which I can connect to without bothering which is the current primary. So I want to create a certificate that will be valid for all three DNS names and IP addresses. Hence in the Subject Alternative Names field I fill in all three names and IP address – note: all three names including the one I put in the common name, since Chrome ignores this field (and other browsers are supposed to ignore the CN if SAN is present).
I click Generate and the tool generates a new CSR. I save this someplace.
Now I need to use this CSR to generate a certificate. Typically I would have gone with the WebServer template in my internal CA, but thing is eventually I’ll have to import this CSR, the generated certificate, and the private key of that certificate to the NetScaler – and the default WebServer template does not allow key exporting.
So I make a new template on my CA. This is just a copy of the default “Web Server” template, but I make a change to allow exporting of the private key (see checkbox below).
Then I create a certificate on my CA using this CSR.
certreq -attrib "CertificateTemplate:WebServer_withKey"
The template name “WebServer_withKey” is the name of the template. Need to use that with the
certreq command instead of the display name.
This will create the certificate and save it at a location I specify.
At this point I have the CSR and the certificate. I can’t import these into the NetScaler as that also requires the private key. The DigiCert tool generates the private key automatically and keeps it with itself, so we need to import this certificate into the tool and export with key from there. This exports the certificate, along with key, into a PFX format.
This Citrix article is a good reference on the various certificate formats. It also gives instructions on how to import a PFX certificate into NetScaler.
Before proceeding however, a quick summary of the certificate formats from the same article for my own reference:
- PFX is a format for storing a server certificate or any intermediate certificate along with private key in one encrypted file.
- PFX == PKCS#12 (i.e. both terms can be used interchangeably).
- PEM is another format. And a very common one actually. It can contain both certificates and keys, or only either separately.
- These are Base64 encoded ASCII files and have extensions such as .pem, .crt, .cer, or .key.
- DER is a binary form of the PEM format. (So while PEM formats can be opened in Notepad, for instance, as a text file, DER format cannot).
- These are binary files. Have extensions such as .cer and .der. (Note: .cer can be a PEM format too).
So I go ahead and import the PFX file.
And then I install a new certificate created from this imported PFX file.
Note: After taking the screenshot I changed the first field (certificate-key pair name) to “ns105_rockylabs_zero_withKey” just to make it clear to my future self that this certificate includes the key with itself and that I won’t find a separate key file as is usually the case. The second field is the name of the PEM file that was previously created and is already on the appliance.
The certificate is successfully installed:
The next step is to go ahead replace the default NetScaler certificate with this one. This can be done via GUI or CLI as in this Citrix article. The GUI is a bit of a chore here, so I went ahead the CLI way.
bind ssl service nshttps-10.10.1.170-443 -certkeyName ns105_rockylabs_zero_withKey
bind ssl service nsrpcs-10.10.1.170-3008 -certkeyName ns105_rockylabs_zero_withKey
bind ssl service nskrpcs-127.0.0.1-3009 -certkeyName ns105_rockylabs_zero_withKey
bind ssl service nshttps-::1l-443 -certkeyName ns105_rockylabs_zero_withKey
bind ssl service nsrpcs-::1l-3008 -certkeyName ns105_rockylabs_zero_withKey
bind ssl service nshttps-127.0.0.1-443 -certkeyName ns105_rockylabs_zero_withKey
bind ssl service nsrpcs-127.0.0.1-3008 -certkeyName ns105_rockylabs_zero_withKey
And that’s it! Now I can access my NetScalers over SSL using Chrome, with no issues.