Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Keyring support #1177

Merged
merged 56 commits into from
Jul 28, 2020
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
42f689f
keyring support using keytool utility
vit-tomica Feb 19, 2020
04624d7
do not make keyring as default yet
vit-tomica Feb 21, 2020
4e81671
added keyring-util function for keyring operations
vit-tomica Mar 3, 2020
0e14104
Merge remote-tracking branch 'origin/staging' into keyring-support
vit-tomica Mar 3, 2020
c0e71a1
add informational message
vit-tomica Mar 3, 2020
a111842
keyring cleanup; zosmf trust
vit-tomica Mar 4, 2020
67ec8d6
zosmf trust
vit-tomica Mar 4, 2020
f8c2086
Merge branch 'staging' into keyring-support
OnnoVdT Mar 4, 2020
f55ea2a
adding umask in zowe-setup-certificates.sh; minor changes
vit-tomica Mar 5, 2020
fb54bae
Merge remote-tracking branch 'origin/keyring-support' into keyring-su…
vit-tomica Mar 5, 2020
990380e
typo
vit-tomica Mar 6, 2020
f1bf272
Merge branch 'staging' into keyring-support
OnnoVdT Mar 20, 2020
e39d38a
Merge remote-tracking branch 'origin/staging' into keyring-support
vit-tomica Apr 22, 2020
db57265
Merge branch 'staging' into keyring-support
1000TurquoisePogs Apr 28, 2020
01699ce
use four slashes so java components can directly consume the value
vit-tomica May 4, 2020
223d832
Merge remote-tracking branch 'origin/keyring-support' into keyring-su…
vit-tomica May 4, 2020
275b1a5
added JCL that configures certificates and SAF keyrings
vit-tomica May 6, 2020
3eb1423
Added ZWEKRING element to SMPE build
vit-tomica May 6, 2020
3111902
Do not build keyring-util program. Ship pre-built binaries instead.
vit-tomica May 7, 2020
024520a
Do not export private key and cert when using a keyring
vit-tomica May 7, 2020
26d77f6
Do not generate certificates for keyring if ZWEKRING jcl already did
vit-tomica May 7, 2020
33b714c
Merge branch 'staging' into keyring-support
vit-tomica May 7, 2020
04a975e
Remove KEYSTORE_KEY,KEYSTORE_CERTIFICATE,KEYSTORE_CERTIFICATE_AUTHORI…
vit-tomica May 7, 2020
7a8ce6f
Merge remote-tracking branch 'origin/keyring-support' into keyring-su…
vit-tomica May 7, 2020
7164302
added 'chmod +x' for keyring_util; fix iconv
vit-tomica May 7, 2020
11315da
add descriptions
vit-tomica May 12, 2020
9f56c88
Merge remote-tracking branch 'origin/staging' into keyring-support
vit-tomica May 12, 2020
38779cb
Always set up trust with zosmf because of retrieving JWT token from z…
vit-tomica May 14, 2020
31c2517
ZWEKRING - remove blank between SET LABEL= and a value
vit-tomica May 15, 2020
61fa7a7
create SET variables for signing CA's
vit-tomica May 19, 2020
49d6369
Added ACF2 commands
vit-tomica May 22, 2020
ab3b730
ACF2 fixes
vit-tomica May 25, 2020
45723c7
Allow Zowe to use certificate owned by SITE acid
vit-tomica May 25, 2020
3d1032e
Add KEYRING_OWNER and KEYRING_NAME variables to the zowe-certificates…
vit-tomica May 26, 2020
29201e4
minor change
vit-tomica May 28, 2020
6be2277
escape dollar sign
vit-tomica Jun 4, 2020
e4413cb
Use only handshake key usage for generated certificate
vit-tomica Jun 5, 2020
2bae8d2
Export a zowe generated jwt public key from a keyring
vit-tomica Jun 8, 2020
412d1d4
Hardcode the password value otherwise JVM fails reading the keyring
vit-tomica Jun 9, 2020
7f5268b
Merge remote-tracking branch 'origin/staging' into keyring-support
vit-tomica Jun 19, 2020
fd72a91
increase zlux version
vit-tomica Jun 19, 2020
77097ee
Merge remote-tracking branch 'origin/staging' into keyring-support
vit-tomica Jun 19, 2020
5d3cc8e
remove apostrophes from ALTNAME keyword for ACF2
vit-tomica Jun 22, 2020
382bf74
Detect root CA for a certificate in a key ring
vit-tomica Jun 22, 2020
bda18ea
add keyring to artifactory build (#1453)
MarkAckert Jun 24, 2020
d35753c
remove backtick
vit-tomica Jun 24, 2020
955b65d
update keyring utilities version to 1.0.2
vit-tomica Jul 7, 2020
279813e
Merge remote-tracking branch 'origin/staging' into keyring-support
vit-tomica Jul 7, 2020
249ce27
update keyring utilities version to 1.0.3
vit-tomica Jul 8, 2020
10fd8ec
Merge remote-tracking branch 'origin/staging' into keyring-support
vit-tomica Jul 8, 2020
f7c4c66
Merge branch 'staging' into keyring-support
stevenhorsman Jul 13, 2020
4f559f6
resolve PR review comments
vit-tomica Jul 20, 2020
806c396
Merge remote-tracking branch 'origin/keyring-support' into keyring-su…
vit-tomica Jul 20, 2020
3b89914
Merge branch 'staging' into keyring-support
vit-tomica Jul 20, 2020
b26f68d
Merge branch 'staging' into keyring-support
OnnoVdT Jul 24, 2020
81c97dd
Merge branch 'staging' into keyring-support
stevenhorsman Jul 28, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
208 changes: 162 additions & 46 deletions bin/apiml_cm.sh

Large diffs are not rendered by default.

49 changes: 49 additions & 0 deletions bin/utils/keyring-util/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# keyring-util

The keyring-util program leverages
[R_datalib callable service](https://www.ibm.com/support/knowledgecenter/SSLTBW_2.4.0/com.ibm.zos.v2r4.ichd100/datalib.htm)
to perform various operations on digital certificates and RACF key rings.

## Syntax
```bash
keyring-util function userid keyring label
```
**Parametres:**
1. `function` see [Functions](##Functions) section below
2. `userid` - an owner of the `keyring` and `label` certificate
3. `keyring` - a name of the keyring
4. `label` - a label of the certificate

## Functions

* `NEWRING` - creates a keyring
* Example: `keyring-util NEWRING USER01 ZOWERING`

* `DELRING` - deletes a keyring
* Example: `keyring-util DELRING USER01 ZOWERING`

* `DELCERT` - remove a certificate from a keyring or deletes a certificate from RACF database

**Current Limitation:** The `DELCERT` function can only manipulate a certificate that is owned by the `userid`, i.e. it can't
work with certificates owned by the CERTAUTH, SITE or different userid.

The following example removes `localhost` certificate owned by the `USER01` from the `ZOWERING` keyring owned by the `USER01` userid
* Example: `keyring-util DELCERT USER01 ZOWERING localhost`

The following example removes `localhost` certificate owned by the `USER01` from the RACF database. The command fails if the certificate
is still connected to some keyring.
* Example: `keyring-util DELCERT USER01 '*' localhost`

* `REFRESH` - refreshes DIGTCERT class
* Example: `keyring-util REFRESH`

For any return and reason codes, check [R_datalib return and reason codes](https://www.ibm.com/support/knowledgecenter/SSLTBW_2.4.0/com.ibm.zos.v2r4.ichd100/ich2d100238.htm)

## Further development
There is room for improvement:
* command line argument processing and syntax (perhaps using the argp library from [ambitus project](https://github.com/ambitus/glibc/tree/zos/2.28/master/argp))
* an extension of functionality of the current R_datalib functions
* adding support for other [R_datalib functions](https://www.ibm.com/support/knowledgecenter/SSLTBW_2.4.0/com.ibm.zos.v2r4.ichd100/ich2d100226.htm)

Work with the following resource if you want to add support for other R_datalib functions [Data areas for R_datalib callable service](https://www.ibm.com/support/knowledgecenter/SSLTBW_2.4.0/com.ibm.zos.v2r4.ichc400/comx.htm)

1 change: 1 addition & 0 deletions bin/utils/keyring-util/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
xlc -q64 -o keyring-util keyring-util.c
175 changes: 175 additions & 0 deletions bin/utils/keyring-util/keyring-util.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#ifdef _LP64
#pragma linkage(IRRSDL64, OS)
#else
#error "31-bit not supported yet."
#endif

#include "keyring-util.h"

int debug = 0;

int main(int argc, char **argv)
{
int i;

if (getenv("KEYRING_UTIL_DEBUG") != NULL && ! strcmp(getenv("KEYRING_UTIL_DEBUG"), "YES")) {
debug = 1;
}
Command_line_parms parms;
memset(&parms, 0, sizeof(Command_line_parms));

R_datalib_data_remove rem_parm;
memset(&rem_parm, 0x00, sizeof(R_datalib_data_remove));

R_datalib_parm_list_64 p;

process_cmdline_parms(&parms, argc, argv);

R_datalib_function function_table[] = {
{"NEWRING", NEWRING_CODE, 0x00000000, 0, NULL, simple_action},
{"DELCERT", DELCERT_CODE, 0x00000000, 0, &rem_parm, delcert_action},
{"DELRING", DELRING_CODE, 0x00000000, 0, NULL, simple_action},
{"REFRESH", REFRESH_CODE, 0x00000000, 0, NULL, simple_action},
{"HELP", HELP_CODE, 0x00000000, 0, NULL, print_help},
{"NOTSUPPORTED", NOTSUPPORTED_CODE, 0x00000000, 0, NULL, print_help}
};

R_datalib_function function;
for (i = 0; i < sizeof(function_table)/sizeof(R_datalib_function); i++) {
if (strncasecmp(function_table[i].name, parms.function, sizeof(parms.function)) == 0) {
function = function_table[i];
break;
}
function = function_table[sizeof(function_table)/sizeof(R_datalib_function) - 1];
}
if (debug) {
printf("Selected function is %s with code of %.2X\n", function.name, function.code);
}
function.action(&p, &function, &parms);

return 0;
}

void simple_action(R_datalib_parm_list_64* rdatalib_parms, void * function, Command_line_parms* parms) {
R_datalib_function *func = function;
if (debug) {
printf("%s action\n", func->name);
}
set_up_R_datalib_parameters(rdatalib_parms, function, parms->userid, parms->keyring);
invoke_R_datalib(rdatalib_parms);
check_return_code(rdatalib_parms);
}

void delcert_action(R_datalib_parm_list_64* rdatalib_parms, void * function, Command_line_parms* parms) {
R_datalib_function *func = function;
R_datalib_data_remove *rem_parm = func->parmlist;

if (debug) {
printf("%s action\n", func->name);
}
rem_parm->label_len = strlen(parms->label);
rem_parm->label_addr = parms->label;
rem_parm->CERT_userid_len = 0x00;

set_up_R_datalib_parameters(rdatalib_parms, func, parms->userid, parms->keyring);
invoke_R_datalib(rdatalib_parms);
check_return_code(rdatalib_parms);
// refresh DIGTCERT class if required
if (rdatalib_parms->return_code == 4 && rdatalib_parms->RACF_return_code == 4 && rdatalib_parms->RACF_reason_code == 12) {
printf("DIGTCERT class has to refreshed.\n");
func->code = REFRESH_CODE;
set_up_R_datalib_parameters(rdatalib_parms, func, "", "");
invoke_R_datalib(rdatalib_parms);
check_return_code(rdatalib_parms);
printf("DIGTCERT class refreshed.\n");
}
}

void validate_and_set_parm(char * parm, char * cmd_parm, int maxlen) {
if (strlen(cmd_parm) <= maxlen) {
strcpy(parm, cmd_parm);
} else {
printf("ERROR: %s parm too long and will not be set.\n", cmd_parm);
}
}

void check_return_code(R_datalib_parm_list_64* p) {
if (p->return_code != 0 || p->RACF_return_code != 0 || p->RACF_reason_code != 0) {
printf("Function code: %.2X, SAF rc: %d, RACF rc: %d, RACF rsn: %d\n",
p->function_code, p->return_code, p->RACF_return_code, p->RACF_reason_code);
}
}

void process_cmdline_parms(Command_line_parms* parms, int argc, char** argv) {
int i;
for (i = 1; i < argc; i++) {
if (debug) {
printf("%d. parameter: %s\n", i, argv[i]);
}
switch(i) {
case 1:
validate_and_set_parm(parms->function, argv[i], MAX_FUNCTION_LEN);
break;
case 2:
validate_and_set_parm(parms->userid, argv[i], MAX_USERID_LEN);
break;
case 3:
validate_and_set_parm(parms->keyring, argv[i], MAX_KEYRING_LEN);
break;
case 4:
validate_and_set_parm(parms->label, argv[i], MAX_LABEL_LEN);
break;
default:
printf("WARNING: %i. parameter - %s - is currently not supported and will be ignored.\n", i, argv[i]);
}
}
}

void invoke_R_datalib(R_datalib_parm_list_64 * p) {

IRRSDL64(
&p->num_parms,
&p->workarea,
&p->saf_rc_ALET, &p->return_code,
&p->racf_rc_ALET, &p->RACF_return_code,
&p->racf_rsn_ALET, &p->RACF_reason_code,
&p->function_code,
&p->attributes,
&p->RACF_userid_len,
&p->ring_name_len,
&p->parm_list_version,
p->parmlist
);
}

void set_up_R_datalib_parameters(R_datalib_parm_list_64 * p, R_datalib_function * function, char * userid, char * keyring) {
memset(p, 0, sizeof(R_datalib_parm_list_64));
p->num_parms = 14;
p->saf_rc_ALET = 0;
p->racf_rc_ALET = 0;
p->racf_rsn_ALET = 0;
p->function_code = function->code;
p->attributes = function->default_attributes;
memset(&p->RACF_userid_len, strlen(userid), 1);
memcpy(p->RACF_userid, userid, strlen(userid));
memset(&p->ring_name_len, strlen(keyring), 1);
memcpy(p->ring_name, keyring, strlen(keyring));
p->parm_list_version = function->parm_list_version;
p->parmlist = function->parmlist;
}

void print_help(R_datalib_parm_list_64* rdatalib_parms, void * function, Command_line_parms* parms) {
printf("----------------------------------------------------\n");
printf("Usage: keyring-util function userid keyring label\n");
printf("----------------------------------------------------\n");
printf("function:\n");
printf("NEWRING - creates a new keyring.\n");
printf("DELRING - deletes a keyring\n");
printf("DELCERT - disconnects a certificate (label) from a keyring or deletes a certificate from RACF database\n");
printf("REFRESH - refreshes DIGTCERT class\n");
printf("HELP - prints this help\n");
}
70 changes: 70 additions & 0 deletions bin/utils/keyring-util/keyring-util.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
#ifndef _keyring_util
#define _keyring_util

#define MAX_FUNCTION_LEN 16
#define MAX_USERID_LEN 8
#define MAX_KEYRING_LEN 236
#define MAX_LABEL_LEN 32

#define NEWRING_CODE 0x07
#define DELCERT_CODE 0x09
#define DELRING_CODE 0x0A
#define REFRESH_CODE 0x0B
#define HELP_CODE 0x00
#define NOTSUPPORTED_CODE 0x00


typedef struct _Command_line_params {
char function[MAX_FUNCTION_LEN];
char userid[MAX_USERID_LEN + 1];
char keyring[MAX_KEYRING_LEN + 1];
char label[MAX_LABEL_LEN + 1];

} Command_line_parms;

typedef struct _R_datalib_parm_list_64 {
int num_parms;
double workarea[128]; // double word aligned, 1024 bytes long workarea
int saf_rc_ALET, return_code;
int racf_rc_ALET, RACF_return_code;
int racf_rsn_ALET, RACF_reason_code;
char function_code;
int attributes;
char RACF_userid_len; // DO NOT change position of this field
char RACF_userid[MAX_USERID_LEN]; // DO NOT change position of this field
char ring_name_len; // DO NOT change position of this field
char ring_name[MAX_KEYRING_LEN]; // DO NOT change position of this field
int parm_list_version;
void *parmlist;
} R_datalib_parm_list_64;

typedef void (*function_action)(R_datalib_parm_list_64*, void*, Command_line_parms*);

typedef struct _R_datalib_function {
char name[MAX_FUNCTION_LEN];
char code;
int default_attributes;
int parm_list_version;
void *parmlist;
function_action action;
} R_datalib_function;

typedef _Packed struct _R_datalib_data_remove {
int label_len;
int reserve_1;
char *label_addr;
char CERT_userid_len; // DO NOT change position of this field
char CERT_userid[MAX_USERID_LEN]; // DO NOT change position of this field
char reserved_2[3];
} R_datalib_data_remove;

void invoke_R_datalib(R_datalib_parm_list_64*);
void set_up_R_datalib_parameters(R_datalib_parm_list_64* , R_datalib_function* , char* ,char* );
void simple_action(R_datalib_parm_list_64*, void*, Command_line_parms*);
void delcert_action(R_datalib_parm_list_64*, void*, Command_line_parms*);
void print_help(R_datalib_parm_list_64*, void*, Command_line_parms*);
void process_cmdline_parms(Command_line_parms*, int , char**);
void validate_and_set_parm(char*, char*, int);
void check_return_code(R_datalib_parm_list_64*);

#endif
5 changes: 4 additions & 1 deletion bin/zowe-setup-certificates.env
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,8 @@ KEYSTORE_DIRECTORY=/global/zowe/keystore
KEYSTORE_ALIAS=localhost
# Specify zowe user id to set up ownership of the generated certificates
ZOWE_USER_ID=ZWESVUSR
# Specify zowe user id to set up ownership of the generated certificates
# Specify zowe group id to set up ownership of the generated certificates
ZOWE_GROUP_ID=ZWEADMIN
# Specify zowe keyring that keeps zowe certificates, if not specified USS keystore
# files will be created.
ZOWE_KEYRING=
Loading