====== Scenario 3.1: Issue Server Certificate ======
**Category:** [[.:start|Issue Certificates]] \\
**Complexity:** *** (Medium-High) \\
**Prerequisites:** CSR available, Intermediate CA \\
**Estimated Time:** 10-15 minutes
----
===== Description =====
This scenario describes issuing a **TLS server certificate** by an Intermediate CA. The certificate enables HTTPS encryption for web servers, APIs, and other TLS-protected services.
**What is created:**
* X.509 v3 server certificate
* Signed with ML-DSA-65 (Post-Quantum)
* Extensions for TLS server
----
===== Workflow =====
flowchart LR
CSR[Load CSR] --> VERIFY[Verify CSR]
VERIFY --> EXT[Set extensions]
EXT --> SERIAL[Generate serial]
SERIAL --> SIGN[Sign with CA]
SIGN --> EXPORT[Export as PEM]
style SIGN fill:#e8f5e9
----
===== Code Example (C#) =====
using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ;
using var ctx = PqCryptoContext.Initialize();
// Load Intermediate CA
var caCert = ctx.LoadCertificate("intermediate-ca.crt.pem");
var caKey = ctx.LoadPrivateKey("intermediate-ca.key.pem", "CaPassword!");
// Load and verify CSR
var csr = ctx.LoadCertificateRequest(File.ReadAllText("server.csr.pem"));
if (!csr.VerifySignature())
throw new CryptographicException("Invalid CSR signature");
// Issue server certificate
var serverCert = ctx.IssueCertificate(
csr,
issuerCert: caCert,
issuerKey: caKey,
serialNumber: ctx.GenerateSerialNumber(),
validDays: 365, // 1 year
extensions: new ExtBuilder()
// Basic Constraints: Not a CA
.BasicConstraints(ca: false, critical: true)
// Key Usage for TLS
.KeyUsage(KeyUsageFlags.DigitalSignature | KeyUsageFlags.KeyEncipherment, critical: true)
// Extended Key Usage: Server Auth
.ExtendedKeyUsage(ExtKeyUsage.ServerAuth)
// Subject Key Identifier
.SubjectKeyIdentifier(csr.PublicKey)
// Authority Key Identifier
.AuthorityKeyIdentifier(caCert)
// CRL Distribution Point
.CrlDistributionPoint("http://crl.example.com/intermediate.crl")
// OCSP Responder
.AuthorityInfoAccess(
ocspUrl: "http://ocsp.example.com",
caIssuersUrl: "http://ca.example.com/intermediate.crt"
)
.Build()
);
// Save
serverCert.ToPemFile("server.crt.pem");
// Create certificate chain
var chain = $"{serverCert.ToPem()}\n{caCert.ToPem()}";
File.WriteAllText("server-chain.pem", chain);
Console.WriteLine("Server certificate issued:");
Console.WriteLine($" Subject: {serverCert.Subject}");
Console.WriteLine($" Issuer: {serverCert.Issuer}");
Console.WriteLine($" Serial: {serverCert.SerialNumber}");
Console.WriteLine($" Valid until: {serverCert.NotAfter:yyyy-MM-dd}");
----
===== Extensions for Server Certificates =====
^ Extension ^ Value ^ Critical ^ Description ^
| Basic Constraints | CA=false | Yes | Not a CA certificate |
| Key Usage | digitalSignature, keyEncipherment | Yes | TLS handshake |
| Extended Key Usage | serverAuth | No | Server authentication |
| Subject Key Identifier | Hash(PublicKey) | No | Key ID |
| Authority Key Identifier | CA-SKI | No | Issuer reference |
| Subject Alt Name | DNS names | No | Taken from CSR |
| CRL Distribution Points | URL | No | Revocation checking |
| Authority Info Access | OCSP, CA Issuers | No | Validation helpers |
----
===== Industry-Specific Validity Periods =====
^ Industry ^ Validity ^ Rationale ^
| **Standard IT** | 1 year (365 days) | CA/Browser Forum Maximum |
| **Energy/SCADA** | 3-5 years | Long maintenance cycles |
| **Healthcare** | 1-2 years | Compliance requirements |
| **Automotive** | 2-3 years | Vehicle lifecycle |
**Recommendation:** For public websites max. 398 days (CA/B Forum). For internal services, longer validity periods may be appropriate.
----
===== Output Files =====
==== server.crt.pem ====
-----BEGIN CERTIFICATE-----
MIIHxjCCBiagAwIBAgIUP7J2kM9x...
-----END CERTIFICATE-----
==== server-chain.pem ====
-----BEGIN CERTIFICATE-----
(Server certificate)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(Intermediate CA)
-----END CERTIFICATE-----
----
===== Nginx Configuration =====
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/nginx/ssl/server-chain.pem;
ssl_certificate_key /etc/nginx/ssl/server.key.pem;
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers on;
}
----
===== Related Scenarios =====
^ Relationship ^ Scenario ^ Description ^
| **Prerequisite** | [[en:int:pqcrypt:szenarien:csr:csr_server|2.1 Server CSR]] | Create CSR |
| **Prerequisite** | [[en:int:pqcrypt:szenarien:pki:intermediate_ca_erstellen|1.2 Intermediate CA]] | Signing CA |
| **Next Step** | [[en:int:pqcrypt:szenarien:tls:server_setup|10.1 TLS Server Setup]] | Deploy certificate |
| **Related** | [[.:client_cert|3.2 Client Certificate]] | For mTLS |
----
<< [[.:start|<- Certificates Overview]] | [[en:int:pqcrypt:szenarien:start|^ Scenarios]] | [[.:client_cert|3.2 Client Certificate ->]] >>
{{tag>scenario certificate server tls https x509}}
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//