From 8fd105ab97f683cbfc2087a8479d6b5a4e0002a7 Mon Sep 17 00:00:00 2001 From: Lee Fine Date: Thu, 10 Oct 2024 14:41:36 +0000 Subject: [PATCH] ab#63856 --- .../CitrixAdcStore.cs | 32 +++++++++++------- .../bin/Debug/net6.0/CitrixAdcTestConsole.dll | Bin 24064 -> 24064 bytes .../bin/Debug/net6.0/CitrixAdcTestConsole.exe | Bin 151552 -> 151552 bytes .../bin/Debug/net6.0/CitrixAdcTestConsole.pdb | Bin 17396 -> 17396 bytes ...ctor.Extensions.Orchestrator.CitricAdc.dll | Bin 39424 -> 39936 bytes ...ctor.Extensions.Orchestrator.CitricAdc.pdb | Bin 22388 -> 22532 bytes 6 files changed, 19 insertions(+), 13 deletions(-) diff --git a/CitrixAdcOrchestratorJobExtension/CitrixAdcStore.cs b/CitrixAdcOrchestratorJobExtension/CitrixAdcStore.cs index 1d0b905..4fc6c2a 100644 --- a/CitrixAdcOrchestratorJobExtension/CitrixAdcStore.cs +++ b/CitrixAdcOrchestratorJobExtension/CitrixAdcStore.cs @@ -428,11 +428,24 @@ public void LinkToIssuer(string cert, string privateKeyPassword, string keyPairN Logger.MethodEntry(LogLevel.Debug); sslcertificatechain chain = sslcertificatechain.get(_nss, keyPairName); - //if (chain.chaincomplete == 1) - //{ - // Logger.LogDebug($"Certificate {keyPairName} already linked to {chain.chainlinked}"); - // return; - //} + sslcertkey certKey = sslcertkey.get(_nss, keyPairName); + + X509Certificate2Collection x509CertCollection = new X509Certificate2Collection(); + x509CertCollection.Import(Convert.FromBase64String(cert), privateKeyPassword, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.EphemeralKeySet); + + X509Certificate2 issuingCert = x509CertCollection.First(r => r.Subject == (x509CertCollection.First(p => p.HasPrivateKey).Issuer)); + + if (chain.chaincomplete == 1) + { + foreach (string chainCertAlias in chain.chainlinked) + { + X509Certificate2 x509ChainCert = GetX509Certificate(GetKeyPairByName(chainCertAlias)); + if (x509ChainCert.Thumbprint == issuingCert.Thumbprint) + { + return; + } + } + } if (chain.chainpossiblelinks == null || chain.chainpossiblelinks.Length == 0) { @@ -441,15 +454,8 @@ public void LinkToIssuer(string cert, string privateKeyPassword, string keyPairN throw new LinkException(msg); } - sslcertkey certKey = sslcertkey.get(_nss, keyPairName); string chainCertName = string.Empty; - - X509Certificate2Collection x509CertCollection = new X509Certificate2Collection(); - x509CertCollection.Import(Convert.FromBase64String(cert), privateKeyPassword, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.EphemeralKeySet); - - X509Certificate2 issuingCert = x509CertCollection.First(r => r.Subject == (x509CertCollection.First(p => p.HasPrivateKey).Issuer)); - - foreach(string chainCertAlias in chain.chainpossiblelinks) + foreach (string chainCertAlias in chain.chainpossiblelinks) { X509Certificate2 x509ChainCert = GetX509Certificate(GetKeyPairByName(chainCertAlias)); if (x509ChainCert.Thumbprint == issuingCert.Thumbprint) diff --git a/CitrixAdcTestConsole/bin/Debug/net6.0/CitrixAdcTestConsole.dll b/CitrixAdcTestConsole/bin/Debug/net6.0/CitrixAdcTestConsole.dll index c36ba31ee794f81b4f21504fd4f2516796d83d11..2333fba255531284dc50cee2a4454d294c943000 100644 GIT binary patch delta 237 zcmZqJ!`QHgaY6^njSGQ)Hul7L2`DV8v9OD0@?UkAu`f0+g?aN2FHKerL(3Fn%d|9O z3yU=4G_xejM8hPbR7;bzRAYmrB*WAclN3{PvlJuq$({l2EYmN2`aJncK!Cun$qgUR z{?T%pcwl?>!3067-|f!d8Bh_KeEQwHKbv0!u3+^yWUypNVK4@g zX+UVqU;%_6I*q}MAqgm&$Y2PhjTlmaY!jepDp1YfPFaQ7m delta 237 zcmZqJ!`QHgaY6@6mm<^IjXg150vajFhBrgs_$; zj!U>VmTgS^XIOu1vPs|+1*o7pBUBKi`uwx+R|OYY%-x=HZ_nlzfh$=3O&LrXEPyzT z!H6N1!GIx|!4SwwWJm(iX+VA&kd?|{&R_zhK|BMnIujt@7${;2mPui-1hNxBIyc`B HS7ZYK2VG63 diff --git a/CitrixAdcTestConsole/bin/Debug/net6.0/CitrixAdcTestConsole.exe b/CitrixAdcTestConsole/bin/Debug/net6.0/CitrixAdcTestConsole.exe index 5a79317212737596f1cc65d9206b957123222fa4..5125b2cbdd0f41cf0b73f8917acf7e5cb44e835c 100644 GIT binary patch delta 99 zcmZozz}WyqEsR^38od1t87vu67>t2r8W0*YSO6i2PGc}*NCJu`G8h7BBZgEU+XN_@ h3Y0SdiX;KWQ-L~7fY_A59H=@4sLFi%d2c2|76A2n5|jV{ delta 99 zcmZozz}WyqEsR^38od2Y8B7^0fH;l8h#{51fFYT|5XeeoNCMJnKzm(ud{v5?CQe|yc)Qccd@8np#S z5)4=wJ7hIa!a(?gxK79!>mb1CWPx@v1ONc7lTAy+Fc60Cg8yOgq{#MTyXsa&SSyML zL3GiBcu1N_H;^WhOw|5+(^blfAM9b%OFDV;%;cRUO-CCY+goW0r!0^iHE7T=LUFbX z_G7+K9%?HP-k66$e*nA#24t;H2I*Zeq*{arbY59=JV~;o$cns7CgUv2dflL{7R)s0 zBLS$-AeBaFSqC)>9zmJfI)^m@#|3*;)&VmD-jvoc0@`{4B?lTU@UzB9ayS(ES=wp( z%h@(<;r3SW$~17_dBXPO`)_iGQpdwYQ%-v66Z0NhuDj!(e}ZK8wN}~og_&+f6ccf9bSTD0>!-bSR)m^1X6js##*NYb z_jP%huT~#m8-ML@?$3kL0v??rtl}HEbgXI75Y#&6O!|Evlk*O&C^0!?GdX5vGdMVA zGiEkoIbktkGG#e5W@R%lVq!66WHe+oH#TH4H?zkNuL2l26NktEpa1}>BZEuW1l2&2 P%`4C}i62L^juK`u3k>>I delta 525 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 CEgh2p delta 8983 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 D-imkT delta 3110 zcmZ9O30PCv701uLNg%8uyG0Fx8U$wykN`oJKnYY45YZV2w-^BxsR}A8I3@_Fb*oOS zpBAe)TE}r?i8xy8h}0>r#p0&%5`$*&^ za9Re5NaVB-(g1l4*_p(t3Gyn5TS%77sb8{;A|T5k)sQuiO^~gS!;n4(84WSW;g`cN zr@&M>sUSlkCn0AbHz5k6oJ?4Qo{Q6lZky8PsjP^17Ah*n6M84!k zYGRav9^Qor4g;Tq9VhWH@MYLy!9+Y99E{pfupc-AEUr^%df5m3bBSXSx58G#=a2lj zo_q^!gHt%-;Rrx5T4Dp(7q(6+NCA%lM}q^9pW4#_-F09w;4dXMBK|RKF<>C_)1`cy z1N)GLy6;*fj7GwEsh}S?Q!3bpK?P@n2O&NTA~*-U7xoN^$AUeP`w{pji04Z6yBru{ zS}O54#49j94S@uqAWtd~f74#hlj8jmA1}rK2;TtkdlGj#uvmdr5>G@t8+L}oAAo-i zTdc@H)aQf6_}xpYk{p6fkX{!1D<&9>_#_mF%MCKffuq484(tjJC9k*nPT;|i-g;-) zqEB%5_@o33{l5e;%iaPJ4|C|y3p~t$voNo4@Dyo+;!hmmz!MccJQZ;qGE^e#;b~-H zBtvlpjvP^7LV_Q7mc(Z8I&dvS#0$Wku-zpt0_P%ko;2W0@I>$|iD!fV3J#OF82lXu zFPC_Z1&&S}ZZqK+4k-bPODxelkX{xmAnvM{MSO$2b`(1YRQe7$b;;MPMIPizOFa4xR`WPm18h;A!A2iI;#EgTp0W3cd;+BXI@z zA!ZxZ!xpN9BLIVoyV0VQF7Y&Q9R6ft#l$66Al`vTf)gAVFBD3~v>o$P z99Wz+L^e;?n**w0$f*STDueCy=BCl>8Lgs`hQvj^eCMPdV|gieN|Tv9T?LJZH~DM{bdYsXIdB=4BZiH zfOd;BL4R$Dv!Xenw{j&t(AUHMReU|{)A6maH;lXs?Ug_>XDUeuhW1J{K+j1uL4TTP zg?^e?54}FA6?&ZJF7%6}V7W8-B?l{T8wLaPIE@LqHN~V*l6$JbsoMknNm`&4&3I!y z^jhN*PZ#=a+SYDuukcKf2aj6+ddF|nrc(v3b;oy}vBmAlk8Rl7cH(!p+uNcGXIWm_ zZ+XkO#rsP3UUyw&?8`?D0gD1GdlJ+4E$Mo6w5;L%_Fw$|a?^jSRxQS})RLE#)1~n` z8TwR}zI|VKe|4ST&eZ%ZE5d8?S#cjf=Ue^MTl$}9Zm)e+xm{tLl)FE%^~HmybQmn7a>IPl-LQK_jQ_3xS=gqK6{Y7_S=SiM>NkNZ!!f6U z>smTx*E9HTb)^ewh~s+NdKPM=LXc49$owf~xBrfCCRZhv+E?B|MW)AvmN z;Ms^Qrvt{_{a4ZnY6cHV}LuXRleHh+41`=gMKCxt)E8C>{={ih`RpVwxqUQT$o z?eo*mmnJ1|{nqt(c*LO0OD$(!=a*fIIQZ?h?N4r8+T~l=a{RmJckA{%9=^Ns!_>Mg}HBy!c4rNV8g}14VH9bOrHT$yW!K`@{Yc6BWyIAv8*8Ge$>|}O-sTaGR z*>jn_*nY^Eq_9{|h(pYYSk(a+Mxk8kO&M}Lt684n!$VGt;{l#8+yR_?XaL8v9qY8z zg9dX{<;romST}PVN!DsPz5tw2fiH_xybXmj#~B@zGJ20Iy$GL%es8-}aixr$xG&O} z92w}0mnJAF#MkIyyO0@_sU#K0JVNB;jXsu!sTg~ot+>dlJy=aPuPR|xe{rt4>{4@? z;a8i$Yi)d`iLKo48pIf@so*txnRO37gjrRW%{ZoudD}v=9P z>_hAmn>FWW?4<2nPCUD4laI}2w{3Z2>wVm?9OYc85re1W&B3a@Y)-jj1FK&3#V3&z zkongh!5HLGJ;XLQ_ow~*r9HxaVOy{vSol*>*b4jk+#uOdCb*SSQ^an-FKuh6%=%Ec ni^N7E*KNWL9^6(g4$`!$w$Y;PQ}s9#FAQ=oEfUS(CD}g$h45iX