keycloak-service
公開メンバ関数 | 静的公開変数類 | 限定公開変数類 | 非公開メンバ関数 | 非公開変数類 | 全メンバ一覧
org.keycloak.services.resources.admin.ClientAttributeCertificateResource クラス
org.keycloak.services.resources.admin.ClientAttributeCertificateResource 連携図
Collaboration graph

公開メンバ関数

 ClientAttributeCertificateResource (RealmModel realm, AdminPermissionEvaluator auth, ClientModel client, KeycloakSession session, String attributePrefix, AdminEventBuilder adminEvent)
 
CertificateRepresentation getKeyInfo ()
 
CertificateRepresentation generate ()
 
CertificateRepresentation uploadJks (MultipartFormDataInput input) throws IOException
 
CertificateRepresentation uploadJksCertificate (MultipartFormDataInput input) throws IOException
 
byte [] getKeystore (final KeyStoreConfig config)
 
byte [] generateAndGetKeystore (final KeyStoreConfig config)
 

静的公開変数類

static final String CERTIFICATE_PEM = "Certificate PEM"
 
static final String PUBLIC_KEY_PEM = "Public Key PEM"
 
static final String JSON_WEB_KEY_SET = "JSON Web Key Set"
 

限定公開変数類

RealmModel realm
 
ClientModel client
 
KeycloakSession session
 
AdminEventBuilder adminEvent
 
String attributePrefix
 

非公開メンバ関数

CertificateRepresentation getCertFromRequest (MultipartFormDataInput input) throws IOException
 
byte [] getKeystore (KeyStoreConfig config, String privatePem, String certPem)
 

非公開変数類

AdminPermissionEvaluator auth
 

詳解

Client Attribute Certificate

著者
Bill Burke
バージョン
Revision
1

構築子と解体子

◆ ClientAttributeCertificateResource()

org.keycloak.services.resources.admin.ClientAttributeCertificateResource.ClientAttributeCertificateResource ( RealmModel  realm,
AdminPermissionEvaluator  auth,
ClientModel  client,
KeycloakSession  session,
String  attributePrefix,
AdminEventBuilder  adminEvent 
)
inline
84  {
85  this.realm = realm;
86  this.auth = auth;
87  this.client = client;
88  this.session = session;
90  this.adminEvent = adminEvent.resource(ResourceType.CLIENT);
91  }
KeycloakSession session
Definition: ClientAttributeCertificateResource.java:80
String attributePrefix
Definition: ClientAttributeCertificateResource.java:82
AdminPermissionEvaluator auth
Definition: ClientAttributeCertificateResource.java:78
AdminEventBuilder resource(ResourceType resourceType)
Definition: AdminEventBuilder.java:118
AdminEventBuilder adminEvent
Definition: ClientAttributeCertificateResource.java:81
RealmModel realm
Definition: ClientAttributeCertificateResource.java:77
ClientModel client
Definition: ClientAttributeCertificateResource.java:79

関数詳解

◆ generate()

CertificateRepresentation org.keycloak.services.resources.admin.ClientAttributeCertificateResource.generate ( )
inline

Generate a new certificate with new key pair

戻り値
117  {
119 
120  CertificateRepresentation info = KeycloakModelUtils.generateKeyPairCertificate(client.getClientId());
121 
122  CertificateInfoHelper.updateClientModelCertificateInfo(client, info, attributePrefix);
123 
124  adminEvent.operation(OperationType.ACTION).resourcePath(session.getContext().getUri()).representation(info).success();
125 
126  return info;
127  }
KeycloakSession session
Definition: ClientAttributeCertificateResource.java:80
String attributePrefix
Definition: ClientAttributeCertificateResource.java:82
AdminPermissionEvaluator auth
Definition: ClientAttributeCertificateResource.java:78
AdminEventBuilder operation(OperationType operationType)
Definition: AdminEventBuilder.java:113
AdminEventBuilder adminEvent
Definition: ClientAttributeCertificateResource.java:81
void success()
Definition: AdminEventBuilder.java:226
AdminEventBuilder resourcePath(String... pathElements)
Definition: AdminEventBuilder.java:171
ClientModel client
Definition: ClientAttributeCertificateResource.java:79

