From e21616531f5cf6aa702d6b01314b46d5940e1fff Mon Sep 17 00:00:00 2001 From: NguyenHoangSon96 Date: Mon, 27 Oct 2025 09:43:33 +0700 Subject: [PATCH] wip --- examples/pom.xml | 20 ++++ .../java/com/influxdb/v3/netty/Netty.java | 111 ++++++++++++++++++ .../v3/netty/client/pkcs12/keystore.p12 | Bin 0 -> 2712 bytes .../v3/netty/client/pkcs12/truststore.p12 | Bin 0 -> 1254 bytes .../v3/netty/scripts/generate-certfile.txt | 8 ++ .../v3/netty/server/pkcs12/keystore.p12 | Bin 0 -> 2712 bytes .../v3/netty/server/pkcs12/truststore.p12 | Bin 0 -> 1238 bytes .../v3/client/internal/FlightSqlClient.java | 1 + 8 files changed, 140 insertions(+) create mode 100644 examples/src/main/java/com/influxdb/v3/netty/Netty.java create mode 100644 examples/src/main/java/com/influxdb/v3/netty/client/pkcs12/keystore.p12 create mode 100644 examples/src/main/java/com/influxdb/v3/netty/client/pkcs12/truststore.p12 create mode 100644 examples/src/main/java/com/influxdb/v3/netty/scripts/generate-certfile.txt create mode 100644 examples/src/main/java/com/influxdb/v3/netty/server/pkcs12/keystore.p12 create mode 100644 examples/src/main/java/com/influxdb/v3/netty/server/pkcs12/truststore.p12 diff --git a/examples/pom.xml b/examples/pom.xml index 8ba23f41..be3e69f6 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -35,12 +35,32 @@ com.influxdb.v3.IOxExample + + + + io.projectreactor + reactor-bom + 2024.0.11 + pom + import + + + + com.influxdb influxdb3-java 1.6.0-SNAPSHOT + + io.projectreactor.netty + reactor-netty-core + + + io.projectreactor.netty + reactor-netty-http + diff --git a/examples/src/main/java/com/influxdb/v3/netty/Netty.java b/examples/src/main/java/com/influxdb/v3/netty/Netty.java new file mode 100644 index 00000000..b2d051f5 --- /dev/null +++ b/examples/src/main/java/com/influxdb/v3/netty/Netty.java @@ -0,0 +1,111 @@ +package com.influxdb.v3.netty; + +import io.netty.handler.ssl.ClientAuth; +import io.netty.handler.ssl.SslContext; +import io.netty.handler.ssl.SslContextBuilder; +import org.reactivestreams.Publisher; +import reactor.core.publisher.Mono; +import reactor.netty.http.client.HttpClient; +import reactor.netty.http.server.HttpServer; +import reactor.netty.http.server.HttpServerRequest; +import reactor.netty.http.server.HttpServerResponse; + +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.TrustManagerFactory; +import java.io.FileInputStream; +import java.io.IOException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertificateException; +import java.util.concurrent.Executors; +import java.util.function.BiFunction; + +public class Netty { + + public static void main(String[] args) throws InterruptedException, UnrecoverableKeyException, CertificateException, IOException, KeyStoreException, NoSuchAlgorithmException { + var absolutePath = "/Users/home/Documents/sources/influxdb3-java/examples/src/main/java/com/influxdb/v3/netty"; + var password = "123456"; + var format = "PKCS12"; + var host = "localhost"; + var port = 8080; + + // Start a server in another thread + final String keyFilePath = absolutePath + "/server/pkcs12/keystore.p12"; + final String trustFilePath = absolutePath + "/server/pkcs12/truststore.p12"; + Executors.newSingleThreadExecutor().execute(() -> { + try { + SslContext sslContext = createSslContext(true, format, password, keyFilePath, trustFilePath, false); + startServer(host, port, sslContext); + } catch (UnrecoverableKeyException | NoSuchAlgorithmException | KeyStoreException | IOException | + CertificateException | InterruptedException e) { + throw new RuntimeException(e); + } + }); + + Thread.sleep(1000); + + // Create a client and call /ping + final String clientKeyFilePath = absolutePath + "/client/pkcs12/keystore.p12"; + final String clientTrustFilePath = absolutePath + "/client/pkcs12/truststore.p12"; + final boolean isDisableKeystore = false; // Set this to "true" will throw an error because this is mTLS, so the client must also send a certificate to the server. + SslContext sslContext = createSslContext(false, format, password, clientKeyFilePath, clientTrustFilePath, isDisableKeystore); + HttpClient client = createClient(host, port, sslContext); + var content = client.get().uri("/ping") + .responseContent() + .aggregate() + .asString() + .block(); + System.out.println(content); + } + + private static HttpClient createClient(String host, int port, SslContext sslContext) { + return HttpClient.create() + .host(host) + .port(port) + .secure(sslProviderBuilder -> sslProviderBuilder.sslContext(sslContext)); + } + + private static void startServer(String host, int port, SslContext sslContext) throws UnrecoverableKeyException, CertificateException, IOException, KeyStoreException, NoSuchAlgorithmException, InterruptedException { + BiFunction> handler = (req, resp) -> resp.sendString(Mono.just("pong")); + HttpServer.create() + .host(host) + .port(port) + .secure(sslProviderBuilder -> sslProviderBuilder.sslContext(sslContext)) + .route(routes -> routes.get("/ping", handler)) + .bindNow() + .onDispose() + .block(); + } + + private static SslContext createSslContext(boolean isServer, String format, String password, String keyFilePath, String trustFilePath, boolean isDisableKeystore) + throws IOException, KeyStoreException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException { + KeyStore keyStore = KeyStore.getInstance(format); + keyStore.load(new FileInputStream(keyFilePath), password.toCharArray()); + + KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + keyManagerFactory.init(keyStore, password.toCharArray()); + + TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + KeyStore trustStore = KeyStore.getInstance(format); + trustStore.load(new FileInputStream(trustFilePath), password.toCharArray()); + trustManagerFactory.init(trustStore); + + SslContextBuilder sslContextBuilder; + if (isServer) { + sslContextBuilder = SslContextBuilder.forServer(keyManagerFactory).clientAuth(ClientAuth.REQUIRE); + } else { + sslContextBuilder = SslContextBuilder.forClient(); + } + + sslContextBuilder.trustManager(trustManagerFactory); + + if (!isDisableKeystore) { + sslContextBuilder.keyManager(keyManagerFactory); + } + + return sslContextBuilder.build(); + } + +} diff --git a/examples/src/main/java/com/influxdb/v3/netty/client/pkcs12/keystore.p12 b/examples/src/main/java/com/influxdb/v3/netty/client/pkcs12/keystore.p12 new file mode 100644 index 0000000000000000000000000000000000000000..2d9140b2ac90b59d76bcc8e1e250a3bc983342f6 GIT binary patch literal 2712 zcma);S5y-U5{AA#8sJ@p?K3o{UuPh!yi1vSv_za0#$XnVBE zKO+nJ9E6)Js}f@{dUD$QaA<8Z!eZjDU z)*g=OJmNF1cFZl5N`VL)_EDf1zAE`=M~mE_4y|8{PtN)9;3`chJ(giS?~gUNQeYsl z_JZ@p1Q7=pdp+`@#Cd{hQkua;N*-mr|+9Ohm~y*)x%x)3h(pn4Ox5t9IAVtMbTz^$!oB7 z)8p!^tK=7D>p(0w&&m2m*TXy!a zcd}8}eZDRoBZZ>39G6g{R?lpGR(GYR%bHL|PG%18TpD>p3kq|<=7%GZQh57RmyfO| z*9`o#vNm!VU8q(8qkBVmI?r7XQqsT?3leCRaQ#@?BaQZ;&IcMD z?qPL;gpXt!J=jTRgy0>IWxA{Dg|>VNsVpbsbqiTL!{iE(KWG{E5+NKgU(M6py!HLO z_A>{;7=7Iv>gNrXruk|4{J7wLp)B~Ub|X;YN-klm{2>_nsBrTV2g}0U*{04`j2VXk zmIWy@Eh+m57s5We!k2i@HY}duW>gqQn@e2O=;x?jZb#HQ?owIIkuEY-b?xx2QP@-~ znltA!t*bTqcAYUuf}OQDw%$H5*=t4T9v8(fAfkH0SF}${##FK0M5($4irUZVGoIFf?mFmILUC7Dvq_NG^(d8CjIC_u3-P zRLjidj7~6re|Nz7siTpzD(&D*Ov% z&AjpWH$|*pC2Ax!TBN~lRR0CPc+7xSy;^X*tw4p1Zd{D10#VJ!L#h}2QP)sOWYW{| zA_&95p~>{8`16UU=+8+)4|Up-g4ncHdk53Q*Hx>|I=OjDH@p^9m8YCAZ58APkOeAp zUMBPj!x-9|OJ@Y-GfuKz?acKoE~DW(*5ZnlbDi|z#oFV$dqF;cmg{?-V}nXzZ-+>1 z3HAAk9rD^}f!}e-#4XPz%mQ!$_y9ZsZh#vAA{z0J$Rp1U;k5GfbrY3W#>!(wa|>ppAHE#?EP`C8#E%m!f6@&c{@Dk{rH5fai`9*ivpxwU6l5=LxTc&w74V@L?>Gq_}$erDW9Y&{SN!eJtff2ha z&e9GUjtW$hz6k5CW6w2y?AgJw7Y=?lYQPmsu=x8U>vPFHry9)ZOJ;O+E(hHZ@!=U- ziKajP_3S;vjCie-nzzOtbcvXnBzFPLJR3=pX}oSYKlJoe&ZtU+=TaYktVkcQ%=6vr z(a#J+9=O{9uWpPxUmbJ7uSsFP%ktHiVVff{9qlo}?gUDJe=>SQl^vdMtF5^(Njx1z z9OP6SBc}EMD@THkFP~y6(SM>T9`JQs&Ld^h|C5)yjQ&jrIt>~(i^6}6TL&HpT0G!i z6&irKR|a#XaAQ++WHW zZ^eG2;i`}HV(&y&ra8moPgx^xlEvJytKKH`86ZNSP=BjmGH;>DS>~$c%X|~=yKa~V?5@rU!U+9`u9e4X zCaF2?#yy?So0^ouyF$vRbq`(-y{gVGGD8Y^$lR}Og(rril4jM3qJQz!sRzOczM04x zNp*W|xi`WVcv!J{Tj{o@N#ks|z85yY6sg!$7?FaLSkE2FRu1Hg!PCy%GcIYB>d#?b zw9Y%`(TMb+yQ`0DT!Pk7oV-t$~0H0Ej45V70mR#kLH^jwzZtnlAL{ sS-p_F>86--(`G(#UdR{1jp#0R|HkpQe`pI8XC!68R8S~D{a3{N4Gkg5`Tzg` literal 0 HcmV?d00001 diff --git a/examples/src/main/java/com/influxdb/v3/netty/client/pkcs12/truststore.p12 b/examples/src/main/java/com/influxdb/v3/netty/client/pkcs12/truststore.p12 new file mode 100644 index 0000000000000000000000000000000000000000..2d9847df2e8a4b5daf051a2351d933aa93290d64 GIT binary patch literal 1254 zcmV&LNQU+thDZTr0|Wso1Q5hz!^>OB-4_>ISL#ty0;Pb01K@_#WZ;G&XNFom8#-AnA81Si zL2nq01_g9~9LAO!c0C4W*kVgRN`J@UE0qb`ji=~A^^=wCMN?2-dY&?`F2tGba-2i> zC!EBCteUcrbxDC4Rz{z>L?txj>`ei#SQBE7EdrHVH zCYv+0id><}GC)Ovg%evc8J5SyB&{%gD4INA)PIFvLN|w1s*0xr*g~Zg+Dz{{=9;vS ztIft!M%a=w*-75dq&C*nF>-JQmH}_uW8dJ=>&m85C|x7=uvmx?)zH;0$-`)HuAFEF z1cl4OFCk{gQ*3k;JHIxy8Qhd9Jq{7&$|A539Mkr|_m1IR$a=H_rI!}B(y*GYC=2-r zOs}bqF32<+UTPhaim71S<^eG@i~5YGtL6!d>&ErQB(lVtc0d&HR&oL6DDX>qQLliU zmCmpCB<|OkHE+B#;doNlRrsQbh*opqY*)5++MyM6e3t>Y4B66=I>_ZOu|=pLJfFk< zR_tCEg#zc;&F{?A47wCd$maL%@57k!N9#`8A>LCWUWyfbgppYuvCS(jceJr0Ai%j- zdMmfE2{5tY>52_B_dbUEoCm<@2y`SY6P#Qf1;)9d?y(wAcw@L^#kyGx_OE1SfSAwx zK`oA1N#$aU6Dm!>KwH)Qzqck&Tw@_9P>G>YK$KxQY89XW0HR5G2!TVVShrpD3Y)A6x)GF}C$Ghm5`eXS!T*6#)Cf`^r4@>AMY zGNj>EKiUyagEeG+qzeM10EP{0**v|S5a7Ejg}L+3fa+}B2tE8*N2&bIIg;dLZB4l^ z=l-zNW-HU!Mr2XrkWBO-=pVR{<;v`fHZ{VYM}g#`cU)IXUC8nhDG)OLbr>kVg7aj~ z+MG|4ZY9u;n|ZGPN({FAXf!$SvI)lFhs z+3kK5c)sO`9nkSV&Jx%&?=KYscroZUMx4;tVEOE#3TZAw@nSGdFflL<1_@w>NC9O7 z1OfpC00ba@#zW+lz);X-KhWN2ISDtj{q^XNnkh81iU=*72zvem6k1>80VEVL!beqX QQoB@S$yxe8k^%xJ5C*0^Jpcdz literal 0 HcmV?d00001 diff --git a/examples/src/main/java/com/influxdb/v3/netty/scripts/generate-certfile.txt b/examples/src/main/java/com/influxdb/v3/netty/scripts/generate-certfile.txt new file mode 100644 index 00000000..0ec023cc --- /dev/null +++ b/examples/src/main/java/com/influxdb/v3/netty/scripts/generate-certfile.txt @@ -0,0 +1,8 @@ +Generated by +keytool -genkeypair -alias server -keyalg RSA -storetype PKCS12 -keysize 2048 -keystore /Users/home/Documents/sources/influxdb3-java/examples/src/main/java/com/influxdb/v3/netty/server/pkcs12/keystore.p12 -dname "CN=localhost, OU=Dev, O=Company, L=City, ST=State, C=US" -storepass "123456" && keytool -genkeypair -alias client -keyalg RSA -storetype PKCS12 -keysize 2048 -keystore /Users/home/Documents/sources/influxdb3-java/examples/src/main/java/com/influxdb/v3/netty/client/pkcs12/keystore.p12 -dname "CN=localhost, OU=Dev, O=Company, L=City, ST=State, C=US" -storepass "123456" + +Export +keytool -exportcert -keystore /Users/home/Documents/sources/influxdb3-java/examples/src/main/java/com/influxdb/v3/netty/server/pkcs12/keystore.p12 -storetype PKCS12 -alias server -file /Users/home/Documents/sources/influxdb3-java/examples/src/main/java/com/influxdb/v3/netty/server/pkcs12/exported_cert.cer -storepass 123456 && keytool -exportcert -keystore /Users/home/Documents/sources/influxdb3-java/examples/src/main/java/com/influxdb/v3/netty/client/pkcs12/keystore.p12 -storetype PKCS12 -alias client -file /Users/home/Documents/sources/influxdb3-java/examples/src/main/java/com/influxdb/v3/netty/client/pkcs12/exported_cert.cer -storepass 123456 + +Import +keytool -importcert -keystore /Users/home/Documents/sources/influxdb3-java/examples/src/main/java/com/influxdb/v3/netty/client/pkcs12/truststore.p12 -storetype PKCS12 -alias server -file /Users/home/Documents/sources/influxdb3-java/examples/src/main/java/com/influxdb/v3/netty/server/pkcs12/exported_cert.cer -storepass 123456 && keytool -importcert -keystore /Users/home/Documents/sources/influxdb3-java/examples/src/main/java/com/influxdb/v3/netty/server/pkcs12/truststore.p12 -storetype PKCS12 -alias client -file /Users/home/Documents/sources/influxdb3-java/examples/src/main/java/com/influxdb/v3/netty/client/pkcs12/exported_cert.cer -storepass 123456 \ No newline at end of file diff --git a/examples/src/main/java/com/influxdb/v3/netty/server/pkcs12/keystore.p12 b/examples/src/main/java/com/influxdb/v3/netty/server/pkcs12/keystore.p12 new file mode 100644 index 0000000000000000000000000000000000000000..9f7f51b325feada028ae50bb7b23512574dafd3c GIT binary patch literal 2712 zcma);X*d*&7RP7IqA|9yWRip|W0Yn_G4@G_mR{Y|Z9oJt z_89!{mLH=67NdNu&1XQ{4=BXc>uRUf3pBzEgLrt9gn5867=Gx!e_!N*K>(OTP#7iA z1n33=1JPjN%<_D=szVd5tUju}O(HZLOal-2?nud1Hv3B-3hG+sEReCY$-f-O6nMeS(55fQ@%2nYHc zKFxJ@+gH?zma8%M#j%(0U3LLIW8-z4#CP1uf~W0(x}_V7OO*%9zXOcikU=(e{`Owc zlAc|mKNzmFfFk1H@`~_Eu`X?g;jZP~ElM`9LCEQ|j6#ri^4khCB5N~G#jS63w`|2} z?l;`-oemyORhmoa%bdL+t1zBZ^Nd$n#M2@sLi|vmyw|E88R-3j&ZG|KvRNd{e=MOgtDfi`w#ltt<766PR`stB zEQo3;HVqn;$ZI5wxu1mHA18%G($l?$)bzw*e*Qnmp82c1xUw54tpvo}8_o&t5xP^i zDuKavK{kAXrI&Zi95V3|N}6s!-+Y_Hh4)q6+FIKcW2dz*yBtxTIMT%EYBd`^Y9ndsRiJ+9VDxEf>1WuIdM)&Zr2TnB42X=fB_$x*R`vI@BckQWg_-ayg2<#?= zFKW+2qi&%^gJO)wWUF)cS2MQ-tbp-^^^J;@Yvf9+B)QMCJt@BI9yg6wFuNvOvEo*t z6c@G6w)djMy}%<_0_NZ^yM&2h1*Q1`!2mZv5FqrQjFJ5i2sS?&zT6oS12Qi(~Ii zKbGW|p1S!4&vMBe?5<2WzZ5{do~+{pdz6A&De| z97Ev;K@SHGr$2HstAnpp5==|QDg+VCU;weh>d$Y%8@({njk5$bJD0$%Gc%|1EZPN; zWVue$9mHf1Ij3qpV(8KlO5TMb@ztdh4u)wv{MxCvCXjDpRlo6Zj#nyvS0N0&L}Qf*!e)6egj&8Xem8!fOj)(wArMLo;jY~#e^%Z`$xD-^@lsPc5cDxw4D%2O;sm4y^R&TLN!l#Bk4MO{@C@qI9Gjb$xr%+Kc;i-si+?CkNxH^zQ{|Y z-5SZJr*<7Reytb;iVMGHIhZo}V1I~nmAyfSx%z1rQ8kmOA`8{IbY7L9?oEkj^G9!F z%DUfL5#QSMLB%vY5t6>%n%qLDL-9{%UPdUm*Q+X`v@AheV@|%X*DZ&f?y9EQEBVgj zab_t`ZGdwY$j`kSKPtBVCMBU<0}NhPS>lqQ?6BznH~`b=*?G%J-x$Ff-v7rLR#Rqf{S7<-N z9wm($w?MctY!Q1mgMu!4{pBzRcQORB v#|)!*=WUXmOQm@#neRk*V!&b=Qw=X~eyOxZ+ua4{4D%riw+ht$v6z1WAMVfZ literal 0 HcmV?d00001 diff --git a/examples/src/main/java/com/influxdb/v3/netty/server/pkcs12/truststore.p12 b/examples/src/main/java/com/influxdb/v3/netty/server/pkcs12/truststore.p12 new file mode 100644 index 0000000000000000000000000000000000000000..434d740454114a67c9c8d6e827290d879db27880 GIT binary patch literal 1238 zcmV;{1S$J4f&|h60Ru3C1bhYwDuzgg_YDCD0ic2eZ3Kb@X)uBWWiWySVFn2*hDe6@ z4FLxRpn?QaFoFb50s#Opf&@nf2`Yw2hW8Bt2LUi<1_>&LNQU+thDZTr0|Wso1Q2wOLB<*Qmtet<5?7;Fm5P9Z1JJnAArZ9WczrenRz6#gFC3{P zi^PK%OuW{Al%_^Pbwg_uwQZBq!g3^x3?8`SfpeTy<05ZxJy!>V1LkXBSRyi<%)Bq7 ziU-WTH@b6*iGi{IYgfh;!b5?qHT2M-DE-hKbIA3@DOiD0n*9M14vLY~TRyPAR=-oG zT243YCaM|zalm$E7@XzXHk2(@i!6m3Uy10W2lG|Iz=l-4*z+neizO4}N}XShBqeZm zWSJq1_pWuKyACxi;xjJMa0X&vWh5CbCSq69*42+vC?}?Qx#h?LT=@ag=+g#;J^GGS183$)c_^n#n*drzCHx=^?3bZ=M_3-S#PDP0H2xt4!I*{(UN!y)RS`D=4^}g* zvwm-sHq(_mPW<#f@dYNkMo}o4K&<8JfEAjneYQ*!=fTk+Dzv4m0=R}a5P{0n$%}(y zy=qnt8?#EWO$mN`4!6l(Y35xJS2!a$C=h`UU}rz|6vc*HBRu(Kfm%7QXG}XSD^eC1 z*pe*xI*Q3P@`JKBLlmZw*YBJ*^)}Fc%0@A7`3g(q&?#dRMc7lRo-f=~{SrVBs`czq ztYE{eE%zYxuAA=qC_tAnh3j7L370}Q90(Jw<}Tyqq+Qbq=SKTu4C$|LWO*I9cNQPx zMmnC(56JbY@GVCfL<>ya-E|(8+?4XunzHU}S)6g^Q zQL0)Ok7FvBw3|TRUg-^PQEq95uPT+1nGoGEIcodopwWd`uqN#!o}@?N8>2cgFD`XQ zI0S>E6NCUH^6y7y`PnKq9%=ROU>i^u%jDv+ghBSi{!$+#JXg#urLcR79dx9k0*TRS zI3ZWv&a80lscO}asMOzg^e9BC{mR@HAn=FrXmLA=H-6G!q)p`o1ZDu45G)-B-1U)t zla9>AHH+7(79R*dr8FXuOjY3)&k7OfXT)-tGYkj<)U;K7QdM^`cs|>ExyY-7#QPOO zWU&{$%c`83>j$Tb{(x$6pfLt;MaM8rFflL<1_@w>NC9O71OfpC00bat;9y|Sy-5%D zA`|o=H;x*RBWqc6Sh7};xtyn%9wx8^6eYNW2EkDA0O)P3P=kN5k+tG2*8&135ahuo A%>V!Z literal 0 HcmV?d00001 diff --git a/src/main/java/com/influxdb/v3/client/internal/FlightSqlClient.java b/src/main/java/com/influxdb/v3/client/internal/FlightSqlClient.java index 4337f6b3..ae9fb479 100644 --- a/src/main/java/com/influxdb/v3/client/internal/FlightSqlClient.java +++ b/src/main/java/com/influxdb/v3/client/internal/FlightSqlClient.java @@ -38,6 +38,7 @@ import java.util.stream.StreamSupport; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import javax.net.ssl.SSLException; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper;