12
12
package org .opensearch .security .dlic .rest .api ;
13
13
14
14
import java .io .IOException ;
15
- import java .security .cert .X509Certificate ;
16
- import java .util .Arrays ;
17
15
import java .util .List ;
18
16
import java .util .Map ;
19
17
import java .util .stream .Collectors ;
18
+ import java .util .stream .Stream ;
20
19
21
20
import com .google .common .collect .ImmutableList ;
22
21
import com .google .common .collect .ImmutableMap ;
31
30
import org .opensearch .rest .RestRequest .Method ;
32
31
import org .opensearch .security .dlic .rest .validation .ValidationResult ;
33
32
import org .opensearch .security .securityconf .impl .CType ;
34
- import org .opensearch .security .ssl .SecurityKeyStore ;
35
- import org .opensearch .security .ssl .util .SSLConfigConstants ;
33
+ import org .opensearch .security .ssl .SslContextHandler ;
34
+ import org .opensearch .security .ssl .SslSettingsManager ;
35
+ import org .opensearch .security .ssl .config .CertType ;
36
+ import org .opensearch .security .ssl .config .Certificate ;
36
37
import org .opensearch .security .support .ConfigConstants ;
37
38
import org .opensearch .threadpool .ThreadPool ;
38
39
@@ -62,23 +63,20 @@ public class SecuritySSLCertsApiAction extends AbstractApiAction {
62
63
)
63
64
);
64
65
65
- private final SecurityKeyStore securityKeyStore ;
66
+ private final SslSettingsManager sslSettingsManager ;
66
67
67
68
private final boolean certificatesReloadEnabled ;
68
69
69
- private final boolean httpsEnabled ;
70
-
71
70
public SecuritySSLCertsApiAction (
72
71
final ClusterService clusterService ,
73
72
final ThreadPool threadPool ,
74
- final SecurityKeyStore securityKeyStore ,
73
+ final SslSettingsManager sslSettingsManager ,
75
74
final boolean certificatesReloadEnabled ,
76
75
final SecurityApiDependencies securityApiDependencies
77
76
) {
78
77
super (Endpoint .SSL , clusterService , threadPool , securityApiDependencies );
79
- this .securityKeyStore = securityKeyStore ;
78
+ this .sslSettingsManager = sslSettingsManager ;
80
79
this .certificatesReloadEnabled = certificatesReloadEnabled ;
81
- this .httpsEnabled = securityApiDependencies .settings ().getAsBoolean (SSLConfigConstants .SECURITY_SSL_HTTP_ENABLED , true );
82
80
this .requestHandlersBuilder .configureRequestHandlers (this ::securitySSLCertsRequestHandlers );
83
81
}
84
82
@@ -108,10 +106,10 @@ private void securitySSLCertsRequestHandlers(RequestHandler.RequestHandlersBuild
108
106
.verifyAccessForAllMethods ()
109
107
.override (
110
108
Method .GET ,
111
- (channel , request , client ) -> withSecurityKeyStore ().valid (keyStore -> loadCertificates (channel , keyStore ))
109
+ (channel , request , client ) -> withSecurityKeyStore ().valid (ignore -> loadCertificates (channel ))
112
110
.error ((status , toXContent ) -> response (channel , status , toXContent ))
113
111
)
114
- .override (Method .PUT , (channel , request , client ) -> withSecurityKeyStore ().valid (keyStore -> {
112
+ .override (Method .PUT , (channel , request , client ) -> withSecurityKeyStore ().valid (ignore -> {
115
113
if (!certificatesReloadEnabled ) {
116
114
badRequest (
117
115
channel ,
@@ -123,7 +121,7 @@ private void securitySSLCertsRequestHandlers(RequestHandler.RequestHandlersBuild
123
121
)
124
122
);
125
123
} else {
126
- reloadCertificates (channel , request , keyStore );
124
+ reloadCertificates (channel , request );
127
125
}
128
126
}).error ((status , toXContent ) -> response (channel , status , toXContent )));
129
127
}
@@ -138,65 +136,70 @@ boolean accessHandler(final RestRequest request) {
138
136
}
139
137
}
140
138
141
- ValidationResult <SecurityKeyStore > withSecurityKeyStore () {
142
- if (securityKeyStore == null ) {
139
+ ValidationResult <SslSettingsManager > withSecurityKeyStore () {
140
+ if (sslSettingsManager == null ) {
143
141
return ValidationResult .error (RestStatus .OK , badRequestMessage ("keystore is not initialized" ));
144
142
}
145
- return ValidationResult .success (securityKeyStore );
143
+ return ValidationResult .success (sslSettingsManager );
146
144
}
147
145
148
- protected void loadCertificates (final RestChannel channel , final SecurityKeyStore keyStore ) throws IOException {
146
+ protected void loadCertificates (final RestChannel channel ) throws IOException {
149
147
ok (
150
148
channel ,
151
149
(builder , params ) -> builder .startObject ()
152
- .field ("http_certificates_list" , httpsEnabled ? generateCertDetailList (keyStore .getHttpCerts ()) : null )
153
- .field ("transport_certificates_list" , generateCertDetailList (keyStore .getTransportCerts ()))
150
+ .field (
151
+ "http_certificates_list" ,
152
+ generateCertDetailList (
153
+ sslSettingsManager .sslContextHandler (CertType .HTTP ).map (SslContextHandler ::keyMaterialCertificates ).orElse (null )
154
+ )
155
+ )
156
+ .field (
157
+ "transport_certificates_list" ,
158
+ generateCertDetailList (
159
+ sslSettingsManager .sslContextHandler (CertType .TRANSPORT )
160
+ .map (SslContextHandler ::keyMaterialCertificates )
161
+ .orElse (null )
162
+ )
163
+ )
154
164
.endObject ()
155
165
);
156
166
}
157
167
158
- private List <Map <String , String >> generateCertDetailList (final X509Certificate [] certs ) {
168
+ private List <Map <String , String >> generateCertDetailList (final Stream < Certificate > certs ) {
159
169
if (certs == null ) {
160
170
return null ;
161
171
}
162
- return Arrays .stream (certs ).map (cert -> {
163
- final String issuerDn = cert != null && cert .getIssuerX500Principal () != null ? cert .getIssuerX500Principal ().getName () : "" ;
164
- final String subjectDn = cert != null && cert .getSubjectX500Principal () != null ? cert .getSubjectX500Principal ().getName () : "" ;
165
-
166
- final String san = securityKeyStore .getSubjectAlternativeNames (cert );
167
-
168
- final String notBefore = cert != null && cert .getNotBefore () != null ? cert .getNotBefore ().toInstant ().toString () : "" ;
169
- final String notAfter = cert != null && cert .getNotAfter () != null ? cert .getNotAfter ().toInstant ().toString () : "" ;
170
- return ImmutableMap .of (
172
+ return certs .map (
173
+ c -> ImmutableMap .of (
171
174
"issuer_dn" ,
172
- issuerDn ,
175
+ c . issuer () ,
173
176
"subject_dn" ,
174
- subjectDn ,
177
+ c . subject () ,
175
178
"san" ,
176
- san ,
179
+ c . subjectAlternativeNames () ,
177
180
"not_before" ,
178
- notBefore ,
181
+ c . notBefore () ,
179
182
"not_after" ,
180
- notAfter
181
- );
182
- } ).collect (Collectors .toList ());
183
+ c . notAfter ()
184
+ )
185
+ ).collect (Collectors .toList ());
183
186
}
184
187
185
- protected void reloadCertificates (final RestChannel channel , final RestRequest request , final SecurityKeyStore keyStore )
186
- throws IOException {
188
+ protected void reloadCertificates (final RestChannel channel , final RestRequest request ) throws IOException {
187
189
final String certType = request .param ("certType" ).toLowerCase ().trim ();
188
190
try {
189
191
switch (certType ) {
190
192
case "http" :
191
- if (!httpsEnabled ) {
193
+ if (sslSettingsManager .sslConfiguration (CertType .HTTP ).isPresent ()) {
194
+ sslSettingsManager .reloadSslContext (CertType .HTTP );
195
+ ok (channel , (builder , params ) -> builder .startObject ().field ("message" , "updated http certs" ).endObject ());
196
+ } else {
192
197
badRequest (channel , "SSL for HTTP is disabled" );
193
- return ;
194
198
}
195
- keyStore .initHttpSSLConfig ();
196
- ok (channel , (builder , params ) -> builder .startObject ().field ("message" , "updated http certs" ).endObject ());
197
199
break ;
198
200
case "transport" :
199
- keyStore .initTransportSSLConfig ();
201
+ sslSettingsManager .reloadSslContext (CertType .TRANSPORT );
202
+ sslSettingsManager .reloadSslContext (CertType .TRANSPORT_CLIENT );
200
203
ok (channel , (builder , params ) -> builder .startObject ().field ("message" , "updated transport certs" ).endObject ());
201
204
break ;
202
205
default :
0 commit comments