Ich erstelle einen minimalen TLS 1.3/HTTPS -Server in Java nur mit Sockets. Beim Testen mit OpenSSL wird der Serverhello akzeptiert, aber wenn es Zeit für verschlüsseltes Erweiterung fehlschlägt. Nach dem Debuggen mit der Flag -TEYLOGFILE kam ich zu dem Schluss, dass der "server_handshake_traffic_secret" auf dem Server (ME) und dem Client (OpenSSL) nicht gleich ist. Kontext, Länge, Salz gegen IKM und AAD (für AES/GCM). Ich habe dreimal alles überprüft.
public static byte[] expandLabel(byte[] secret, String label, byte[] context, int length)
throws NoSuchAlgorithmException, InvalidKeyException {
// Prefix the label with "tls13 " as per TLS 1.3 spec
String fullLabel = "tls13 " + label;
byte[] labelBytes = fullLabel.getBytes(StandardCharsets.UTF_8);
byte[] contextBytes = (context != null) ? context : new byte[0];
// Total length of the label structure
int hkdfLabelLength = 2 + 1 + labelBytes.length + 1 + contextBytes.length;
if (labelBytes.length < 7 || labelBytes.length > 255) {
throw new IllegalArgumentException("Label length must be between 7 and 255 bytes");
}
if (contextBytes.length > 255) {
throw new IllegalArgumentException("Context length must be between 0 and 255 bytes");
}
ByteBuffer buffer = ByteBuffer.allocate(hkdfLabelLength);
// Set byte order to BIG_ENDIAN for TLS 1.3 spec compliance
// buffer.order(ByteOrder.BIG_ENDIAN);
// Write the output length (uint16)
buffer.putShort((short) length);
// Write the label length (uint8) and the label bytes
buffer.put((byte) labelBytes.length);
buffer.put(labelBytes);
// Write the context length (uint8) and the context bytes
buffer.put((byte) contextBytes.length);
buffer.put(contextBytes);
byte[] hkdfLabel = buffer.array();
return expand(secret, hkdfLabel, length);
}
NamedParameterSpec paramSpec = new NamedParameterSpec("X25519");
ECGenParameterSpec ecSpec = new ECGenParameterSpec("X25519");
KeyFactory kf = KeyFactory.getInstance("X25519");
XECPublicKeySpec clientPublicKeySpec = new XECPublicKeySpec(paramSpec,
new BigInteger(1, clientPubKey));
XECPublicKey clientPublicKey = (XECPublicKey) kf.generatePublic(clientPublicKeySpec);
XECPrivateKey secretKey = (XECPrivateKey) key.getPrivate();
KeyAgreement ka = KeyAgreement.getInstance("X25519");
ka.init(secretKey);
ka.doPhase(clientPublicKey, true);
byte[] sharedSecret = ka.generateSecret();
< /code>
Schlüsselplan.KeySchedule ks = new KeySchedule();
ks.early_secret = HKDF.extract(HKDF.zeros, HKDF.zeros);
System.out.println("early_serect: " + Hex.toHexString(ks.early_secret) + " zeros length "+ HKDF.zeros.length);
ks.derived_secret = HKDF.expandLabel(ks.early_secret, "derived", null, 32);
ks.handshake_secret = HKDF.extract(ks.derived_secret, sharedSecret);
// ks.handshake_secret = HKDF.extract(sharedSecret, ks.derived_secret);
ks.server_handshake_traffic_secret = HKDF.expandLabel(ks.handshake_secret, "s hs traffic",trascriptHash, 32);//
Ich habe eine einfache Implementierung von HKDF (extrahieren und erweitert) unter Verwendung von Bouncy Castle HMAC und mit dem ersten Testfall aus dem RFC5869 getestet. Testfall nicht hier, sondern arbeiten.public static byte[] extract(byte[] salt, byte[] ikm)
throws NoSuchAlgorithmException, InvalidKeyException {
if (salt == null || salt.length == 0) {
// If salt is not provided, use a string of HashLen zeros
salt = new byte[32]; // 32 for SHA-256
}
Mac mac = Mac.getInstance(HMAC_ALGORITHM);
mac.init(new SecretKeySpec(salt, HMAC_ALGORITHM));
return mac.doFinal(ikm); // PRK
}
// HKDF-Expand(PRK, info, length)
public static byte[] expand(byte[] prk, byte[] info, int outputLength)
throws NoSuchAlgorithmException, InvalidKeyException {
int hashLen = 32; // for SHA-256
int n = (int) Math.ceil((double) outputLength / hashLen);
if (n > 255) {
throw new IllegalArgumentException("Cannot expand to more than 255 blocks");
}
byte[] okm = new byte[outputLength];
byte[] previousT = new byte[0];
Mac mac = Mac.getInstance(HMAC_ALGORITHM);
mac.init(new SecretKeySpec(prk, HMAC_ALGORITHM));
int offset = 0;
for (int i = 1; i
Ich erstelle einen minimalen TLS 1.3/HTTPS -Server in Java nur mit Sockets. Beim Testen mit OpenSSL wird der Serverhello akzeptiert, aber wenn es Zeit für verschlüsseltes Erweiterung fehlschlägt. Nach dem Debuggen mit der Flag -TEYLOGFILE kam ich zu dem Schluss, dass der "server_handshake_traffic_secret" auf dem Server (ME) und dem Client (OpenSSL) nicht gleich ist. Kontext, Länge, Salz gegen IKM und AAD (für AES/GCM). Ich habe dreimal alles überprüft.[code]public static byte[] expandLabel(byte[] secret, String label, byte[] context, int length) throws NoSuchAlgorithmException, InvalidKeyException {
// Prefix the label with "tls13 " as per TLS 1.3 spec String fullLabel = "tls13 " + label; byte[] labelBytes = fullLabel.getBytes(StandardCharsets.UTF_8); byte[] contextBytes = (context != null) ? context : new byte[0];
// Total length of the label structure int hkdfLabelLength = 2 + 1 + labelBytes.length + 1 + contextBytes.length;
if (labelBytes.length < 7 || labelBytes.length > 255) { throw new IllegalArgumentException("Label length must be between 7 and 255 bytes"); } if (contextBytes.length > 255) { throw new IllegalArgumentException("Context length must be between 0 and 255 bytes"); }
ks.server_handshake_traffic_secret = HKDF.expandLabel(ks.handshake_secret, "s hs traffic",trascriptHash, 32);// Ich habe eine einfache Implementierung von HKDF (extrahieren und erweitert) unter Verwendung von Bouncy Castle HMAC und mit dem ersten Testfall aus dem RFC5869 getestet. Testfall nicht hier, sondern arbeiten.public static byte[] extract(byte[] salt, byte[] ikm) throws NoSuchAlgorithmException, InvalidKeyException { if (salt == null || salt.length == 0) { // If salt is not provided, use a string of HashLen zeros salt = new byte[32]; // 32 for SHA-256 }
Mac mac = Mac.getInstance(HMAC_ALGORITHM); mac.init(new SecretKeySpec(salt, HMAC_ALGORITHM)); return mac.doFinal(ikm); // PRK }
// HKDF-Expand(PRK, info, length) public static byte[] expand(byte[] prk, byte[] info, int outputLength) throws NoSuchAlgorithmException, InvalidKeyException { int hashLen = 32; // for SHA-256 int n = (int) Math.ceil((double) outputLength / hashLen); if (n > 255) { throw new IllegalArgumentException("Cannot expand to more than 255 blocks"); }
byte[] okm = new byte[outputLength]; byte[] previousT = new byte[0]; Mac mac = Mac.getInstance(HMAC_ALGORITHM); mac.init(new SecretKeySpec(prk, HMAC_ALGORITHM));
Ich entwickle einen einfachen SQL -Proxy in C# .NET, um den TDS -Datenverkehr zwischen einem Client und einem SQL -Server abzufangen und zu ändern. Der Proxy soll:
Ich erstelle eine Client-Server-Anwendung. Ich versuche, eine TLS-Kommunikation herzustellen, aber der TLS-Handshake schlägt fehl. Der Server und der Client befinden sich beide auf demselben...
Ich habe meinen Schlüsselgewölbe mit einem Schlüssel namens Azure-Clientsecret konfiguriert, der vom Schlüsselverluderkonfigurationsanbieter abgerufen und den Schlüsselnamen Azure: Clientcret von...
Ich habe eine auf Google Cloud Run gehostete .NET-Anwendung, die auf den GCP Secret Manager zugreifen muss. Meine Anwendung funktioniert ohne Proxy einwandfrei, aber wenn ich mithilfe von...
In Bezug auf Ubuntu 20.04 läuft in wenigen Monaten in den Ruhestand. Ich kann SQL Server 2017 Docker Container nicht an der neuesten Ubuntu Microsoft -Hosted -Agenten auf Azure DevOps funktioniert....