====== Scenario 2.1: Create Server CSR ====== **Category:** [[.:start|Certificate Signing Requests (CSR)]] \\ **Complexity:** ** (Medium) \\ **Prerequisites:** Key pair available \\ **Estimated Time:** 5-10 minutes ---- ===== Description ===== This scenario describes creating a **Certificate Signing Request (CSR)** for a TLS server certificate. The CSR contains all information that a CA needs to issue a server certificate. **What is created:** * ML-DSA-65 key pair (or hybrid) * CSR with server DN and extensions * Subject Alternative Names (SAN) for DNS names **Use cases:** * HTTPS web servers * API endpoints * Microservices with TLS ---- ===== Workflow ===== flowchart LR KEY[Generate key pair] --> DN[Create DN] DN --> EXT[Set extensions] EXT --> CSR[Create CSR] CSR --> SIGN[Sign CSR] SIGN --> EXPORT[Export as PEM] style CSR fill:#e8f5e9 ---- ===== Functions Involved ===== ^ Step ^ FFI Function ^ Description ^ | 1 | ''wvds_sec_crypto_x509_keypair_generate_mldsa(65)'' | Generate key pair | | 2 | ''wvds_sec_crypto_x509_dn_create()'' | Create DN handle | | 3 | ''wvds_sec_crypto_x509_dn_add_component()'' | Add CN, O, C | | 4 | ''wvds_sec_crypto_x509_ext_set_san_dns()'' | Add DNS names | | 5 | ''wvds_sec_crypto_x509_ext_set_key_usage()'' | digitalSignature, keyEncipherment | | 6 | ''wvds_sec_crypto_x509_ext_set_eku()'' | serverAuth | | 7 | ''wvds_sec_crypto_x509_csr_create()'' | Create CSR | | 8 | ''wvds_sec_crypto_x509_csr_sign()'' | Sign CSR with private key | | 9 | ''wvds_sec_crypto_x509_csr_to_pem()'' | Export as PEM | ---- ===== Code Example (C#) ===== using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ; // 1. Initialize context using var ctx = PqCryptoContext.Initialize(); // 2. Generate key pair for server using var serverKey = ctx.GenerateKeyPair(PqAlgorithm.MlDsa65); // 3. Distinguished Name var dn = new DnBuilder() .AddCN("www.example.com") .AddO("Example GmbH") .AddOU("IT Department") .AddC("DE") .AddL("Munich") .Build(); // 4. Extensions for server certificate var extensions = new ExtBuilder() .SubjectAlternativeName(new[] { "www.example.com", "example.com", "api.example.com" }) .KeyUsage(KeyUsageFlags.DigitalSignature | KeyUsageFlags.KeyEncipherment) .ExtendedKeyUsage(ExtKeyUsage.ServerAuth) .Build(); // 5. Create and sign CSR var csr = ctx.CreateCertificateRequest(serverKey, dn, extensions); // 6. Save as PEM File.WriteAllText("server.csr.pem", csr.ToPem()); File.WriteAllText("server.key.pem", serverKey.ToEncryptedPem("SecurePassword123!")); Console.WriteLine("CSR created: server.csr.pem"); Console.WriteLine($"Subject: {csr.Subject}"); Console.WriteLine($"SANs: {string.Join(", ", csr.SubjectAlternativeNames)}"); ---- ===== Parameters ===== ==== Subject Alternative Names ==== ^ Type ^ Prefix ^ Example ^ | DNS Name | dns: | www.example.com | | IP Address | ip: | 192.168.1.100 | | Email | email: | admin@example.com | | URI | uri: | https://example.com | ==== Key Usage for Server ==== ^ Flag ^ Description ^ Required ^ | digitalSignature | Sign TLS handshake | Yes | | keyEncipherment | RSA key exchange (not for ECDHE) | Optional | | keyAgreement | ECDH key exchange | Optional | ---- ===== Output Files ===== ==== server.csr.pem ==== -----BEGIN CERTIFICATE REQUEST----- MIICxjCCAi0CAQAwgYExCz... (Base64 DER) -----END CERTIFICATE REQUEST----- ^ Field ^ Value ^ | Version | 1 (0x00) | | Subject | CN=www.example.com, O=Example GmbH, C=DE | | Public Key | ML-DSA-65 (~1,952 bytes) | | Attributes | Extension Request (SAN, Key Usage, EKU) | | Signature | ML-DSA-65 (Self-Proof-of-Possession) | ---- ===== Common Errors ===== ^ Problem ^ Cause ^ Solution ^ | CSR rejected | CN not in SAN | Always add CN as SAN too | | CA does not accept CSR | Wrong format | Check PEM format | | Key Usage missing | Extensions not set | Use ExtBuilder | ---- ===== Related Scenarios ===== ^ Relationship ^ Scenario ^ Description ^ | **Next Step** | [[en:int:pqcrypt:szenarien:zertifikate:server_cert|3.1 Server Certificate]] | Have CSR signed by CA | | **Alternative** | [[.:csr_multi_san|2.3 Multi-SAN CSR]] | Multiple domains | | **Related** | [[.:csr_client|2.2 Client CSR]] | For client authentication | ---- << [[.:start|<- CSR Overview]] | [[en:int:pqcrypt:szenarien:start|^ Scenarios]] | [[.:csr_client|2.2 Client CSR ->]] >> {{tag>scenario csr server tls san ml-dsa}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//