SSL certificates are an important part of all Horizon environments . They’re used to secure communications from client to server as well as between the various servers in the environment. Improperly configured or maintained certificate authorities can bring an environment to it’s knees – if a connection server cannot verify the authenticity of a certificate – such as an expired revocation list from an offline root CA, communications between servers will break down. This also impacts client connectivity – by default, the Horizon client will not connect to Connection Servers, Security Servers, or Access Points unless users change the SSL settings.
Most of the certificates that you will need for your environment will need to be minted off of an internal certificate authority. If you are using a security server to provide external access, you will need to acquire a certificate from a public certificate authority. If you’re building a test lab or don’t have the budget for a commercial certificate from one of the major certificate providers, you can use a free certificate authority such as StartSSL or a low-cost certificate provider such as NameCheap.
Prerequisites
Before you can begin creating certificates for your environment, you will need to have a certificate authority infrastructure set up. Microsoft has a great 2-Tier PKI walkthrough on TechNet.
Note: If you use the walkthrough to set up your PKI environment., you will need to alter the configuration file to remove the AlternateSignatureAlgorithm=1 line. This feature does not appear to be supported on vCenter and can cause errors when importing certificates.
Once your environment is set up, you will want to create a template for all certificates used by VMware products. Derek Seaman has a good walkthrough on creating a custom VMware certificate template.
Note: Although a custom template isn’t required, I like to create one per Derek’s instructions so all VMware products are using the same template. If you are unable to do this, you can use the web certificate template for all Horizon certificates.
Creating The Certificate Request
Horizon 7.0 handles certificates on the Windows Server-based components the same way as Horizon 6.x and Horizon 5.3. Certificates are stored in the Windows certificate store, so the best way of generating certificate requests is to use the certreq.exe certificate tool. This tool can also be used to submit the request to a local certificate authority and accept and install a certificate after it has been issued.
Certreq.exe can use a custom INF file to create the certificate request. This INF file contains all of the parameters that the certificate request requires, including the subject, the certificate’s friendly name, if the private key can be exported, and any subject alternate names that the certificate requires.
If you plan to use Subject Alternate Names on your certificates, I highly recommend reviewing this article from Microsoft. It goes over how to create a certificate request file for SAN certificates.
A certificate request inf file that you can use as a template is below. To use this template, copy and save the text below into a text file, change the file to match your environment, and save it as a .inf file.
;----------------- request.inf -----------------
[Version]
Signature="$Windows NT$"
[NewRequest]
Subject = "CN=<Server Name>, OU=<Department>, O=<Company>, L=<City>, S=<State>, C=<Country>" ; replace attribues in this line using example below
KeySpec = 1
KeyLength = 2048
; Can be 2048, 4096, 8192, or 16384.
; Larger key sizes are more secure, but have
; a greater impact on performance.
Exportable = TRUE
FriendlyName = "vdm"
MachineKeySet = TRUE
SMIME = False
PrivateKeyArchive = FALSE
UserProtected = FALSE
UseExistingKeySet = FALSE
ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
ProviderType = 12
RequestType = PKCS10
KeyUsage = 0xa0
[EnhancedKeyUsageExtension]
OID=1.3.6.1.5.5.7.3.1 ; this is for Server Authentication
[Extensions]
2.5.29.17 = "{text}"
_continue_ = "dns=<DNS Short Name>&"
_continue_ = "dns=<Server FQDN>&"
_continue_ = "dns=<Alternate DNS Name>&"
[RequestAttributes]
CertificateTemplate = VMware-SSL
;-----------------------------------------------
Note: When creating a certificate, the state or province should not be abbreviated. For instance, if you are in Wisconsin, the full state names should be used in place of the 2 letter state postal abbreviation.
Note: Country names should be abbreviated using the ISO 3166 2-character country codes.
The command the generate the certificate request is:
certreq.exe –New <request.inf> <certificaterequest.req>
Submitting the Certificate Request
Once you have a certificate request, it needs to be submitted to the certificate authority. The process for doing this can vary greatly depending on the environment and/or the third-party certificate provider that you use.
If your environment allows it, you can use the certreq.exe tool to submit the request and retrieve the newly minted certificate. The command for doing this is:
certreq –submit -config “<ServerName\CAName>” “<CertificateRequest.req>” “<CertificateResponse.cer>“
If you use this method to submit a certificate, you will need to know the server name and the CA’s canonical name in order to submit the certificate request.
Accepting the Certificate
Once the certificate has been generated, it needs to be imported into the server. The import command is:
certreq.exe –accept “<CertificateResponse.cer>“
This will import the generated certificate into the Windows Certificate Store.
Using the Certificates
Now that we have these freshly minted certificates, we need to put them to work in the Horizon environment. There are a couple of ways to go about doing this.
1. If you haven’t installed the Horizon Connection Server components on the server yet, you will get the option to select your certificate during the installation process. You don’t need to do anything special to set the certificate up.
2. If you have installed the Horizon components, and you are using a self-signed certificate or a certificate signed from a different CA, you will need to change the friendly name of the old certificate and restart the Connection Server or Security Server services.
Horizon requires the Connection Server certificate to have a friendly name value of vdm. The template that is posted above sets the friendly name of the new certificate to vdm automatically, but this will conflict with any existing certificates.
The steps for changing the friendly name are:
- Go to Start –> Run and enter MMC.exe
- Go to File –> Add/Remove Snap-in
- Select Certificates and click Add
- Select Computer Account and click Finish
- Click OK
- Right click on the old certificate and select Properties
- On the General tab, delete the value in the Friendly Name field, or change it to vdm_old
- Click OK
- Restart the Horizon service on the server
Certificates and Horizon Composer
Unfortunately, Horizon Composer uses a different method of managing certificates. Although the certificates are still stored in the Windows Certificate store, the process of replacing Composer certificates is a little more involved than just changing the friendly name.
The process for replacing or updating the Composer certificate requires a command prompt and the SVIConfig tool. SVIConfig is the Composer command line tool. If you’ve ever had to remove a missing or damaged desktop from your Horizon environment, you’ve used this tool.
The process for replacing the Composer certificate is:
- Open a command prompt as Administrator on the Composer server
- Change directory to your VMware Horizon Composer installation directory
Note: The default installation directory is C:\Program Files (x86)\VMware\VMware View Composer - Run the following command: sviconfig.exe –operation=replacecertificate –delete=false
- Select the correct certificate from the list of certificates in the Windows Certificate Store
- Restart the Composer Service
A Successful certificate swap
At this point, all of your certificates should be installed. If you open up the Horizon Administrator web page, the dashboard should have all green lights. If you do not see all green lights, you may need to check the health of your certificate environment to ensure that the Horizon servers can check the validity of all certificates and that a CRL hasn’t expired.
If you are using a certificate signed on an internal CA for servers that your end users connect to, you will need to deploy your root and intermediate certificates to each computer. This can be done through Group Policy for Windows computers or by publishing the certificates in the Active Directory certificate store. If you’re using Teradici PCoIP Zero Clients, you can deploy the certificates as part of a policy with the management VM. If you don’t deploy the root and intermediate certificates, users will not be able to connect without disabling certificate checking in the Horizon client.
Access Point Certificates
Unlike Connection Servers and Composer, Horizon Access Point does not run on Windows. It is a Linux-based virtual appliance, and it requires a different certificate management technique. The certificate request and private key file for the Access Point should be generated with OpenSSL, and the certificate chain needs to be concatenated into a single file. The certificate is also installed during, or shortly after, deployment using Chris Halstead’s fling or the appliance REST API.
Because this is an optional component, I won’t go into too much detail on creating and deploying certificates for the Access Point in this section. I will cover that in more detail in the section on deploying the Access Point appliance later in the series.