@@ -140,57 +140,37 @@ internal static (X509Certificate2 certificate, X509Certificate2Collection) Gener
140
140
PkiOptions . IssuerRevocationViaCrl ,
141
141
out RevocationResponder responder ,
142
142
out CertificateAuthority root ,
143
- out CertificateAuthority intermediate ,
143
+ out CertificateAuthority [ ] intermediates ,
144
144
out X509Certificate2 endEntity ,
145
+ intermediateAuthorityCount : longChain ? 3 : 1 ,
145
146
subjectName : targetName ,
146
147
testName : testName ,
147
148
keySize : keySize ,
148
149
extensions : extensions ) ;
149
150
150
- if ( longChain )
151
+ // Walk the intermediates backwards so we build the chain collection as
152
+ // Issuer3
153
+ // Issuer2
154
+ // Issuer1
155
+ // Root
156
+ for ( int i = intermediates . Length - 1 ; i >= 0 ; i -- )
151
157
{
152
- using ( RSA intermedKey2 = RSA . Create ( keySize ) )
153
- using ( RSA intermedKey3 = RSA . Create ( keySize ) )
154
- {
155
- X509Certificate2 intermedPub2 = intermediate . CreateSubordinateCA (
156
- $ "CN=\" A SSL Test CA 2\" , O=\" testName\" ",
157
- intermedKey2 ) ;
158
-
159
- X509Certificate2 intermedCert2 = intermedPub2 . CopyWithPrivateKey ( intermedKey2 ) ;
160
- intermedPub2 . Dispose ( ) ;
161
- CertificateAuthority intermediateAuthority2 = new CertificateAuthority ( intermedCert2 , null , null , null ) ;
162
-
163
- X509Certificate2 intermedPub3 = intermediateAuthority2 . CreateSubordinateCA (
164
- $ "CN=\" A SSL Test CA 3\" , O=\" testName\" ",
165
- intermedKey3 ) ;
166
-
167
- X509Certificate2 intermedCert3 = intermedPub3 . CopyWithPrivateKey ( intermedKey3 ) ;
168
- intermedPub3 . Dispose ( ) ;
169
- CertificateAuthority intermediateAuthority3 = new CertificateAuthority ( intermedCert3 , null , null , null ) ;
158
+ CertificateAuthority authority = intermediates [ i ] ;
170
159
171
- RSA eeKey = endEntity . GetRSAPrivateKey ( ) ;
172
- endEntity = intermediateAuthority3 . CreateEndEntity (
173
- $ "CN=\" A SSL Test\" , O=\" testName\" ",
174
- eeKey ,
175
- extensions ) ;
176
-
177
- endEntity = endEntity . CopyWithPrivateKey ( eeKey ) ;
178
-
179
- chain . Add ( intermedCert3 ) ;
180
- chain . Add ( intermedCert2 ) ;
181
- }
160
+ chain . Add ( authority . CloneIssuerCert ( ) ) ;
161
+ authority . Dispose ( ) ;
182
162
}
183
163
184
- chain . Add ( intermediate . CloneIssuerCert ( ) ) ;
185
164
chain . Add ( root . CloneIssuerCert ( ) ) ;
186
165
187
166
responder . Dispose ( ) ;
188
167
root . Dispose ( ) ;
189
- intermediate . Dispose ( ) ;
190
168
191
169
if ( PlatformDetection . IsWindows )
192
170
{
171
+ X509Certificate2 ephemeral = endEntity ;
193
172
endEntity = new X509Certificate2 ( endEntity . Export ( X509ContentType . Pfx ) ) ;
173
+ ephemeral . Dispose ( ) ;
194
174
}
195
175
196
176
return ( endEntity , chain ) ;
0 commit comments