Most web traffic today is encrypted using HTTPS. While encryption protects data in transit, it also prevents a proxy from inspecting the actual HTTP requests and responses.
This becomes important when you want ProxyMapService to do more than simple forwarding. For example, caching static content such as images, JavaScript files, stylesheets, fonts, or other assets requires access to the decrypted HTTP payload. Without SSL/TLS decryption, the proxy can only see an encrypted byte stream and cannot analyze or cache the content.
ProxyMapService supports SSL/TLS traffic decryption by operating as a man-in-the-middle (MITM) proxy. This allows HTTPS traffic to be inspected, modified, cached, or routed using the same rule engine that is available for regular HTTP traffic.
ProxyMapService already includes support for content caching, but that topic deserves its own article. In this post, we’ll focus only on SSL/TLS decryption and the certificate configuration required to make it work.
Creating a Root CA Certificate
Before ProxyMapService can decrypt HTTPS traffic, it must be able to generate certificates for target hosts dynamically. To do that, a trusted root Certificate Authority (CA) certificate is required.
The easiest way to create one is to use the CreateRootCA console utility included with ProxyMapService.
By default, the utility creates the certificate files in the .proxymap directory located in the current user’s home folder.
The generated files include:
- A PKCS#12 (
.p12) file containing the certificate and private key - A public certificate (
.cer) - A PEM-encoded public certificate (
.pem)
Installing the Certificate
The generated certificate must be installed into the appropriate Windows certificate store.
Stand-alone Mode
If ProxyMapService is running as a stand-alone application (ProxyMapService.exe), install the root certificate into the Trusted Root Certification Authorities store of the Current User.
Open the certificate manager:
certmgr.msc
Then import the generated root certificate into:
Current User
└─ Trusted Root Certification Authorities
IIS Hosting
If ProxyMapService is hosted by IIS, install the certificate into the Personal certificate store of the Local Computer.
Open:
certlm.msc
Then import the certificate into:
Local Computer
└─ Personal
The application pool identity must have access to the certificate’s private key.
Configuring the Root Certificate
After the certificate has been installed, ProxyMapService must be configured to locate it.
Example configuration:
"SslServerOptions": {
"EnabledSslProtocols": "Tls11,Tls12,Tls13",
"ClientCertificateRequired": false,
"CheckCertificateRevocation": false,
"CACertificate": {
"StoreLocation": "LocalMachine",
"StoreName": "My",
"Subject": "CN=DO_NOT_TRUST_ProxyMapRoot"
}
}
In this example, ProxyMapService searches for a certificate with the following subject:
CN=DO_NOT_TRUST_ProxyMapRoot
inside the My (Personal) certificate store of the Local Machine certificate location.
Understanding SslServerOptions
SslServerOptions controls how ProxyMapService behaves when acting as the TLS server toward connecting clients.
EnabledSslProtocols
Specifies which TLS protocol versions are allowed.
"EnabledSslProtocols": "Tls11,Tls12,Tls13"
Only the listed protocol versions will be accepted during TLS negotiation.
In most environments, TLS 1.2 and TLS 1.3 are sufficient. TLS 1.1 is typically enabled only for compatibility with legacy clients.
ClientCertificateRequired
Controls whether the client must present a certificate during the TLS handshake.
"ClientCertificateRequired": false
When set to false, clients authenticate using standard HTTPS behavior.
When set to true, mutual TLS (mTLS) is required and clients must provide a valid certificate.
CheckCertificateRevocation
Controls certificate revocation checking.
"CheckCertificateRevocation": false
When enabled, Windows performs online revocation checks using CRL or OCSP endpoints during certificate validation.
Disabling revocation checks can reduce connection latency and avoid failures in isolated environments where revocation services are unavailable.
CACertificate
Specifies the root CA certificate used by ProxyMapService to generate certificates for intercepted HTTPS hosts.
The certificate is identified using:
StoreLocationStoreNameSubject
The private key associated with this certificate is required for successful SSL/TLS interception.
Understanding SslClientOptions
SslClientOptions controls how ProxyMapService authenticates when connecting to upstream HTTPS servers.
Example configuration:
"SslClientOptions": {
"EnabledSslProtocols": "Tls11,Tls12,Tls13",
"CheckCertificateRevocation": false
}
EnabledSslProtocols
Specifies which TLS protocol versions ProxyMapService may use when establishing outbound HTTPS connections.
"EnabledSslProtocols": "Tls11,Tls12,Tls13"
Only the configured protocols will be offered during negotiation with the remote server.
CheckCertificateRevocation
Controls revocation checking for certificates presented by upstream servers.
"CheckCertificateRevocation": false
When enabled, certificate revocation status is verified before the server certificate is accepted.
This helps detect certificates that have been revoked by the issuing authority.
Enabling SSL/TLS Decryption
Once the certificate has been installed and the SSL options are configured, SSL/TLS decryption can be enabled using the DecryptSSL setting.
Decryption can be enabled globally for a listening port or selectively for specific host rules.
Enabling Decryption on a Listening Port
Example:
"Listen": {
"Port": 10001,
"RejectHttpProxy": false,
"DecryptSSL": true
}
With this configuration, all HTTPS traffic received on port 10001 will be decrypted and processed by ProxyMapService.
This is usually the simplest configuration when all traffic arriving on the listener should be inspected.
Enabling Decryption for Specific Hosts
Sometimes only a subset of HTTPS traffic needs to be decrypted.
In that case, decryption can be enabled within host rules.
Example:
"HostRules": {
"Items": [
{
"Pattern": "google\\.com$",
"HostPort": 443,
"DecryptSSL": true
}
]
}
In this configuration, only HTTPS traffic matching google.com on port 443 will be decrypted.
All other HTTPS traffic will continue to pass through without interception.
This approach is useful when SSL inspection is required only for selected destinations.
Verifying the Configuration
After enabling SSL/TLS decryption:
- Start ProxyMapService.
- Configure a browser or application to use the proxy.
- Open an HTTPS website.
- Verify that no certificate warnings are displayed.
- Check ProxyMapService logs to confirm that decrypted HTTP requests and responses are being processed.
If certificate warnings appear, verify that:
- The root CA certificate is installed in the correct certificate store.
- The configured certificate subject matches the installed certificate.
- The certificate includes a private key.
- The service account has permission to access the private key.
Conclusion
SSL/TLS decryption is a prerequisite for advanced HTTPS traffic processing in ProxyMapService. Once a trusted root CA certificate is installed and configured, the service can inspect encrypted traffic just as it does regular HTTP traffic.
This capability enables scenarios such as request inspection, response modification, traffic analysis, selective routing, and content caching. In a future post, we’ll take a closer look at the caching subsystem and how it can be used to efficiently serve static content directly from ProxyMapService.