CA Certificates in Operator-UI (#829)

- Bug fix: removing CA certificates for MinIO in operator-ui was broken
- Added missing file uplader for Console CA certificates

Signed-off-by: Lenin Alevski <alevsk.8772@gmail.com>
This commit is contained in:
Lenin Alevski
2021-06-24 12:15:24 -07:00
committed by GitHub
parent c7e195b361
commit 616be03c0b
20 changed files with 262 additions and 26 deletions

View File

@@ -1,25 +1,25 @@
{
"files": {
"main.css": "/static/css/main.8cfac526.chunk.css",
"main.js": "/static/js/main.e8f37b3e.chunk.js",
"main.js.map": "/static/js/main.e8f37b3e.chunk.js.map",
"main.js": "/static/js/main.693e6599.chunk.js",
"main.js.map": "/static/js/main.693e6599.chunk.js.map",
"runtime-main.js": "/static/js/runtime-main.43a31377.js",
"runtime-main.js.map": "/static/js/runtime-main.43a31377.js.map",
"static/css/2.8d89c2a5.chunk.css": "/static/css/2.8d89c2a5.chunk.css",
"static/js/2.df28ebd3.chunk.js": "/static/js/2.df28ebd3.chunk.js",
"static/js/2.df28ebd3.chunk.js.map": "/static/js/2.df28ebd3.chunk.js.map",
"static/css/2.60e04a19.chunk.css": "/static/css/2.60e04a19.chunk.css",
"static/js/2.5246de55.chunk.js": "/static/js/2.5246de55.chunk.js",
"static/js/2.5246de55.chunk.js.map": "/static/js/2.5246de55.chunk.js.map",
"index.html": "/index.html",
"static/css/2.8d89c2a5.chunk.css.map": "/static/css/2.8d89c2a5.chunk.css.map",
"static/css/2.60e04a19.chunk.css.map": "/static/css/2.60e04a19.chunk.css.map",
"static/css/main.8cfac526.chunk.css.map": "/static/css/main.8cfac526.chunk.css.map",
"static/js/2.df28ebd3.chunk.js.LICENSE.txt": "/static/js/2.df28ebd3.chunk.js.LICENSE.txt",
"static/js/2.5246de55.chunk.js.LICENSE.txt": "/static/js/2.5246de55.chunk.js.LICENSE.txt",
"static/media/minio_console_logo.0837460e.svg": "/static/media/minio_console_logo.0837460e.svg",
"static/media/minio_operator_logo.1312b7c9.svg": "/static/media/minio_operator_logo.1312b7c9.svg"
},
"entrypoints": [
"static/js/runtime-main.43a31377.js",
"static/css/2.8d89c2a5.chunk.css",
"static/js/2.df28ebd3.chunk.js",
"static/css/2.60e04a19.chunk.css",
"static/js/2.5246de55.chunk.js",
"static/css/main.8cfac526.chunk.css",
"static/js/main.e8f37b3e.chunk.js"
"static/js/main.693e6599.chunk.js"
]
}

View File

@@ -1 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="MinIO Console"/><link href="https://fonts.googleapis.com/css2?family=Lato:wght@400;500;700;900&display=swap" rel="stylesheet"/><link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"/><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"/><link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"/><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"/><link rel="manifest" href="/manifest.json"/><link rel="mask-icon" href="/safari-pinned-tab.svg" color="#3a4e54"/><title>MinIO Console</title><link href="/static/css/2.8d89c2a5.chunk.css" rel="stylesheet"><link href="/static/css/main.8cfac526.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,l,i=r[0],a=r[1],p=r[2],c=0,s=[];c<i.length;c++)l=i[c],Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&s.push(o[l][0]),o[l]=0;for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n]);for(f&&f(r);s.length;)s.shift()();return u.push.apply(u,p||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,i=1;i<t.length;i++){var a=t[i];0!==o[a]&&(n=!1)}n&&(u.splice(r--,1),e=l(l.s=t[0]))}return e}var n={},o={1:0},u=[];function l(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,l),t.l=!0,t.exports}l.m=e,l.c=n,l.d=function(e,r,t){l.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,r){if(1&r&&(e=l(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(l.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)l.d(t,n,function(r){return e[r]}.bind(null,n));return t},l.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(r,"a",r),r},l.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},l.p="/";var i=this["webpackJsonpportal-ui"]=this["webpackJsonpportal-ui"]||[],a=i.push.bind(i);i.push=r,i=i.slice();for(var p=0;p<i.length;p++)r(i[p]);var f=a;t()}([])</script><script src="/static/js/2.df28ebd3.chunk.js"></script><script src="/static/js/main.e8f37b3e.chunk.js"></script></body></html>
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="MinIO Console"/><link href="https://fonts.googleapis.com/css2?family=Lato:wght@400;500;700;900&display=swap" rel="stylesheet"/><link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"/><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"/><link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"/><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"/><link rel="manifest" href="/manifest.json"/><link rel="mask-icon" href="/safari-pinned-tab.svg" color="#3a4e54"/><title>MinIO Console</title><link href="/static/css/2.60e04a19.chunk.css" rel="stylesheet"><link href="/static/css/main.8cfac526.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,l,i=r[0],a=r[1],p=r[2],c=0,s=[];c<i.length;c++)l=i[c],Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&s.push(o[l][0]),o[l]=0;for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n]);for(f&&f(r);s.length;)s.shift()();return u.push.apply(u,p||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,i=1;i<t.length;i++){var a=t[i];0!==o[a]&&(n=!1)}n&&(u.splice(r--,1),e=l(l.s=t[0]))}return e}var n={},o={1:0},u=[];function l(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,l),t.l=!0,t.exports}l.m=e,l.c=n,l.d=function(e,r,t){l.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,r){if(1&r&&(e=l(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(l.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)l.d(t,n,function(r){return e[r]}.bind(null,n));return t},l.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(r,"a",r),r},l.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},l.p="/";var i=this["webpackJsonpportal-ui"]=this["webpackJsonpportal-ui"]||[],a=i.push.bind(i);i.push=r,i=i.slice();for(var p=0;p<i.length;p++)r(i[p]);var f=a;t()}([])</script><script src="/static/js/2.5246de55.chunk.js"></script><script src="/static/js/main.693e6599.chunk.js"></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -116,6 +116,7 @@ const AddTenant = ({
const secretKeys = fields.identityProvider.secretKeys;
const minioCertificates = certificates.minioCertificates;
const caCertificates = certificates.caCertificates;
const consoleCaCertificates = certificates.consoleCaCertificates;
const consoleCertificate = certificates.consoleCertificate;
const serverCertificate = certificates.serverCertificate;
const clientCertificate = certificates.clientCertificate;
@@ -285,6 +286,7 @@ const AddTenant = ({
let tenantCerts: any = null;
let consoleCerts: any = null;
let caCerts: any = null;
let consoleCaCerts: any = null;
if (caCertificates.length > 0) {
caCerts = {
@@ -294,6 +296,14 @@ const AddTenant = ({
};
}
if (consoleCaCertificates.length > 0) {
consoleCaCerts = {
console_ca_certificates: consoleCaCertificates
.map((keyPair: KeyPair) => keyPair.encoded_cert)
.filter((keyPair) => keyPair),
};
}
if (enableTLS && minioCertificates.length > 0) {
tenantCerts = {
minio: minioCertificates
@@ -318,13 +328,14 @@ const AddTenant = ({
};
}
if (tenantCerts || consoleCerts || caCerts) {
if (tenantCerts || consoleCerts || caCerts || consoleCaCerts) {
dataSend = {
...dataSend,
tls: {
...tenantCerts,
...consoleCerts,
...caCerts,
...consoleCaCerts,
},
};
}

View File

@@ -32,6 +32,9 @@ import {
addFileToKeyPair,
deleteKeyPair,
addConsoleCertificate,
addFileToConsoleCaCertificates,
deleteConsoleCaCertificate,
addConsoleCaCertificate,
} from "../../actions";
import { AppState } from "../../../../../store";
import { KeyPair } from "../../ListTenants/utils";
@@ -51,6 +54,10 @@ interface ISecurityProps {
addFileToCaCertificates: typeof addFileToCaCertificates;
deleteCaCertificate: typeof deleteCaCertificate;
addCaCertificate: typeof addCaCertificate;
consoleCaCertificates: KeyPair[];
addFileToConsoleCaCertificates: typeof addFileToConsoleCaCertificates;
deleteConsoleCaCertificate: typeof deleteConsoleCaCertificate;
addConsoleCaCertificate: typeof addConsoleCaCertificate;
addKeyPair: typeof addKeyPair;
addFileToKeyPair: typeof addFileToKeyPair;
deleteKeyPair: typeof deleteKeyPair;
@@ -79,6 +86,10 @@ const Security = ({
addFileToCaCertificates,
deleteCaCertificate,
addCaCertificate,
consoleCaCertificates,
addFileToConsoleCaCertificates,
deleteConsoleCaCertificate,
addConsoleCaCertificate,
addKeyPair,
addFileToKeyPair,
deleteKeyPair,
@@ -246,7 +257,7 @@ const Security = ({
<Grid container>
<Grid item xs={12}>
<Typography variant="overline" display="block" gutterBottom>
CA Certificates
MinIO CA Certificates
</Typography>
</Grid>
{caCertificates.map((keyPair: KeyPair) => (
@@ -324,6 +335,49 @@ const Security = ({
/>
</Grid>
</Grid>
<Grid container>
<Grid item xs={12}>
<Typography variant="overline" display="block" gutterBottom>
Console CA Certificates
</Typography>
</Grid>
{consoleCaCertificates.map((keyPair: KeyPair) => (
<Fragment key={keyPair.id}>
<Grid item xs={10}>
<FileSelector
onChange={(encodedValue, fileName) => {
addFileToConsoleCaCertificates(
keyPair.id,
"cert",
fileName,
encodedValue
);
}}
accept=".cer,.crt,.cert,.pem"
id="tlsCert"
name="tlsCert"
label="Cert"
value={keyPair.cert}
/>
</Grid>
<Grid item xs={1}>
<Button
onClick={() => {
deleteConsoleCaCertificate(keyPair.id);
}}
color="secondary"
>
Remove
</Button>
</Grid>
</Fragment>
))}
<Grid item xs={12}>
<Button onClick={addConsoleCaCertificate} color="primary">
Add More
</Button>
</Grid>
</Grid>
</Fragment>
)}
</Fragment>
@@ -339,6 +393,8 @@ const mapState = (state: AppState) => ({
state.tenants.createTenant.fields.security.enableCustomCerts,
minioCertificates: state.tenants.createTenant.certificates.minioCertificates,
caCertificates: state.tenants.createTenant.certificates.caCertificates,
consoleCaCertificates:
state.tenants.createTenant.certificates.consoleCaCertificates,
consoleCertificate:
state.tenants.createTenant.certificates.consoleCertificate,
});
@@ -353,6 +409,9 @@ const connector = connect(mapState, {
addFileToKeyPair,
deleteKeyPair,
addConsoleCertificate,
addFileToConsoleCaCertificates,
deleteConsoleCaCertificate,
addConsoleCaCertificate,
});
export default withStyles(styles)(connector(Security));

View File

@@ -30,6 +30,9 @@ import {
ADD_TENANT_DELETE_MINIO_KEYPAIR,
ADD_TENANT_ADD_FILE_TO_MINIO_KEYPAIR,
ADD_TENANT_ADD_CONSOLE_CERT,
ADD_TENANT_ADD_CONSOLE_CA_KEYPAIR,
ADD_TENANT_DELETE_CONSOLE_CA_KEYPAIR,
ADD_TENANT_ADD_FILE_TO_CONSOLE_CA_KEYPAIR,
ADD_TENANT_ENCRYPTION_SERVER_CERT,
ADD_TENANT_ENCRYPTION_CLIENT_CERT,
ADD_TENANT_ENCRYPTION_VAULT_CERT,
@@ -124,6 +127,34 @@ export const addFileToCaCertificates = (
};
};
export const addConsoleCaCertificate = () => {
return {
type: ADD_TENANT_ADD_CONSOLE_CA_KEYPAIR,
};
};
export const deleteConsoleCaCertificate = (id: string) => {
return {
type: ADD_TENANT_DELETE_CONSOLE_CA_KEYPAIR,
id,
};
};
export const addFileToConsoleCaCertificates = (
id: string,
key: string,
fileName: string,
value: string
) => {
return {
type: ADD_TENANT_ADD_FILE_TO_CONSOLE_CA_KEYPAIR,
id,
key,
fileName,
value,
};
};
export const addKeyPair = () => {
return {
type: ADD_TENANT_ADD_MINIO_KEYPAIR,

View File

@@ -29,6 +29,9 @@ import {
ADD_TENANT_ADD_FILE_TO_CA_KEYPAIR,
ADD_TENANT_DELETE_CA_KEYPAIR,
ADD_TENANT_ADD_CONSOLE_CERT,
ADD_TENANT_ADD_CONSOLE_CA_KEYPAIR,
ADD_TENANT_ADD_FILE_TO_CONSOLE_CA_KEYPAIR,
ADD_TENANT_DELETE_CONSOLE_CA_KEYPAIR,
ADD_TENANT_ADD_FILE_TO_MINIO_KEYPAIR,
ADD_TENANT_ENCRYPTION_SERVER_CERT,
ADD_TENANT_ENCRYPTION_CLIENT_CERT,
@@ -187,6 +190,15 @@ const initialState: ITenantState = {
encoded_cert: "",
},
],
consoleCaCertificates: [
{
id: Date.now().toString(),
key: "",
cert: "",
encoded_key: "",
encoded_cert: "",
},
],
consoleCertificate: {
id: "console_cert_pair",
key: "",
@@ -373,14 +385,13 @@ export function tenantsReducer(
newState.createTenant.certificates.caCertificates = [...NACList];
return { ...newState };
case ADD_TENANT_DELETE_CA_KEYPAIR:
const CACertsList = state.createTenant.certificates.minioCertificates;
const CACertsList = state.createTenant.certificates.caCertificates;
if (CACertsList.length > 1) {
const cleanMinioCertsList = CACertsList.filter(
const cleanCaCertsList = CACertsList.filter(
(item: KeyPair) => item.id !== action.id
);
newState.createTenant.certificates.caCertificates = [
...cleanMinioCertsList,
...cleanCaCertsList,
];
return { ...newState };
}
@@ -395,6 +406,52 @@ export function tenantsReducer(
};
return { ...newState };
case ADD_TENANT_ADD_CONSOLE_CA_KEYPAIR:
const ConsoleCACerts = [
...state.createTenant.certificates.consoleCaCertificates,
{
id: Date.now().toString(),
key: "",
cert: "",
encoded_key: "",
encoded_cert: "",
},
];
newState.createTenant.certificates.consoleCaCertificates = [
...ConsoleCACerts,
];
return { ...newState };
case ADD_TENANT_ADD_FILE_TO_CONSOLE_CA_KEYPAIR:
const consoleCaCertificates =
state.createTenant.certificates.consoleCaCertificates;
const consoleNACList = consoleCaCertificates.map((item: KeyPair) => {
if (item.id === action.id) {
return {
...item,
[action.key]: action.fileName,
[`encoded_${action.key}`]: action.value,
};
}
return item;
});
newState.createTenant.certificates.consoleCaCertificates = [
...consoleNACList,
];
return { ...newState };
case ADD_TENANT_DELETE_CONSOLE_CA_KEYPAIR:
const consoleCACertsList =
state.createTenant.certificates.consoleCaCertificates;
if (consoleCACertsList.length > 1) {
const cleanCaCertsList = consoleCACertsList.filter(
(item: KeyPair) => item.id !== action.id
);
newState.createTenant.certificates.consoleCaCertificates = [
...cleanCaCertsList,
];
return { ...newState };
}
return { ...state };
case ADD_TENANT_ENCRYPTION_SERVER_CERT:
const encServerCert = state.createTenant.certificates.serverCertificate;
@@ -590,6 +647,15 @@ export function tenantsReducer(
encoded_cert: "",
},
],
consoleCaCertificates: [
{
id: Date.now().toString(),
key: "",
cert: "",
encoded_key: "",
encoded_cert: "",
},
],
consoleCertificate: {
id: "console_cert_pair",
key: "",

View File

@@ -40,6 +40,12 @@ export const ADD_TENANT_ADD_FILE_TO_CA_KEYPAIR =
"ADD_TENANT/ADD_FILE_TO_CA_KEYPAIR";
export const ADD_TENANT_DELETE_CA_KEYPAIR = "ADD_TENANT/DELETE_CA_KEYPAIR";
export const ADD_TENANT_ADD_CONSOLE_CERT = "ADD_TENANT/ADD_CONSOLE_CERT";
export const ADD_TENANT_ADD_CONSOLE_CA_KEYPAIR =
"ADD_TENANT/ADD_CONSOLE_CA_KEYPAIR";
export const ADD_TENANT_ADD_FILE_TO_CONSOLE_CA_KEYPAIR =
"ADD_TENANT/ADD_FILE_TO_CONSOLE_CA_KEYPAIR";
export const ADD_TENANT_DELETE_CONSOLE_CA_KEYPAIR =
"ADD_TENANT/DELETE_CONSOLE_CA_KEYPAIR";
// Encryption
export const ADD_TENANT_ENCRYPTION_SERVER_CERT =
@@ -90,6 +96,7 @@ export interface ICreateTenant {
export interface ICertificatesItems {
minioCertificates: KeyPair[];
caCertificates: KeyPair[];
consoleCaCertificates: KeyPair[];
consoleCertificate: KeyPair;
serverCertificate: KeyPair;
clientCertificate: KeyPair;
@@ -296,6 +303,22 @@ interface DeleteCAKeyPair {
type: typeof ADD_TENANT_DELETE_CA_KEYPAIR;
id: string;
}
interface AddConsoleCAKeyPair {
type: typeof ADD_TENANT_ADD_CONSOLE_CA_KEYPAIR;
}
interface AddFileToConsoleCAKeyPair {
type: typeof ADD_TENANT_ADD_FILE_TO_CONSOLE_CA_KEYPAIR;
id: string;
key: string;
fileName: string;
value: string;
}
interface DeleteConsoleCAKeyPair {
type: typeof ADD_TENANT_DELETE_CONSOLE_CA_KEYPAIR;
id: string;
}
interface AddFileConsoleCert {
type: typeof ADD_TENANT_ADD_CONSOLE_CERT;
@@ -376,9 +399,12 @@ export type TenantsManagementTypes =
| DeleteMinioKeyPair
| AddCAKeyPair
| DeleteCAKeyPair
| AddConsoleCAKeyPair
| DeleteConsoleCAKeyPair
| AddFileConsoleCert
| AddFileToMinioKeyPair
| AddFileToCAKeyPair
| AddFileToConsoleCAKeyPair
| AddFileServerCert
| AddFileClientCert
| AddFileVaultCert