Using IIS as a reverse proxy for Jenkins

Howdy, guys! Today, I’d like to show you how to configure IIS along with ARR to publish and secure your Jenkins portal with HTTPS and SSL. Going forward, make sure that your site name (jenkins.pro, in my case) is publicly available (every external Certificate Authority requires domain validation before generating a SSL-certificate for your site. Otherwise, you can use a self-signed certificate for demo purposes (as it shown later in this post).

TIP: to get a SSL-certificate, you can use a completely free Let’s Encrypt CA (windows ACME tool located here , download it and extract the archive, and then run the wacs.exe application to create new certificate (see the screenshot below)) or comodo free SSL certificate for 90 days . Be careful! LetsEncrypt has some rate limits. For example, there is a Failed Validation limit of 5 failures per account, per hostname, per hour and if you’ve hit a rate limit, you don’t have a way to temporarily reset it. You’ll need to wait until the rate limit expires after a week

Prepare your environment

  • Install and configure Jenkins (it it’s not yet done)
  • Add Web Server (IIS) server role with the default settings + HTTP Redirection and WebSocket Protocol

Install-WindowsFeature Web-Server,Web-WebServer,Web-Common-Http,Web-Default-Doc,Web-Dir-Browsing,Web-Http-Errors,Web-Static-Content,Web-Http-Redirect,Web-Health,Web-Http-Logging,Web-Performance,Web-Stat-Compression,Web-Security,Web-Filtering,Web-App-Dev,Web-WebSockets,Web-Mgmt-Tools,Web-Mgmt-Console -IncludeManagementTools

  • Download and install URL Rewrite and IIS ARR
  • My machine is not in the domain, so I need to edit my hosts file (C:\Windows\System32\drivers\etc\hosts) and add a new line as follows: 127.0.0.1 jenkins.pro
  • Create a self-signed certificate or use the certificate provided by public CA (as we briefly discussed in the beginning). I also recommend to add created certificate to the Trusted Root Certification Authorities to avoid any warning messages in browsers.

New-SelfSignedCertificate -DnsName "jenkins.pro" -CertStoreLocation "cert:\LocalMachine\My"

Configure IIS and ARR

Open IIS manager (InetMgr.exe), go to the Default Web Site – Actions – Bindings and add a new site binding for HTTPS type (use the certificate created earlier). Then, edit HTTP binding by typing a hostname (might be used by ACME tool while generating a certificate)

Click on the IIS server name, go to Application Request Routing Cache – Server Proxy Settings and Enable the Proxy, disable
Reverse rewrite host in response header , and then click Apply

Navigate to the Default Web Site – URL Rewrite -View Server Variables... and add the a new variable named as HTTP_FORWARDED.

Go back to rules, and add a new reverse proxy rule, type a site name (jenkins.pro, in my case) and click OK. Doble-click on the created rule and define a condition input {CACHE_URL} with the following pattern ^(http|ws)s:// , and then add server variable HTTP_FORWARDED with the following value for={REMOTE_ADDR};by={LOCAL_ADDR};host=”{HTTP_HOST}”;proto=”https”

Then, we need to define how to rewrite URL under action:
{C:1}://jenkins.acme.example:8080{UNENCODED_URL}
and remove the Append query string check

Go to Application Pools and change .NET CLR Version to No Managed Code

Then go back to the Default Web Site and select Request Filtering – Edit Feature Settings and turn on Allow double escaping

In the Default Web Site → Configuration Editor change the Section to system.webServer/rewrite/rules , and change useOriginalURLEncoding to False

Configure Jenkins

Once you finished with IIS/ARR configuration, we need to set Jenkins to enable the proxy and work with a new URL (https://jenkins.pro, in my case). Carry out the following steps:

  1. Open Jenkins portal, go to Manage Jenkins – Configure Global Security enable Prevent Cross Site Request Forgery exploits and proxy compatibility
  2. In the Configure System, define a new URL under Jenkins location that should be used by Jenkins (https://jenkins.pro, in my case), and then apply the changes
  3. Open a new tab in the browser and verify that you can access the Jenkins by using the new URL and HTTPS

jenkins-iis-ssl

P.S. this post is based on the wiki article that contains a bit more details https://wiki.jenkins.io/display/JENKINS/Running+Jenkins+behind+IIS

TOTD: Error applying RemoteFX 3D Adapter changes

Hi, guys!

In this Tip Of The Day we are going to discuss strange issue in WS2012/2012R2 *

When you add RemoteFX Adapter to VM error pops up:

Error applying RemoteFX 3D Adapter changes

remotefx adapter error applying changes

You’ve checked requirements and figured out that your environment is completely applicable to RemoteFX:

  • Up-to-date graphical adapter driver’s version and GPU is also listed in Windows Server catalog
  • Host is up-to-date
  • SLAT-compatible CPU (systeminfo.exe, extended page tables or nested page tables are enabled in BIOS)
  • DirectX 11 and driver model WDDM 1.2 at least (dxdiag.exe shows the required versions)
  • Hyper-V is installed and RemoteFX adapter is enabled

image

You don’t have to rack your brain! It’s a bug of GUI that was originated in Windows Server 2012 RC (Release Candidate) and we don’t have any official patches or KBs yet. Just for reference, WS 2016 is coming and 2015 year now Улыбка

72e106dd8414c27d96c6ce1c273b2045

To solution use PowerShell instead of GUI

Add-VMRemoteFx3dVideoAdapter -VMName vmname
Set-VMRemoteFx3dVideoAdapter -VMName vmname -MonitorCount 1 -MaximumResolution 1920x1200
Get-VMRemoteFx3dVideoAdapter -VMName vmname

MaximumScreenResolution : 1920x1200
MaximumMonitors : 1
ComputerName : RDVH01
Name : RemoteFX 3D Adapter
Id : Microsoft:1C7D9096-ED62-4039-9285-FB88DB183C93\113560EA-48CD-4BD1-8828-FCEC44E2B5D5
IsDeleted : False
VMId : 1c7d9096-ed62-4039-9285-fb88db183c93
VMName : vmname
VMSnapshotId : 00000000-0000-0000-0000-000000000000
VMSnapshotName :
Key :

*pics are in Russian but they are easy to understand 🙂

TIP: after adding RemoteFX 3D Adapter to VM you can set it up (change monitor count or resolution)  in GUI without any issues.