◆ generateAndGetKeystore()

byte [] org.keycloak.services.resources.admin.ClientAttributeCertificateResource.generateAndGetKeystore ( final KeyStoreConfig  config)
inline

Generate a new keypair and certificate, and get the private key file

Generates a keypair and certificate and serves the private key in a specified keystore format. Only generated public certificate is saved in Keycloak DB - the private key is not.

引数
configKeystore configuration as JSON
戻り値
308  {
310 
311  if (config.getFormat() != null && !config.getFormat().equals("JKS") && !config.getFormat().equals("PKCS12")) {
312  throw new NotAcceptableException("Only support jks or pkcs12 format.");
313  }
314  if (config.getKeyPassword() == null) {
315  throw new ErrorResponseException("password-missing", "Need to specify a key password for jks generation and download", Response.Status.BAD_REQUEST);
316  }
317  if (config.getStorePassword() == null) {
318  throw new ErrorResponseException("password-missing", "Need to specify a store password for jks generation and download", Response.Status.BAD_REQUEST);
319  }
320 
321  CertificateRepresentation info = KeycloakModelUtils.generateKeyPairCertificate(client.getClientId());
322  byte[] rtn = getKeystore(config, info.getPrivateKey(), info.getCertificate());
323 
324  info.setPrivateKey(null);
325 
326  CertificateInfoHelper.updateClientModelCertificateInfo(client, info, attributePrefix);
327 
328  adminEvent.operation(OperationType.ACTION).resourcePath(session.getContext().getUri()).representation(info).success();
329  return rtn;
330  }
KeycloakSession session
Definition: ClientAttributeCertificateResource.java:80
String attributePrefix
Definition: ClientAttributeCertificateResource.java:82
byte [] getKeystore(final KeyStoreConfig config)
Definition: ClientAttributeCertificateResource.java:269
AdminPermissionEvaluator auth
Definition: ClientAttributeCertificateResource.java:78
AdminEventBuilder operation(OperationType operationType)
Definition: AdminEventBuilder.java:113
AdminEventBuilder adminEvent
Definition: ClientAttributeCertificateResource.java:81
void success()
Definition: AdminEventBuilder.java:226
AdminEventBuilder resourcePath(String... pathElements)
Definition: AdminEventBuilder.java:171
ClientModel client
Definition: ClientAttributeCertificateResource.java:79

◆ getCertFromRequest()

