Пользовательский поставщик безопасности работает в толстой банке, но не в собственном образе GraalVM при извлечении сертJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Пользовательский поставщик безопасности работает в толстой банке, но не в собственном образе GraalVM при извлечении серт

Сообщение Anonymous »

Я пытаюсь извлечь общедоступный сертификат любой базы данных postgresql. Я заставил его работать с простой Java в качестве библиотеки и как отдельный толстый jar, но не в сборке собственного образа с GraalVM. Я разместил отчет об ошибке на странице GraalVM на github, но у меня такое ощущение, что это не ошибка. У меня такое чувство, что я неправильно настроил graalvm при использовании специального поставщика безопасности, однако я не уверен. Кроме того, иногда проходят годы, прежде чем отчеты об ошибках можно будет устранить на их странице... Использование специального поставщика безопасности не является чем-то исключительным, поскольку некоторые используют Bouncy Castle, и он доказал свою работу с собственным образом graalvm, поэтому у меня такое чувство, что я мог пропустить конфигурацию, однако мои знания в этой области довольно низки и я надеюсь получить помощь от сообщества здесь.
Я запускаю базу данных Postgresql с включенным ssl с помощью этой команды:

Код: Выделить всё

docker run --rm -e POSTGRES_PASSWORD=password -p 5432:5432 postgres:12 -c ssl=on -c ssl_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem -c ssl_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
Я использую драйвер jdbc postgresql отсюда

Код: Выделить всё

org.postgresql
postgresql
42.7.8

Я использую свою собственную библиотеку, которая предоставляет утилиту для захвата сертификатов во время установления связи SSL. Его можно найти здесь: GitHub - Ayza. И декларация maven:

Код: Выделить всё

io.github.hakky54
ayza
10.0.2

Для создания собственного образа с помощью maven я использую следующие плагины:

Код: Выделить всё

org.apache.maven.plugins
maven-shade-plugin
3.6.1

crip


${application-main-class}





package

shade





org.graalvm.nativeimage
native-image-maven-plugin
21.2.0



native-image

package



false

--no-fallback
-H:EnableURLProtocols=https
-H:EnableURLProtocols=http
-H:Name=crip
-march=compatibility
--future-defaults=all
-H:AdditionalSecurityProviders=nl.altindag.ssl.provider.FenixProvider
-H:AdditionalSecurityServiceTypes=nl.altindag.ssl.provider.FenixProvider



Небольшой воспроизводимый фрагмент кода может выглядеть примерно так:

Код: Выделить всё

import nl.altindag.ssl.SSLFactory;
import nl.altindag.ssl.util.ProviderUtils;
import nl.altindag.ssl.util.TrustManagerUtils;

import javax.net.ssl.X509ExtendedTrustManager;
import java.security.cert.X509Certificate;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class App {

public static void main(String[] args) {
List capturedCertificates = new CopyOnWriteArrayList();
X509ExtendedTrustManager trustManager = TrustManagerUtils.createCertificateCapturingTrustManager(capturedCertificates);
SSLFactory sslFactory = SSLFactory.builder()
.withTrustMaterial(trustManager)
.build();

ProviderUtils.configure(sslFactory);

try (Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/")) {
// calling getConnection to trigger the SSL handshake
} catch (SQLException ignored) {

} finally {
ProviderUtils.remove();
}

System.out.println("Amount of captured certificates: "  + capturedCertificates.size());
System.out.println("Captured certificates: ");
capturedCertificates.forEach(System.out::println);
}

}
Вывод этого основного метода:

Код: Выделить всё

Amount of captured certificates: 1
Captured certificates:
[
[
Version: V3
Subject: CN=localhost
Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11

Key:  Sun RSA public key, 2048 bits
params: null
modulus: 31211996126076596147999338027719495623709022913370591887632988720610004032097760016008345790156702342195009365368156959125712771875783177237122222689823196867653884881232812806555219009894942490288929180418493391254446706821512257672335346037892662566871554703869495753177918085413564534189604133485556381243824728959475350934112799133217319962706911642363362829383506782715080237659432175302233892295525841514632241532146162042423493679178952709219542178492548540252419613055282285791992580920922147065723236149506037158805915815773798115281679259390591323530600590552570955839294244330974808478242461235603855182171
public exponent: 65537
Validity: [From: Tue Jan 14 03:32:28 CET 2025,
To: Fri Jan 12 03:32:28 CET 2035]
Issuer: CN=localhost
SerialNumber: 26:97:cd:84:a8:93:e2:5d:d3:2c:a0:ea:40:8d:7c:93:bf:06:e4:1d

Certificate Extensions: 3
[1]: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
CA:false
PathLen: undefined
]

[2]: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
DNSName: localhost
]

