===== Generating a Certificate Manually ===== This section explains how to manually generate a server certificate using Keytool and OpenSSL: * **Private key generation** * **CSR creation** * **CA signing** * **Chain assembly (root + intermediate)** * **Keystore import** * **Full PKCS12 generation** ==== Generate the private key and initial keystore ==== We will use Keytool to generate a new keypair, make sure to define the correct **SAN** (hostname and/or IP) Command: keytool -genkeypair -keyalg RSA -keysize 4096 \ -keystore server.jks \ -storepass agentilKeyStore \ -alias server \ -dname ''CN=your.hostname.example'' \ -ext SAN=DNS:your.hostname.example,IP:your.server.ip This creates: * **server.jks** → keystore containing the private key * alias: **server** ---- ==== Generate the CSR (Certificate Signing Request) ==== Command: keytool -certreq \ -keystore server.jks \ -storepass agentilKeyStore \ -alias server \ -ext SAN=DNS:your.hostname.example,IP:your.server.ip \ -file server.csr Send **server.csr** to your Certificate Authority (CA) ==== Receive signed certificates from the CA ==== Your CA will return: * **server certificate** (server.cer / server.crt) * **intermediate CA certificate(s)** * **root CA certificate** Certificates may be in **DER** (binary) or **PEM** (text) format If DER (binary), convert to PEM with: openssl x509 -inform DER -in intermediate.cer -out intermediate.crt openssl x509 -inform DER -in root.cer -out root.crt openssl x509 -inform DER -in server.cer -out server.crt ==== Import CA certificates into the keystore (trustedCertEntry) ==== Command: keytool -import -trustcacerts \ -keystore server.jks \ -storepass agentilKeyStore \ -alias ca_root \ -file root.crt Then command: keytool -import -trustcacerts \ -keystore server.jks \ -storepass agentilKeyStore \ -alias ca_intermediate \ -file intermediate.crt **IMPORTANT:** These certificates are imported as **trustedCertEntry**, but **Redpeaks does NOT reconstruct the chain automatically** ==== Import the CA-signed server certificate on the same alias ==== This step replaces the temporary Keytool certificate and attaches the chain keytool -import \ -keystore server.jks \ -storepass agentilKeyStore \ -alias server \ -file server.crt Check chain length: keytool -list -v -keystore server.jks -alias server You should see: * **Entry type: PrivateKeyEntry** * **Certificate chain length: 2 or 3** If **chain length = 1**, Redpeaks will send an incomplete chain, **browsers will reject it** → read the PKCS12 section ===== Building a Full PKCS12 Certificate Bundle (P12) ===== This section fixes all chain issues by generating a PKCS12 containing: * **private key** * **server certificate** * **intermediate certificates** * **root certificate** Redpeaks will then serve a **complete certificate chain** ==== Build the full certificate chain file ==== Command: cat intermediate.crt root.crt > chain.pem Order matters: * intermediate(s) first * root last ==== Create the PKCS12 bundle (private key + cert + chain) ==== Command: openssl pkcs12 -export \ -inkey server.key \ -in server.crt \ -certfile chain.pem \ -name pro_monitor \ -out server.p12 ==== Import PKCS12 into Redpeaks keystore ==== Command: keytool -importkeystore \ -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass agentilKeyStore \ -destkeystore [PRO_MONITOR_HOME]/certificates/.keystore \ -deststoretype JKS -deststorepass agentilKeyStore Verify: keytool -list -v -keystore [PRO_MONITOR_HOME]/certificates/.keystore -alias server Expected: * **Entry type: PrivateKeyEntry** * **Certificate chain length: 2 or 3** (OK)