Поскольку Java JSSE пока не поддерживает токены привязки каналов (CBT), я не могу написать MitM-доказательные аутентификационные рукопожатия через делегированное TLS-соединение, используя простой «tls-unique» токен, описанный в RFC 5056. p>
Если вы хотите узнать, почему CBT имеет решающее значение для аутентификации на уровне приложения, см. https://csb.stevekerrison.com/post/2022 ... ding/Токен «tls-server-end-point» также недоступен, но это заставило меня подумать, что я мог бы создать какую-то замену из сертификата открытого ключа сервера, с которой оба узла должны согласиться (если нет MitM).
Итак, я подумал: хорошо, давайте sha256 ожидаемый/видимый открытый ключ сервера с каждой стороны и будем использовать его в качестве токена.
Моя проблема в том, что одна сторона находится в Java, другая в С#, и они не могут создать общий байт [], который был бы сопоставим. Я имею в виду, что 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
Замена привязки канала сеанса tls: поиск общего материала между Java и csharp ⇐ C#
Место общения программистов C#
1730034670
Anonymous
Поскольку Java JSSE пока не поддерживает токены привязки каналов (CBT), я не могу написать MitM-доказательные аутентификационные рукопожатия через делегированное TLS-соединение, используя простой «tls-unique» токен, описанный в RFC 5056. p>
Если вы хотите узнать, почему CBT имеет решающее значение для аутентификации на уровне приложения, см. https://csb.stevekerrison.com/post/2022-01-channel-binding/Токен «tls-server-end-point» также недоступен, но это заставило меня подумать, что я мог бы создать какую-то замену из сертификата открытого ключа сервера, с которой оба узла должны согласиться (если нет MitM).
Итак, я подумал: хорошо, давайте sha256 ожидаемый/видимый открытый ключ сервера с каждой стороны и будем использовать его в качестве токена.
Моя проблема в том, что одна сторона находится в Java, другая в С#, и они не могут создать общий байт [], который был бы сопоставим. Я имею в виду, что 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[i] & 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
Подробнее здесь: [url]https://stackoverflow.com/questions/79129102/tls-session-channel-binding-substitute-the-search-for-common-material-between-j[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия