Skip to content

Commit 8248b9f

Browse files
djccomplexspaces
authored andcommitted
Add new update-certs script as example
1 parent 670de1a commit 8248b9f

File tree

3 files changed

+48
-43
lines changed

3 files changed

+48
-43
lines changed

rustls-platform-verifier/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ windows-sys = { version = ">=0.52.0, <0.60.0", default-features = false, feature
6464

6565
[dev-dependencies]
6666
rustls = { version = "0.23", default-features = false, features = ["ring"] }
67+
webpki-root-certs = "0.26"
6768

6869
[package.metadata.docs.rs]
6970
rustdoc-args = ["--cfg", "docsrs"]
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
use std::{fs, io::Write, net::TcpStream, sync::Arc};
2+
3+
use rustls::{pki_types::ServerName, ClientConfig, ClientConnection, RootCertStore, Stream};
4+
use webpki_root_certs::TLS_SERVER_ROOT_CERTS;
5+
6+
fn main() -> Result<(), Box<dyn std::error::Error>> {
7+
let mut roots = RootCertStore::empty();
8+
let (_, ignored) = roots.add_parsable_certificates(TLS_SERVER_ROOT_CERTS.iter().cloned());
9+
assert_eq!(ignored, 0, "{ignored} root certificates were ignored");
10+
let config = Arc::new(
11+
ClientConfig::builder()
12+
.with_root_certificates(roots)
13+
.with_no_client_auth(),
14+
);
15+
16+
for &host in HOSTS {
17+
let server_name = ServerName::try_from(host)?;
18+
let mut conn = ClientConnection::new(config.clone(), server_name)?;
19+
let mut sock = TcpStream::connect((host, 443))?;
20+
let mut stream = Stream::new(&mut conn, &mut sock);
21+
22+
eprintln!("connecting to {host}...");
23+
if let Err(err) = stream.write_all(b"GET / HTTP/1.1\r\n\r\n") {
24+
eprintln!("failed to write to {host}: {err}");
25+
}
26+
27+
let Some(certs) = conn.peer_certificates() else {
28+
eprintln!("no certificates received for {host}");
29+
continue;
30+
};
31+
32+
for (i, der) in certs.iter().enumerate() {
33+
let host_name = host.replace('.', "_");
34+
let fname = format!(
35+
"{}/src/tests/verification_real_world/{host_name}_valid_{}.crt",
36+
env!("CARGO_MANIFEST_DIR"),
37+
i + 1
38+
);
39+
fs::write(&fname, der.as_ref())?;
40+
eprintln!("wrote certificate to {fname}");
41+
}
42+
}
43+
44+
Ok(())
45+
}
46+
47+
const HOSTS: &[&str] = &["letsencrypt.org"];

rustls-platform-verifier/src/tests/verification_real_world/update_valid_ee_certs.rs

Lines changed: 0 additions & 43 deletions
This file was deleted.

0 commit comments

Comments
 (0)