CertificateRepresentation org.keycloak.services.resources.admin.ClientAttributeCertificateResource.getCertFromRequest ( MultipartFormDataInput  input) throws IOException
inlineprivate
180  {
182  CertificateRepresentation info = new CertificateRepresentation();
183  Map<String, List<InputPart>> uploadForm = input.getFormDataMap();
184  List<InputPart> keystoreFormatPart = uploadForm.get("keystoreFormat");
185  if (keystoreFormatPart == null) throw new BadRequestException();
186  String keystoreFormat = keystoreFormatPart.get(0).getBodyAsString();
187  List<InputPart> inputParts = uploadForm.get("file");
188  if (keystoreFormat.equals(CERTIFICATE_PEM)) {
189  String pem = StreamUtil.readString(inputParts.get(0).getBody(InputStream.class, null));
190 
191  pem = PemUtils.removeBeginEnd(pem);
192 
193  // Validate format
194  KeycloakModelUtils.getCertificate(pem);
195 
196  info.setCertificate(pem);
197  return info;
198  } else if (keystoreFormat.equals(PUBLIC_KEY_PEM)) {
199  String pem = StreamUtil.readString(inputParts.get(0).getBody(InputStream.class, null));
200 
201  // Validate format
202  KeycloakModelUtils.getPublicKey(pem);
203 
204  info.setPublicKey(pem);
205  return info;
206  } else if (keystoreFormat.equals(JSON_WEB_KEY_SET)) {
207  InputStream stream = inputParts.get(0).getBody(InputStream.class, null);
208  JSONWebKeySet keySet = JsonSerialization.readValue(stream, JSONWebKeySet.class);
209  JWK publicKeyJwk = JWKSUtils.getKeyForUse(keySet, JWK.Use.SIG);
210  if (publicKeyJwk == null) {
211  throw new IllegalStateException("Certificate not found for use sig");
212  } else {
213  PublicKey publicKey = JWKParser.create(publicKeyJwk).toPublicKey();
214  String publicKeyPem = KeycloakModelUtils.getPemFromKey(publicKey);
215  info.setPublicKey(publicKeyPem);
216  info.setKid(publicKeyJwk.getKeyId());
217  return info;
218  }
219  }
220 
221 
222  String keyAlias = uploadForm.get("keyAlias").get(0).getBodyAsString();
223  List<InputPart> keyPasswordPart = uploadForm.get("keyPassword");
224  char[] keyPassword = keyPasswordPart != null ? keyPasswordPart.get(0).getBodyAsString().toCharArray() : null;
225 
226  List<InputPart> storePasswordPart = uploadForm.get("storePassword");
227  char[] storePassword = storePasswordPart != null ? storePasswordPart.get(0).getBodyAsString().toCharArray() : null;
228  PrivateKey privateKey = null;
229  X509Certificate certificate = null;
230  try {
231  KeyStore keyStore = null;
232  if (keystoreFormat.equals("JKS")) keyStore = KeyStore.getInstance("JKS");
233  else keyStore = KeyStore.getInstance(keystoreFormat, "BC");
234  keyStore.load(inputParts.get(0).getBody(InputStream.class, null), storePassword);
235  try {
236  privateKey = (PrivateKey)keyStore.getKey(keyAlias, keyPassword);
237  } catch (Exception e) {
238  // ignore
239  }
240  certificate = (X509Certificate)keyStore.getCertificate(keyAlias);
241  } catch (Exception e) {
242  throw new RuntimeException(e);
243  }
244 
245  if (privateKey != null) {
246  String privateKeyPem = KeycloakModelUtils.getPemFromKey(privateKey);
247  info.setPrivateKey(privateKeyPem);
248  }
249 
250  if (certificate != null) {
251  String certPem = KeycloakModelUtils.getPemFromCertificate(certificate);
252  info.setCertificate(certPem);
253  }
254 
255  return info;
256  }
static final String JSON_WEB_KEY_SET
Definition: ClientAttributeCertificateResource.java:75
AdminPermissionEvaluator auth
Definition: ClientAttributeCertificateResource.java:78
static final String PUBLIC_KEY_PEM
Definition: ClientAttributeCertificateResource.java:74
static final String CERTIFICATE_PEM
Definition: ClientAttributeCertificateResource.java:73
ClientModel client
Definition: ClientAttributeCertificateResource.java:79

◆ getKeyInfo()

CertificateRepresentation org.keycloak.services.resources.admin.ClientAttributeCertificateResource.getKeyInfo ( )
inline

Get key info

戻り値
101  {
103 
104  CertificateRepresentation info = CertificateInfoHelper.getCertificateFromClient(client, attributePrefix);
105  return info;
106  }
String attributePrefix
Definition: ClientAttributeCertificateResource.java:82
AdminPermissionEvaluator auth
Definition: ClientAttributeCertificateResource.java:78
ClientModel client
Definition: ClientAttributeCertificateResource.java:79

◆ getKeystore() [1/2]

byte [] org.keycloak.services.resources.admin.ClientAttributeCertificateResource.getKeystore ( final KeyStoreConfig  config)
inline

Get a keystore file for the client, containing private key and public certificate

