Skip to Content

DoIP v3 TLS Certificates Generation Guide ​

This document describes how to generate TLS certificates and keys for DoIP v3 secure communication using OpenSSL.

Overview ​

DoIP v3 uses TLS (Transport Layer Security) to encrypt diagnostic communication between the tester (client) and ECU/vehicle gateway (server). The following certificates need to be generated:

  • CA (Certificate Authority): Root certificate used to sign both server and client certificates
  • Server Certificate: Used by DoIP entity (ECU/Gateway) to authenticate itself
  • Client Certificate: Used by diagnostic tester to authenticate itself (mutual TLS)

Directory Structure ​

doip-certs/
├── ca/
│   ├── ca.key          # CA private key
│   └── ca.crt          # CA certificate
├── server/
│   ├── server.key      # Server private key
│   ├── server.csr      # Server certificate signing request
│   └── server.crt      # Server certificate
└── tester/
    ├── tester.key      # Tester private key
    ├── tester.csr      # Tester certificate signing request
    └── tester.crt      # Tester certificate

Step-by-Step Commands ​

1. Create Directory Structure ​

bash
mkdir -p doip-certs/ca doip-certs/server doip-certs/tester
cd doip-certs

2. Generate CA (Certificate Authority) ​

The CA is the root of trust. Both server and tester certificates will be signed by this CA.

bash
# Generate CA private key (4096 bits RSA)
openssl genrsa -out ca/ca.key 4096

# Generate self-signed CA certificate (valid for 10 years)
openssl req -new -x509 -days 3650 -key ca/ca.key -out ca/ca.crt \
    -subj "/C=CN/ST=Shanghai/L=Shanghai/O=EcuBus/OU=DoIP/CN=DoIP-CA"

Purpose:

  • ca.key: CA's private key, must be kept secure. Used to sign other certificates.
  • ca.crt: CA's public certificate, distributed to both server and tester for trust verification.

3. Generate Server Certificate (DoIP Entity / ECU / Gateway) ​

The server certificate is used by the DoIP entity to prove its identity to connecting testers.

bash
# Generate server private key (2048 bits RSA)
openssl genrsa -out server/server.key 2048

# Create server certificate signing request (CSR)
openssl req -new -key server/server.key -out server/server.csr \
    -subj "/C=CN/ST=Shanghai/L=Shanghai/O=EcuBus/OU=DoIP-Server/CN=doip-server"

# Sign server certificate with CA (valid for 1 year)
openssl x509 -req -days 365 -in server/server.csr -CA ca/ca.crt -CAkey ca/ca.key \
    -CAcreateserial -out server/server.crt

Purpose (Server Side):

  • server.key: Server's private key, used for TLS handshake encryption. Must be kept on the server only.
  • server.csr: Certificate Signing Request, temporary file used during certificate generation.
  • server.crt: Server's public certificate, sent to clients during TLS handshake to prove identity.

Files needed on Server:

  • server.key - Private key for decryption
  • server.crt - Certificate to present to clients
  • ca.crt - To verify client certificates (for mutual TLS)

4. Generate Tester Certificate (Diagnostic Tester / Client) ​

The tester certificate is used for mutual TLS authentication, allowing the server to verify the tester's identity.

bash
# Generate tester private key (2048 bits RSA)
openssl genrsa -out tester/tester.key 2048

# Create tester certificate signing request (CSR)
openssl req -new -key tester/tester.key -out tester/tester.csr \
    -subj "/C=CN/ST=Shanghai/L=Shanghai/O=EcuBus/OU=DoIP-Tester/CN=doip-tester"

# Sign tester certificate with CA (valid for 1 year)
openssl x509 -req -days 365 -in tester/tester.csr -CA ca/ca.crt -CAkey ca/ca.key \
    -CAcreateserial -out tester/tester.crt

Purpose (Tester Side):

  • tester.key: Tester's private key, used to prove ownership of the certificate.
  • tester.csr: Certificate Signing Request, temporary file used during certificate generation.
  • tester.crt: Tester's public certificate, sent to server for mutual authentication.

Files needed on Tester:

  • tester.key - Private key for authentication
  • tester.crt - Certificate to present to server
  • ca.crt - To verify server certificate

Complete Script ​

Here's a complete script to generate all certificates:

bash
#!/bin/bash

# Create directories
mkdir -p doip-certs/ca doip-certs/server doip-certs/tester
cd doip-certs

echo "=== Generating CA ==="
openssl genrsa -out ca/ca.key 4096
openssl req -new -x509 -days 3650 -key ca/ca.key -out ca/ca.crt \
    -subj "/C=CN/ST=Shanghai/L=Shanghai/O=EcuBus/OU=DoIP/CN=DoIP-CA"

echo "=== Generating Server Certificate ==="
openssl genrsa -out server/server.key 2048
openssl req -new -key server/server.key -out server/server.csr \
    -subj "/C=CN/ST=Shanghai/L=Shanghai/O=EcuBus/OU=DoIP-Server/CN=doip-server"
