Certificate Installation for HTTPS Communication
Installing the certificate is a required commissioning step for any client that communicates with the solution over HTTPS (for example a .NET-based order management or PLC integration).
Which case applies to you? The instructions below cover the standard installation, which is served with a self-signed certificate. If the server uses a certificate issued by your organisation's own certificate authority — as is the case at Goodyear — the installation is usually unnecessary. See Sites With a Corporate Certificate Authority.
The solution is served over HTTPS using a self-signed certificate. Until the client machine trusts this certificate, every HTTPS request is rejected before any data is exchanged. This is independent of the specific request being made — it is not caused by submitting an order, it is a prerequisite for establishing the secure connection at all.
Why It Is Needed
A client only accepts an HTTPS connection when it can verify the server's certificate against a trusted authority. Because the certificate is self-signed, it must be added manually to the client machine's trusted root store during commissioning. If this step is skipped, connections fail with a message such as:
The underlying connection was closed:
Could not establish trust relationship for the SSL/TLS secure channel.
Downloading the Certificate
Download the public certificate on the client machine:
- Web interface: Options > Download Certificate in the top navigation bar.
- API endpoint:
GET /api/download-cert
The downloaded file is named palletizing_root_cert.crt.
Verify the Downloaded File
Before installing, confirm the file is a real certificate and not an HTML error page:
certutil -dump "C:\path\palletizing_root_cert.crt"
This should print the certificate details (issuer, validity period, SAN). If it errors or you see HTML text, re-download the file via Options > Download Certificate.
Installing the Certificate on Windows
The certificate must be placed in the Local Machine → Trusted Root Certification Authorities store. Use Local Machine (not Current User), because clients that run as a Windows service under a system account read from the machine store.
If double-clicking the .crt file does not offer an Install Certificate…
button (e.g. the file opens in a text editor because of a wrong file
association), import it directly using one of the following, run as
Administrator:
PowerShell
Import-Certificate -FilePath "C:\path\palletizing_root_cert.crt" -CertStoreLocation Cert:\LocalMachine\Root
certutil
certutil -addstore -f "Root" "C:\path\palletizing_root_cert.crt"
MMC snap-in
- Run
certlm.msc(opens the Local Machine certificate store directly). - Navigate to Trusted Root Certification Authorities → Certificates.
- Right-click → All Tasks → Import… and follow the wizard.
After importing, restart the client application or service.
Sites With a Corporate Certificate Authority
Some installations do not use a self-signed certificate. Instead, the server
certificate is issued by the customer's own internal certificate authority. The
Goodyear production server (usam1807lalc01.corp.pep.pvt) is one such case, using
a chain of three certificates:
USAM1807LALC01.corp.pep.pvt server certificate ("leaf")
issued by PepsiCoCA01 intermediate
issued by PepsiCoRootCA root
On these sites, no certificate installation is required on managed client machines: the corporate root is already distributed to them, so the connection is trusted out of the box. Two rules matter here:
- Never install the server certificate itself. The leaf is not a certificate
authority, so importing it into the trusted root store has no effect. If a
machine is not managed by the corporate domain and does not trust the
connection, import the root certificate (
PepsiCoRootCA) instead, using the same PowerShell, certutil or MMC steps described above. - The server must send the intermediate certificate. A client can only verify the connection if it can build a path from the server certificate up to the root. The leaf alone is not sufficient — the client also needs the intermediate and will not fetch it by itself.
Checking Whether a Client Machine Trusts the Server
Run this in PowerShell on the client machine. It needs no extra tools:
$server = "usam1807lalc01"; $port = 8443
$tcp = [System.Net.Sockets.TcpClient]::new($server, $port)
$ssl = [System.Net.Security.SslStream]::new($tcp.GetStream(), $false, { param($s, $cert, $chain, $errors)
Write-Host "Result: $errors"
foreach ($st in $chain.ChainStatus) { Write-Host " $($st.Status): $($st.StatusInformation)" }
return $true })
$ssl.AuthenticateAsClient($server); $ssl.Close(); $tcp.Close()
Interpret the output as follows:
| Result | Meaning |
|---|---|
None |
The machine trusts the server. No installation needed. |
UntrustedRoot |
The root certificate is missing from the trust store — import PepsiCoRootCA. |
PartialChain |
The intermediate is missing and could not be retrieved — see below. |
RemoteCertificateNameMismatch |
The client is calling a hostname not listed in the certificate. |
A common misdiagnosis: importing PepsiCoCA01 (the intermediate) into the trusted
root store does not fix UntrustedRoot. Only PepsiCoRootCA belongs there.
Verify what is actually installed:
Get-ChildItem Cert:\LocalMachine\Root | Where-Object Subject -match "PepsiCo" |
Select-Object Subject, NotAfter
Checking What the Server Sends
The check above cannot answer this, because Windows completes the chain on its own — using certificates already in the local store and by downloading missing ones. A server that sends an incomplete chain can therefore still appear to work on one machine and fail on the next.
To see the certificates the server actually transmits, use openssl from a Git
Bash prompt (openssl is not on the Windows PATH, but ships with Git for Windows
at C:\Program Files\Git\usr\bin\openssl.exe):
echo | openssl s_client -connect usam1807lalc01:8443 -servername usam1807lalc01
The Certificate chain section must list two entries — the leaf and the
intermediate. If only the leaf appears, the server's certificate file needs to be
rebuilt as a full chain.
Note for Python Clients
Python does not use the Windows certificate store. The requests library ships
its own list of public certificate authorities, which by design never contains a
corporate root. A request therefore fails with
SSLCertVerificationError: unable to get local issuer certificate even when the
same URL works in the browser. Point verify at the root certificate file:
requests.get("https://usam1807lalc01:8443/api/", verify="PepsiCoRootCA.crt")
Do not work around this with verify=False — that disables verification entirely
and leaves the connection open to interception. Alternatively, install the
pip-system-certs package to make Python use the Windows store.
Additional Requirements
- Matching hostname: The client must call the exact hostname listed in the
certificate's
subjectAltName(SAN), not a raw IP address or a different alias. - TLS version: Older .NET Framework clients may default to an outdated protocol. Force TLS 1.2 in the client code:
csharp
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
* Certificate validity: Ensure the certificate is not expired and the client
machine's date and time are correct, as certificate validation is
time-dependent.