use rustls::crypto::CryptoProvider;
use rustls::{ClientConfig, RootCertStore};
use std::sync::{Arc, LazyLock};
static CLIENT_CONFIG: LazyLock<Arc<ClientConfig>> = LazyLock::new(|| {
let mut roots = RootCertStore::empty();
roots.extend(webpki_roots::TLS_SERVER_ROOTS.iter().cloned());
let config = ClientConfig::builder_with_provider(crypto_provider())
.with_safe_default_protocol_versions()
.expect("the crypto provider supports the default TLS protocol versions")
.with_root_certificates(roots)
.with_no_client_auth();
Arc::new(config)
});
pub fn install_default_crypto_provider() {
if CryptoProvider::get_default().is_none() {
let _ = rustls::crypto::ring::default_provider().install_default();
}
}
pub fn crypto_provider() -> Arc<CryptoProvider> {
install_default_crypto_provider();
CryptoProvider::get_default()
.expect("a default crypto provider has just been installed")
.clone()
}
pub fn rustls_client_config() -> Arc<ClientConfig> {
CLIENT_CONFIG.clone()
}