Замена привязки канала сеанса tls: поиск общего материала между Java и csharpC#

Место общения программистов C#
Ответить
Anonymous
 Замена привязки канала сеанса tls: поиск общего материала между Java и csharp

Сообщение Anonymous »

Поскольку Java JSSE пока не поддерживает токены привязки каналов (CBT), я не могу написать MitM-доказательные аутентификационные рукопожатия через делегированное TLS-соединение, используя простой «tls-unique» токен, который есть в RFC 5056 и в основном https: //www.rfc-editor.org/rfc/rfc5929.html описывает.
Если вы хотите знать, почему CBT имеет решающее значение для аутентификации на уровне приложения, см. https://csb. stevekerrison.com/post/2022-01-channel-binding/
Токен «tls-server-end-point» также недоступен, но он заставил меня подумать, что я могу сварить некоторая замена сертификата открытого ключа сервера, с которой должны согласиться оба узла (если нет MitM).
Итак, я подумал: хорошо, давайте sha256 ожидаемый/видимый открытый ключ сервера на каждом сторону и использовать ее как токен.
Моя проблема в том, что одна сторона находится в Java, другая в C#, и они не могут создать общий byte[], который был бы сопоставим. Я имею в виду, что API-интерфейсы сообщают о различных закодированных форматах сертификата, открытого ключа или подписи, но они не имеют одинакового формата на этих языках.
Мне удалось получить клиент C# подключитесь к Java-серверу, управляя обоими источниками, и с каждой стороны углубитесь в открытый ключ RSA, чтобы найти модуль и показатель степени (и даже в этом случае представление byte[] BigInteger все еще немного отклонялось от знакового байта), но Мне бы не хотелось знать обо всех подобных типах сертификатов. Это не продлится долго, учитывая шум всех будущих изменений TLS. Это будет означать исправления обслуживания, особенно на двух языках.
Мои вопросы: в каком формате эти сертификаты, открытые ключи и подписи, как их анализировать и почему byte[] не представляет они одинаковы в разных реализациях, поскольку они отправлялись по протоколу TCP/TLS?
---- параметры клиента csharp: [имя хоста [порт]] --------
using System;
using System.Text;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.Net.Sockets;

class DumpCerts
{
static void Main(string[] args)
{
string server = args.Length>0 ? args[0] : "google.com";
int port = args.Length>1 ? int.Parse(args[1]) : 443;

using (var client = new TcpClient(server, port)) {
using (var sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(CertificateValidationCallback), null))
{
sslStream.AuthenticateAsClient(server);
var remoteCertificate = sslStream.RemoteCertificate as X509Certificate2;

if (remoteCertificate != null)
{
//Console.WriteLine("Certificate: " + Convert.ToBase64String(remoteCertificate.RawData));
//Console.WriteLine("Public Key: " + Convert.ToBase64String(remoteCertificate.GetPublicKey()));

X509Chain chain = new X509Chain();
chain.Build(remoteCertificate);
int i=0;
foreach (var element in chain.ChainElements)
{
var cert = element.Certificate as X509Certificate2;
var pubk = cert.PublicKey;
//NOTE: cert.GetPublicKey() is a byte[] equals to pubk.EncodedKeyValue.RawData

byte[] sig = cert.GetRawCertData();

Console.WriteLine("\n\n-----------\npub key["+i+"]: "+cert.Subject
+"\npubl key : " + pubk
+"\npubl key oid: " + pubk.Oid
+"\npubl key oid value: " + pubk.Oid.Value
+"\npubk.enc key val len: " + (pubk.EncodedKeyValue.RawData).Length
+"\npubk.enc key val hex: " + byteArrayToHex(pubk.EncodedKeyValue.RawData)
+"\nsig len: " + sig.Length
+"\nsig hex: " + byteArrayToHex(sig)
);

//using (var rsa = RSA.Create()) {
// rsa.ImportSubjectPublicKeyInfo(pubk.EncodedKeyValue.RawData, out _);
// byte[] publicKeyBytes = rsa.ExportSubjectPublicKeyInfo();
using (RSA rsa = remoteCertificate.GetRSAPublicKey())
{
var rsaParameters = rsa.ExportParameters(false);
Console.WriteLine("\n"
+"\nmodulus len: "+ (rsaParameters.Modulus.Length)
+"\nmodulus hex: "+ byteArrayToHex(rsaParameters.Modulus)

+"\nexponent len: "+ (rsaParameters.Exponent.Length)
+"\nexponent hex: "+ byteArrayToHex(rsaParameters.Exponent)
);
}
i++;
}
}
}
}
}

static bool CertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true; // Always accept the certificate
}

static string byteArrayToHex(byte[] input) {
int bytesPerLine = 64;
char[] HEX = "0123456789ABCDEF".ToCharArray();
StringBuilder result = new StringBuilder();
byte[] buffer = new byte[bytesPerLine];
int offset = 0;

while (offset < input.Length) {
int length = Math.Min(buffer.Length, input.Length - offset);
Array.Copy(input, offset, buffer, 0, length);

StringBuilder hex = new StringBuilder();
StringBuilder ascii = new StringBuilder();
for (int i = 0; i < length; i++) {
int v = buffer & 0xFF;
hex.Append(HEX[v >> 4]);
hex.Append(HEX[v & 0x0F]);
ascii.Append((v >= 32 && v 4]);
hex.append(HEX[v & 0x0F]);
ascii.append((v >= 32 && v

Подробнее здесь: https://stackoverflow.com/questions/791 ... -between-j
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»