openssl x509 -req -days 365 -in server/server.csr -CA ca/ca.crt -CAkey ca/ca.key \
    -CAcreateserial -out server/server.crt

echo "=== Generating Tester Certificate ==="
openssl genrsa -out tester/tester.key 2048
openssl req -new -key tester/tester.key -out tester/tester.csr \
    -subj "/C=CN/ST=Shanghai/L=Shanghai/O=EcuBus/OU=DoIP-Tester/CN=doip-tester"
openssl x509 -req -days 365 -in tester/tester.csr -CA ca/ca.crt -CAkey ca/ca.key \
    -CAcreateserial -out tester/tester.crt

echo "=== Verifying Certificates ==="
echo "Server certificate:"
openssl verify -CAfile ca/ca.crt server/server.crt

echo "Tester certificate:"
openssl verify -CAfile ca/ca.crt tester/tester.crt

echo "=== Done ==="

PowerShell Script (Windows) ​

powershell
# Create directories
New-Item -ItemType Directory -Force -Path "doip-certs/ca", "doip-certs/server", "doip-certs/tester"
Set-Location doip-certs

Write-Host "=== Generating CA ===" -ForegroundColor Green
openssl genrsa -out ca/ca.key 4096
openssl req -new -x509 -days 3650 -key ca/ca.key -out ca/ca.crt `
    -subj "/C=CN/ST=Shanghai/L=Shanghai/O=EcuBus/OU=DoIP/CN=DoIP-CA"

Write-Host "=== Generating Server Certificate ===" -ForegroundColor Green
openssl genrsa -out server/server.key 2048
openssl req -new -key server/server.key -out server/server.csr `
    -subj "/C=CN/ST=Shanghai/L=Shanghai/O=EcuBus/OU=DoIP-Server/CN=doip-server"
openssl x509 -req -days 365 -in server/server.csr -CA ca/ca.crt -CAkey ca/ca.key `
    -CAcreateserial -out server/server.crt

Write-Host "=== Generating Tester Certificate ===" -ForegroundColor Green
openssl genrsa -out tester/tester.key 2048
openssl req -new -key tester/tester.key -out tester/tester.csr `
    -subj "/C=CN/ST=Shanghai/L=Shanghai/O=EcuBus/OU=DoIP-Tester/CN=doip-tester"
openssl x509 -req -days 365 -in tester/tester.csr -CA ca/ca.crt -CAkey ca/ca.key `
    -CAcreateserial -out tester/tester.crt

Write-Host "=== Verifying Certificates ===" -ForegroundColor Green
openssl verify -CAfile ca/ca.crt server/server.crt
openssl verify -CAfile ca/ca.crt tester/tester.crt

Write-Host "=== Done ===" -ForegroundColor Green

Certificate Summary Table ​

FileLocationPurposeKeep Secret?
ca.keyCASigns all certificatesYES (Master key)
ca.crtBothRoot trust anchorNo
server.keyServerServer TLS authenticationYES
server.crtServerServer identity proofNo
tester.keyTesterTester TLS authenticationYES
tester.crtTesterTester identity proofNo

Useful Verification Commands ​

bash
# View certificate details
openssl x509 -in server/server.crt -text -noout

# Verify certificate chain
openssl verify -CAfile ca/ca.crt server/server.crt
openssl verify -CAfile ca/ca.crt tester/tester.crt

# Test TLS connection (server side)
openssl s_server -accept 13400 -cert server/server.crt -key server/server.key -CAfile ca/ca.crt -Verify 1

# Test TLS connection (tester side)
openssl s_client -connect localhost:13400 -cert tester/tester.crt -key tester/tester.key -CAfile ca/ca.crt

TLS Handshake Flow (DoIP v3) ​

    Tester (Client)                           DoIP Entity (Server)
         |                                            |
         |  1. ClientHello                            |
         |  ----------------------------------------> |
         |                                            |
         |  2. ServerHello + server.crt               |
         |  <---------------------------------------- |
         |                                            |
         |  3. Verify server.crt with ca.crt          |
         |                                            |
         |  4. CertificateRequest (mutual TLS)        |
         |  <---------------------------------------- |
         |                                            |
         |  5. tester.crt + KeyExchange               |
         |  ----------------------------------------> |
         |                                            |
         |  6. Verify tester.crt with ca.crt          |
         |                                            |
         |  7. Finished                               |
         |  <---------------------------------------> |
         |                                            |
         |  === Secure DoIP Communication ===         |
         |                                            |

Notes ​

  1. Key Length: CA uses 4096 bits for stronger security, while server/tester use 2048 bits for balance between security and performance.

  2. Validity Period: CA is valid for 10 years, while server/tester certificates are valid for 1 year. Renew before expiration.

  3. CN (Common Name): Can be customized based on your requirements. For production, use actual domain names or VIN numbers.

  4. DoIP Port: Default DoIP TLS port is 3496 (secure) vs 13400 (unsecure).

  5. Production Use: For production environments, consider using a proper PKI infrastructure and HSM for key storage.