引数
configKeystore configuration as JSON
戻り値
269  {
271 
272  if (config.getFormat() != null && !config.getFormat().equals("JKS") && !config.getFormat().equals("PKCS12")) {
273  throw new NotAcceptableException("Only support jks or pkcs12 format.");
274  }
275 
276  CertificateRepresentation info = CertificateInfoHelper.getCertificateFromClient(client, attributePrefix);
277  String privatePem = info.getPrivateKey();
278  String certPem = info.getCertificate();
279 
280  if (privatePem == null && certPem == null) {
281  throw new NotFoundException("keypair not generated for client");
282  }
283  if (privatePem != null && config.getKeyPassword() == null) {
284  throw new ErrorResponseException("password-missing", "Need to specify a key password for jks download", Response.Status.BAD_REQUEST);
285  }
286  if (config.getStorePassword() == null) {
287  throw new ErrorResponseException("password-missing", "Need to specify a store password for jks download", Response.Status.BAD_REQUEST);
288  }
289 
290  byte[] rtn = getKeystore(config, privatePem, certPem);
291  return rtn;
292  }
String attributePrefix
Definition: ClientAttributeCertificateResource.java:82
byte [] getKeystore(final KeyStoreConfig config)
Definition: ClientAttributeCertificateResource.java:269
AdminPermissionEvaluator auth
Definition: ClientAttributeCertificateResource.java:78
ClientModel client
Definition: ClientAttributeCertificateResource.java:79

◆ getKeystore() [2/2]

byte [] org.keycloak.services.resources.admin.ClientAttributeCertificateResource.getKeystore ( KeyStoreConfig  config,
String  privatePem,
String  certPem 
)
inlineprivate
332  {
333  try {
334  String format = config.getFormat();
335  KeyStore keyStore;
336  if (format.equals("JKS")) keyStore = KeyStore.getInstance("JKS");
337  else keyStore = KeyStore.getInstance(format, "BC");
338  keyStore.load(null, null);
339  String keyAlias = config.getKeyAlias();
340  if (keyAlias == null) keyAlias = client.getClientId();
341  if (privatePem != null) {
342  PrivateKey privateKey = PemUtils.decodePrivateKey(privatePem);
343  X509Certificate clientCert = PemUtils.decodeCertificate(certPem);
344 
345 
346  Certificate[] chain = {clientCert};
347 
348  keyStore.setKeyEntry(keyAlias, privateKey, config.getKeyPassword().trim().toCharArray(), chain);
349  } else {
350  X509Certificate clientCert = PemUtils.decodeCertificate(certPem);
351  keyStore.setCertificateEntry(keyAlias, clientCert);
352  }
353 
354 
355  if (config.isRealmCertificate() == null || config.isRealmCertificate().booleanValue()) {
356  KeyManager keys = session.keys();
357  String kid = keys.getActiveRsaKey(realm).getKid();
358  Certificate certificate = keys.getRsaCertificate(realm, kid);
359  String certificateAlias = config.getRealmAlias();
360  if (certificateAlias == null) certificateAlias = realm.getName();
361  keyStore.setCertificateEntry(certificateAlias, certificate);
362 
363  }
364  ByteArrayOutputStream stream = new ByteArrayOutputStream();
365  keyStore.store(stream, config.getStorePassword().trim().toCharArray());
366  stream.flush();
367  stream.close();
368  byte[] rtn = stream.toByteArray();
369  return rtn;
370  } catch (Exception e) {
371  throw new RuntimeException(e);
372  }
373  }
KeycloakSession session
Definition: ClientAttributeCertificateResource.java:80
RealmModel realm
Definition: ClientAttributeCertificateResource.java:77
ClientModel client
Definition: ClientAttributeCertificateResource.java:79

◆ uploadJks()

CertificateRepresentation org.keycloak.services.resources.admin.ClientAttributeCertificateResource.uploadJks ( MultipartFormDataInput  input) throws IOException
inline

Upload certificate and eventually private key

