refactor(meshtls-rustls): use generalized key type
This commit is contained in:
		
							parent
							
								
									2bb9b8980c
								
							
						
					
					
						commit
						53def53c32
					
				|  | @ -115,7 +115,6 @@ prost = { version = "0.13" } | ||||||
| prost-build = { version = "0.13", default-features = false } | prost-build = { version = "0.13", default-features = false } | ||||||
| prost-types = { version = "0.13" } | prost-types = { version = "0.13" } | ||||||
| tokio-rustls = { version = "0.26", default-features = false, features = [ | tokio-rustls = { version = "0.26", default-features = false, features = [ | ||||||
|     "ring", |  | ||||||
|     "logging", |     "logging", | ||||||
| ] } | ] } | ||||||
| tonic = { version = "0.12", default-features = false } | tonic = { version = "0.12", default-features = false } | ||||||
|  |  | ||||||
|  | @ -8,17 +8,12 @@ pub use self::{receiver::Receiver, store::Store}; | ||||||
| use linkerd_dns_name as dns; | use linkerd_dns_name as dns; | ||||||
| use linkerd_error::Result; | use linkerd_error::Result; | ||||||
| use linkerd_identity as id; | use linkerd_identity as id; | ||||||
| use ring::error::KeyRejected; |  | ||||||
| use std::sync::Arc; | use std::sync::Arc; | ||||||
| use thiserror::Error; | use thiserror::Error; | ||||||
| use tokio::sync::watch; | use tokio::sync::watch; | ||||||
| use tokio_rustls::rustls::{self, crypto::CryptoProvider}; | use tokio_rustls::rustls::{self, crypto::CryptoProvider}; | ||||||
| use tracing::warn; | use tracing::warn; | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Error)] |  | ||||||
| #[error("{0}")] |  | ||||||
| pub struct InvalidKey(#[source] KeyRejected); |  | ||||||
| 
 |  | ||||||
| #[derive(Debug, Error)] | #[derive(Debug, Error)] | ||||||
| #[error("invalid trust roots")] | #[error("invalid trust roots")] | ||||||
| pub struct InvalidTrustRoots(()); | pub struct InvalidTrustRoots(()); | ||||||
|  | @ -118,12 +113,8 @@ mod params { | ||||||
|     use tokio_rustls::rustls::{self, crypto::WebPkiSupportedAlgorithms}; |     use tokio_rustls::rustls::{self, crypto::WebPkiSupportedAlgorithms}; | ||||||
| 
 | 
 | ||||||
|     // These must be kept in sync:
 |     // These must be kept in sync:
 | ||||||
|     pub static SIGNATURE_ALG_RING_SIGNING: &ring::signature::EcdsaSigningAlgorithm = |  | ||||||
|         &ring::signature::ECDSA_P256_SHA256_ASN1_SIGNING; |  | ||||||
|     pub const SIGNATURE_ALG_RUSTLS_SCHEME: rustls::SignatureScheme = |     pub const SIGNATURE_ALG_RUSTLS_SCHEME: rustls::SignatureScheme = | ||||||
|         rustls::SignatureScheme::ECDSA_NISTP256_SHA256; |         rustls::SignatureScheme::ECDSA_NISTP256_SHA256; | ||||||
|     pub const SIGNATURE_ALG_RUSTLS_ALGORITHM: rustls::SignatureAlgorithm = |  | ||||||
|         rustls::SignatureAlgorithm::ECDSA; |  | ||||||
|     pub static SUPPORTED_SIG_ALGS: &WebPkiSupportedAlgorithms = backend::SUPPORTED_SIG_ALGS; |     pub static SUPPORTED_SIG_ALGS: &WebPkiSupportedAlgorithms = backend::SUPPORTED_SIG_ALGS; | ||||||
|     pub static TLS_VERSIONS: &[&rustls::SupportedProtocolVersion] = &[&rustls::version::TLS13]; |     pub static TLS_VERSIONS: &[&rustls::SupportedProtocolVersion] = &[&rustls::version::TLS13]; | ||||||
|     pub static TLS_SUPPORTED_CIPHERSUITES: &[rustls::SupportedCipherSuite] = |     pub static TLS_SUPPORTED_CIPHERSUITES: &[rustls::SupportedCipherSuite] = | ||||||
|  |  | ||||||
|  | @ -1,12 +1,16 @@ | ||||||
| use super::{default_provider, params::*, InvalidKey}; | use super::{default_provider, params::*}; | ||||||
| use linkerd_dns_name as dns; | use linkerd_dns_name as dns; | ||||||
| use linkerd_error::Result; | use linkerd_error::Result; | ||||||
| use linkerd_identity as id; | use linkerd_identity as id; | ||||||
| use linkerd_meshtls_verifier as verifier; | use linkerd_meshtls_verifier as verifier; | ||||||
| use ring::{rand, signature::EcdsaKeyPair}; |  | ||||||
| use std::{convert::TryFrom, sync::Arc}; | use std::{convert::TryFrom, sync::Arc}; | ||||||
| use tokio::sync::watch; | use tokio::sync::watch; | ||||||
| use tokio_rustls::rustls::{self, pki_types::UnixTime, server::WebPkiClientVerifier}; | use tokio_rustls::rustls::{ | ||||||
|  |     self, | ||||||
|  |     pki_types::{PrivatePkcs8KeyDer, UnixTime}, | ||||||
|  |     server::WebPkiClientVerifier, | ||||||
|  |     sign::CertifiedKey, | ||||||
|  | }; | ||||||
| use tracing::debug; | use tracing::debug; | ||||||
| 
 | 
 | ||||||
| pub struct Store { | pub struct Store { | ||||||
|  | @ -16,12 +20,8 @@ pub struct Store { | ||||||
|     server_name: dns::Name, |     server_name: dns::Name, | ||||||
|     client_tx: watch::Sender<Arc<rustls::ClientConfig>>, |     client_tx: watch::Sender<Arc<rustls::ClientConfig>>, | ||||||
|     server_tx: watch::Sender<Arc<rustls::ServerConfig>>, |     server_tx: watch::Sender<Arc<rustls::ServerConfig>>, | ||||||
|     random: ring::rand::SystemRandom, |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Clone, Debug)] |  | ||||||
| struct Key(Arc<EcdsaKeyPair>); |  | ||||||
| 
 |  | ||||||
| #[derive(Clone, Debug)] | #[derive(Clone, Debug)] | ||||||
| struct CertResolver(Arc<rustls::sign::CertifiedKey>); | struct CertResolver(Arc<rustls::sign::CertifiedKey>); | ||||||
| 
 | 
 | ||||||
|  | @ -90,7 +90,6 @@ impl Store { | ||||||
|             server_name, |             server_name, | ||||||
|             client_tx, |             client_tx, | ||||||
|             server_tx, |             server_tx, | ||||||
|             random: ring::rand::SystemRandom::new(), |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -147,13 +146,11 @@ impl id::Credentials for Store { | ||||||
|         // Use the client's verifier to validate the certificate for our local name.
 |         // Use the client's verifier to validate the certificate for our local name.
 | ||||||
|         self.validate(&chain)?; |         self.validate(&chain)?; | ||||||
| 
 | 
 | ||||||
|         let key = EcdsaKeyPair::from_pkcs8(SIGNATURE_ALG_RING_SIGNING, &key, &self.random) |         let key_der = PrivatePkcs8KeyDer::from(key); | ||||||
|             .map_err(InvalidKey)?; |         let provider = rustls::crypto::CryptoProvider::get_default() | ||||||
| 
 |             .expect("Failed to get default crypto provider"); | ||||||
|         let resolver = Arc::new(CertResolver(Arc::new(rustls::sign::CertifiedKey::new( |         let key = CertifiedKey::from_der(chain, key_der.into(), provider)?; | ||||||
|             chain, |         let resolver = Arc::new(CertResolver(Arc::new(key))); | ||||||
|             Arc::new(Key(Arc::new(key))), |  | ||||||
|         )))); |  | ||||||
| 
 | 
 | ||||||
|         // Build new client and server TLS configs.
 |         // Build new client and server TLS configs.
 | ||||||
|         let client = self.client_config(resolver.clone()); |         let client = self.client_config(resolver.clone()); | ||||||
|  | @ -167,39 +164,6 @@ impl id::Credentials for Store { | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // === impl Key ===
 |  | ||||||
| 
 |  | ||||||
| impl rustls::sign::SigningKey for Key { |  | ||||||
|     fn choose_scheme( |  | ||||||
|         &self, |  | ||||||
|         offered: &[rustls::SignatureScheme], |  | ||||||
|     ) -> Option<Box<dyn rustls::sign::Signer>> { |  | ||||||
|         if !offered.contains(&SIGNATURE_ALG_RUSTLS_SCHEME) { |  | ||||||
|             return None; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         Some(Box::new(self.clone())) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     fn algorithm(&self) -> rustls::SignatureAlgorithm { |  | ||||||
|         SIGNATURE_ALG_RUSTLS_ALGORITHM |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl rustls::sign::Signer for Key { |  | ||||||
|     fn sign(&self, message: &[u8]) -> Result<Vec<u8>, rustls::Error> { |  | ||||||
|         let rng = rand::SystemRandom::new(); |  | ||||||
|         self.0 |  | ||||||
|             .sign(&rng, message) |  | ||||||
|             .map(|signature| signature.as_ref().to_owned()) |  | ||||||
|             .map_err(|ring::error::Unspecified| rustls::Error::General("Signing Failed".to_owned())) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     fn scheme(&self) -> rustls::SignatureScheme { |  | ||||||
|         SIGNATURE_ALG_RUSTLS_SCHEME |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // === impl CertResolver ===
 | // === impl CertResolver ===
 | ||||||
| 
 | 
 | ||||||
| impl CertResolver { | impl CertResolver { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue