Enhance TLS key handling in WebSocket server: Add support for SEC1 (EC PRIVATE KEY) in key loading process, improving flexibility for private key formats. Update error messages for clarity on key requirements. Include warning for clients when SSL is enabled but TLS is not active, ensuring proper connection protocols are used.
This commit is contained in:
@@ -20,8 +20,10 @@ use tokio_rustls::rustls::{self, ServerConfig};
|
|||||||
use tokio_rustls::TlsAcceptor;
|
use tokio_rustls::TlsAcceptor;
|
||||||
use tokio_tungstenite::tungstenite::Message;
|
use tokio_tungstenite::tungstenite::Message;
|
||||||
use tokio_tungstenite::accept_async;
|
use tokio_tungstenite::accept_async;
|
||||||
use rustls_pemfile::{certs, pkcs8_private_keys, rsa_private_keys};
|
use rustls_pemfile::{certs, ec_private_keys, pkcs8_private_keys, rsa_private_keys};
|
||||||
use rustls::pki_types::{CertificateDer, PrivateKeyDer, PrivatePkcs1KeyDer, PrivatePkcs8KeyDer};
|
use rustls::pki_types::{
|
||||||
|
CertificateDer, PrivateKeyDer, PrivatePkcs1KeyDer, PrivatePkcs8KeyDer, PrivateSec1KeyDer,
|
||||||
|
};
|
||||||
|
|
||||||
/// Einfacher WebSocket-Server auf Basis von Tokio + tokio-tungstenite.
|
/// Einfacher WebSocket-Server auf Basis von Tokio + tokio-tungstenite.
|
||||||
///
|
///
|
||||||
@@ -132,7 +134,7 @@ fn create_tls_acceptor(
|
|||||||
let key_file = File::open(key_path)?;
|
let key_file = File::open(key_path)?;
|
||||||
let mut key_reader = BufReader::new(key_file);
|
let mut key_reader = BufReader::new(key_file);
|
||||||
|
|
||||||
// Versuche zuerst PKCS8, dann ggf. RSA-Key
|
// Versuche zuerst PKCS8, dann ggf. RSA-Key, dann SEC1 (EC PRIVATE KEY).
|
||||||
let mut keys: Vec<PrivateKeyDer<'static>> = pkcs8_private_keys(&mut key_reader)
|
let mut keys: Vec<PrivateKeyDer<'static>> = pkcs8_private_keys(&mut key_reader)
|
||||||
.map(|res: Result<PrivatePkcs8KeyDer<'static>, _>| res.map(PrivateKeyDer::Pkcs8))
|
.map(|res: Result<PrivatePkcs8KeyDer<'static>, _>| res.map(PrivateKeyDer::Pkcs8))
|
||||||
.collect::<Result<_, _>>()?;
|
.collect::<Result<_, _>>()?;
|
||||||
@@ -147,7 +149,16 @@ fn create_tls_acceptor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if keys.is_empty() {
|
if keys.is_empty() {
|
||||||
return Err("Key-Datei enthält keinen privaten Schlüssel (PKCS8 oder RSA)".into());
|
// Leser zurücksetzen und SEC1 (EC PRIVATE KEY) versuchen
|
||||||
|
let key_file = File::open(key_path)?;
|
||||||
|
let mut key_reader = BufReader::new(key_file);
|
||||||
|
keys = ec_private_keys(&mut key_reader)
|
||||||
|
.map(|res: Result<PrivateSec1KeyDer<'static>, _>| res.map(PrivateKeyDer::Sec1))
|
||||||
|
.collect::<Result<_, _>>()?;
|
||||||
|
}
|
||||||
|
|
||||||
|
if keys.is_empty() {
|
||||||
|
return Err("Key-Datei enthält keinen privaten Schlüssel (PKCS8, RSA oder SEC1)".into());
|
||||||
}
|
}
|
||||||
|
|
||||||
let private_key = keys.remove(0);
|
let private_key = keys.remove(0);
|
||||||
@@ -199,7 +210,6 @@ impl WebSocketServer {
|
|||||||
"Starte WebSocket-Server auf Port {} mit SSL (cert: {:?}, key: {:?})",
|
"Starte WebSocket-Server auf Port {} mit SSL (cert: {:?}, key: {:?})",
|
||||||
self.port, self.cert_path, self.key_path
|
self.port, self.cert_path, self.key_path
|
||||||
);
|
);
|
||||||
// Hinweis: SSL-Unterstützung ist noch nicht implementiert.
|
|
||||||
} else {
|
} else {
|
||||||
println!("Starte WebSocket-Server auf Port {} (ohne SSL)", self.port);
|
println!("Starte WebSocket-Server auf Port {} (ohne SSL)", self.port);
|
||||||
}
|
}
|
||||||
@@ -233,6 +243,9 @@ impl WebSocketServer {
|
|||||||
eprintln!(
|
eprintln!(
|
||||||
"[WebSocketServer] TLS-Initialisierung fehlgeschlagen, starte ohne SSL: {err}"
|
"[WebSocketServer] TLS-Initialisierung fehlgeschlagen, starte ohne SSL: {err}"
|
||||||
);
|
);
|
||||||
|
eprintln!(
|
||||||
|
"[WebSocketServer] ACHTUNG: WEBSOCKET_SSL_ENABLED=true, aber TLS ist nicht aktiv. Clients müssen dann ws:// statt wss:// verwenden."
|
||||||
|
);
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user