[3]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: ED 8A 72 6D B7 87 AB 26   5E 6C 75 33 5B C9 BE E8  ..rm...&^lu3[...
0010: 04 6E 1A 06                                        .n..
]
]

]
Algorithm: [SHA256withRSA]
Signature:
0000: 00 EE 2E CB 87 F7 20 FD   B6 36 AE E1 7B 3F AA 8F  ...... ..6...?..
0010: 44 38 42 94 BB 50 77 BE   69 21 CA 2B 4A 2F 90 1B  D8B..Pw.i!.+J/..
0020: 93 B0 3D B7 FA FB DB 56   40 BA F6 20 52 78 FC 0F  ..=....V@.. Rx..
0030: EA DE F1 66 13 6F 91 30   B9 48 6A B8 2A 32 32 FE  ...f.o.0.Hj.*22.
0040: 79 DF C8 DD B2 6D 83 C7   D7 56 04 5D 0F 4B 6B 98  y....m...V.].Kk.
0050: 73 AE C3 5C A5 3F 52 3C   A3 F1 6E CF 6D AF 28 E4  s..\.?R..2.EO..D..
00D0: 47 02 D6 D4 86 34 A4 19   04 3E B2 7B 8F 72 3F 62  G....4...>...r?b
00E0: 19 02 AF F8 C6 9B 96 14   D1 36 AA D7 74 39 7F C3  .........6..t9..
00F0: AB 49 02 94 CE 96 7C B1   F2 D5 1F 5B A2 73 DE B9  .I.........[.s..

]
Я постараюсь дать некоторый контекст. Я использую диспетчер драйверов Postgres для взаимодействия с реальной базой данных. При установке соединения он создаст экземпляр sslcontext под прикрытием самой библиотеки postgres, см. здесь. Я перехватываю это, добавляя сюда специального поставщика безопасности. Этот фрагмент кода создает собственный поставщик безопасности и вставляет его в первую позицию. Под прикрытием следующие операторы кода будут выполнены первыми и вторыми.
С помощью этой логики я могу легко заменить sslcontext другой библиотеки на собственный. В этом случае я предоставляю свой собственный, который может захватывать сертификаты сервера. Это работает при работе в моей IDE и с толстой банкой. Однако он не работает при запуске с собственным исполняемым файлом, созданным с собственным образом. Хотя выше я опубликовал небольшое рабочее приложение, эта проблема связана с моими изменениями в проекте Certificate Ripper. Фактические изменения кода можно найти здесь.
Если вы хотите попробовать его с изменениями из репозитория, вы можете выполнить следующие шаги: Таким образом, на самом деле можно получить сертификаты postgresql с помощью этих фрагментов. Он работает в простой Java, но не работает при компиляции в собственный образ. Я проверил, присутствует ли пользовательский поставщик безопасности, и он есть. Я получаю следующий результат:

Код: Выделить всё

Fenix version 1.0, CertificateRipper version 1.0, SUN version 25, SunRsaSign version 25, SunEC version 25, SunJSSE version 25, SunJCE version 25, SunSASL version 25, JdkLDAP version 25, JdkSASL version 25, Apple version 25
Как видите, он тоже находится на первой позиции, так что все должно работать. У меня просто такое ощущение, что во время выполнения пользовательский поставщик безопасности не используется, потому что он не находится на первом месте или, возможно, недоступен. Поскольку я не уверен, правильно ли я следовал рекомендациям, описанным здесь: https://www.graalvm.org/latest/referenc ... gistration
Я надеюсь, что кто-нибудь сможет помочь мне в отношении этой темы, как это происходит при отладке.

Подробнее здесь: https://stackoverflow.com/questions/798 ... mage-while
Ответить

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

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

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

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

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