引数
input
戻り値
例外
IOException
140  {
142 
143  try {
144  CertificateRepresentation info = getCertFromRequest(input);
145  CertificateInfoHelper.updateClientModelCertificateInfo(client, info, attributePrefix);
146 
147  adminEvent.operation(OperationType.ACTION).resourcePath(session.getContext().getUri()).representation(info).success();
148  return info;
149  } catch (IllegalStateException ise) {
150  throw new ErrorResponseException("certificate-not-found", "Certificate or key with given alias not found in the keystore", Response.Status.BAD_REQUEST);
151  }
152  }
KeycloakSession session
Definition: ClientAttributeCertificateResource.java:80
String attributePrefix
Definition: ClientAttributeCertificateResource.java:82
CertificateRepresentation getCertFromRequest(MultipartFormDataInput input)
Definition: ClientAttributeCertificateResource.java:180
AdminPermissionEvaluator auth
Definition: ClientAttributeCertificateResource.java:78
AdminEventBuilder operation(OperationType operationType)
Definition: AdminEventBuilder.java:113
AdminEventBuilder adminEvent
Definition: ClientAttributeCertificateResource.java:81
void success()
Definition: AdminEventBuilder.java:226
AdminEventBuilder resourcePath(String... pathElements)
Definition: AdminEventBuilder.java:171
ClientModel client
Definition: ClientAttributeCertificateResource.java:79

◆ uploadJksCertificate()

CertificateRepresentation org.keycloak.services.resources.admin.ClientAttributeCertificateResource.uploadJksCertificate ( MultipartFormDataInput  input) throws IOException
inline

Upload only certificate, not private key

引数
input
戻り値
information extracted from uploaded certificate - not necessarily the new state of certificate on the server
例外
IOException
165  {
167 
168  try {
169  CertificateRepresentation info = getCertFromRequest(input);
170  info.setPrivateKey(null);
171  CertificateInfoHelper.updateClientModelCertificateInfo(client, info, attributePrefix);
172 
173  adminEvent.operation(OperationType.ACTION).resourcePath(session.getContext().getUri()).representation(info).success();
174  return info;
175  } catch (IllegalStateException ise) {
176  throw new ErrorResponseException("certificate-not-found", "Certificate or key with given alias not found in the keystore", Response.Status.BAD_REQUEST);
177  }
178  }
KeycloakSession session
Definition: ClientAttributeCertificateResource.java:80
String attributePrefix
Definition: ClientAttributeCertificateResource.java:82
CertificateRepresentation getCertFromRequest(MultipartFormDataInput input)
Definition: ClientAttributeCertificateResource.java:180
AdminPermissionEvaluator auth
Definition: ClientAttributeCertificateResource.java:78
AdminEventBuilder operation(OperationType operationType)
Definition: AdminEventBuilder.java:113
AdminEventBuilder adminEvent
Definition: ClientAttributeCertificateResource.java:81
void success()
Definition: AdminEventBuilder.java:226
AdminEventBuilder resourcePath(String... pathElements)
Definition: AdminEventBuilder.java:171
ClientModel client
Definition: ClientAttributeCertificateResource.java:79

メンバ詳解

◆ adminEvent

AdminEventBuilder org.keycloak.services.resources.admin.ClientAttributeCertificateResource.adminEvent
protected

◆ attributePrefix

String org.keycloak.services.resources.admin.ClientAttributeCertificateResource.attributePrefix
protected

◆ auth

AdminPermissionEvaluator org.keycloak.services.resources.admin.ClientAttributeCertificateResource.auth
private

◆ CERTIFICATE_PEM

final String org.keycloak.services.resources.admin.ClientAttributeCertificateResource.CERTIFICATE_PEM = "Certificate PEM"
static

◆ client

ClientModel org.keycloak.services.resources.admin.ClientAttributeCertificateResource.client
protected

◆ JSON_WEB_KEY_SET

final String org.keycloak.services.resources.admin.ClientAttributeCertificateResource.JSON_WEB_KEY_SET = "JSON Web Key Set"
static

◆ PUBLIC_KEY_PEM

final String org.keycloak.services.resources.admin.ClientAttributeCertificateResource.PUBLIC_KEY_PEM = "Public Key PEM"
static

◆ realm

RealmModel org.keycloak.services.resources.admin.ClientAttributeCertificateResource.realm
protected

◆ session

KeycloakSession org.keycloak.services.resources.admin.ClientAttributeCertificateResource.session
protected

このクラス詳解は次のファイルから抽出されました: