Generate a full PKI: CA → server cert (for `localhost`) + client cert. Returns a `TempDir` that must be kept alive while the paths are in use.
()
| 497 | /// Generate a full PKI: CA → server cert (for `localhost`) + client cert. |
| 498 | /// Returns a `TempDir` that must be kept alive while the paths are in use. |
| 499 | pub fn generate_pki() -> (tempfile::TempDir, PkiBundle) { |
| 500 | // Generate CA |
| 501 | let mut ca_params = |
| 502 | CertificateParams::new(Vec::<String>::new()).expect("failed to create CA params"); |
| 503 | ca_params.is_ca = IsCa::Ca(rcgen::BasicConstraints::Unconstrained); |
| 504 | ca_params |
| 505 | .distinguished_name |
| 506 | .push(rcgen::DnType::CommonName, "test-ca"); |
| 507 | let ca_key = KeyPair::generate().expect("failed to generate CA key"); |
| 508 | let ca_cert = ca_params |
| 509 | .self_signed(&ca_key) |
| 510 | .expect("failed to sign CA cert"); |
| 511 | |
| 512 | // Generate server cert signed by CA |
| 513 | let server_params = CertificateParams::new(vec!["localhost".to_string()]) |
| 514 | .expect("failed to create server params"); |
| 515 | let server_key = KeyPair::generate().expect("failed to generate server key"); |
| 516 | let server_cert = server_params |
| 517 | .signed_by(&server_key, &ca_cert, &ca_key) |
| 518 | .expect("failed to sign server cert"); |
| 519 | |
| 520 | // Generate client cert signed by CA |
| 521 | let mut client_params = |
| 522 | CertificateParams::new(Vec::<String>::new()).expect("failed to create client params"); |
| 523 | client_params |
| 524 | .distinguished_name |
| 525 | .push(rcgen::DnType::CommonName, "test-client"); |
| 526 | let client_key = KeyPair::generate().expect("failed to generate client key"); |
| 527 | let client_cert = client_params |
| 528 | .signed_by(&client_key, &ca_cert, &ca_key) |
| 529 | .expect("failed to sign client cert"); |
| 530 | |
| 531 | let dir = tempdir().expect("failed to create tempdir"); |
| 532 | let write_file = |name: &str, data: &[u8]| { |
| 533 | let path = dir.path().join(name); |
| 534 | std::fs::File::create(&path) |
| 535 | .and_then(|mut f| f.write_all(data)) |
| 536 | .expect("failed to write file"); |
| 537 | }; |
| 538 | |
| 539 | write_file("ca.pem", ca_cert.pem().as_bytes()); |
| 540 | write_file("server-cert.pem", server_cert.pem().as_bytes()); |
| 541 | write_file("server-key.pem", server_key.serialize_pem().as_bytes()); |
| 542 | write_file("client-cert.pem", client_cert.pem().as_bytes()); |
| 543 | write_file("client-key.pem", client_key.serialize_pem().as_bytes()); |
| 544 | |
| 545 | let bundle = PkiBundle { |
| 546 | ca_cert_pem: ca_cert.pem().into_bytes(), |
| 547 | server_cert_pem: server_cert.pem().into_bytes(), |
| 548 | server_key_pem: server_key.serialize_pem().into_bytes(), |
| 549 | client_cert_pem: client_cert.pem().into_bytes(), |
| 550 | client_key_pem: client_key.serialize_pem().into_bytes(), |
| 551 | }; |
| 552 | |
| 553 | (dir, bundle) |
| 554 | } |
| 555 | |
| 556 | /// Start a TLS-wrapped test server using the given `TlsAcceptor`. |
no test coverage detected