feat: accept version numbers which are not strings (#1589)
## This PR Fixes errors when the provided version is not a string but a number (e.g. versions like 1.0, 2, ...) and improves the test suite to use our `parseSemverEvaluationData` function. Furthermore, logging now includes erroneous inputs. --------- Signed-off-by: christian.lutnik <christian.lutnik@dynatrace.com> Signed-off-by: Simon Schrottner <simon.schrottner@dynatrace.com> Co-authored-by: Simon Schrottner <simon.schrottner@dynatrace.com>
This commit is contained in:
parent
779e8f929a
commit
6a137967a2
|
|
@ -102,7 +102,7 @@ func parseSemverEvaluationData(values interface{}) (string, string, SemVerOperat
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(parsed) != 3 {
|
if len(parsed) != 3 {
|
||||||
return "", "", "", errors.New("sem_ver evaluation must contain a value, an operator and a comparison target")
|
return "", "", "", errors.New("sem_ver evaluation must contain a value, an operator, and a comparison target")
|
||||||
}
|
}
|
||||||
|
|
||||||
actualVersion, err := parseSemanticVersion(parsed[0])
|
actualVersion, err := parseSemanticVersion(parsed[0])
|
||||||
|
|
@ -122,11 +122,17 @@ func parseSemverEvaluationData(values interface{}) (string, string, SemVerOperat
|
||||||
return actualVersion, targetVersion, operator, nil
|
return actualVersion, targetVersion, operator, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseSemanticVersion(v interface{}) (string, error) {
|
func ensureString(v interface{}) string {
|
||||||
version, ok := v.(string)
|
if str, ok := v.(string); ok {
|
||||||
if !ok {
|
// It's already a string
|
||||||
return "", errors.New("sem_ver evaluation: property did not resolve to a string value")
|
return str
|
||||||
}
|
}
|
||||||
|
// Convert to string if not already
|
||||||
|
return fmt.Sprintf("%v", v)
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseSemanticVersion(v interface{}) (string, error) {
|
||||||
|
version := ensureString(v)
|
||||||
// version strings are only valid in the semver package if they start with a 'v'
|
// version strings are only valid in the semver package if they start with a 'v'
|
||||||
// if it's not present in the given value, we prepend it
|
// if it's not present in the given value, we prepend it
|
||||||
if !strings.HasPrefix(version, "v") {
|
if !strings.HasPrefix(version, "v") {
|
||||||
|
|
@ -134,7 +140,7 @@ func parseSemanticVersion(v interface{}) (string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if !semver.IsValid(version) {
|
if !semver.IsValid(version) {
|
||||||
return "", errors.New("not a valid semantic version string")
|
return "", fmt.Errorf("'%v' is not a valid semantic version string", version)
|
||||||
}
|
}
|
||||||
|
|
||||||
return version, nil
|
return version, nil
|
||||||
|
|
@ -143,7 +149,7 @@ func parseSemanticVersion(v interface{}) (string, error) {
|
||||||
func parseOperator(o interface{}) (SemVerOperator, error) {
|
func parseOperator(o interface{}) (SemVerOperator, error) {
|
||||||
operatorString, ok := o.(string)
|
operatorString, ok := o.(string)
|
||||||
if !ok {
|
if !ok {
|
||||||
return "", errors.New("could not parse operator")
|
return "", fmt.Errorf("could not parse operator '%v'", o)
|
||||||
}
|
}
|
||||||
|
|
||||||
return SemVerOperator(operatorString), nil
|
return SemVerOperator(operatorString), nil
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,76 @@ func TestSemVerOperator_Compare(t *testing.T) {
|
||||||
want bool
|
want bool
|
||||||
wantErr bool
|
wantErr bool
|
||||||
}{
|
}{
|
||||||
|
{
|
||||||
|
name: "invalid version",
|
||||||
|
svo: Greater,
|
||||||
|
args: args{
|
||||||
|
v1: "invalid",
|
||||||
|
v2: "v1.0.0",
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
wantErr: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "preview version vs non preview version",
|
||||||
|
svo: Greater,
|
||||||
|
args: args{
|
||||||
|
v1: "v1.0.0-preview.1.2",
|
||||||
|
v2: "v1.0.0",
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "preview version vs preview version",
|
||||||
|
svo: Greater,
|
||||||
|
args: args{
|
||||||
|
v1: "v1.0.0-preview.1.3",
|
||||||
|
v2: "v1.0.0-preview.1.2",
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no prefixed v left greater",
|
||||||
|
svo: Greater,
|
||||||
|
args: args{
|
||||||
|
v1: "0.0.1",
|
||||||
|
v2: "v0.0.2",
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no prefixed v right greater",
|
||||||
|
svo: Greater,
|
||||||
|
args: args{
|
||||||
|
v1: "v0.0.1",
|
||||||
|
v2: "0.0.2",
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no prefixed v right equals",
|
||||||
|
svo: Equals,
|
||||||
|
args: args{
|
||||||
|
v1: "v0.0.1",
|
||||||
|
v2: "0.0.1",
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no prefixed v both",
|
||||||
|
svo: Greater,
|
||||||
|
args: args{
|
||||||
|
v1: "0.0.1",
|
||||||
|
v2: "0.0.2",
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "invalid operator",
|
name: "invalid operator",
|
||||||
svo: "",
|
svo: "",
|
||||||
|
|
@ -33,6 +103,16 @@ func TestSemVerOperator_Compare(t *testing.T) {
|
||||||
want: false,
|
want: false,
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "less with large number",
|
||||||
|
svo: Less,
|
||||||
|
args: args{
|
||||||
|
v1: "v1234.0.1",
|
||||||
|
v2: "v1235.0.2",
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "less",
|
name: "less",
|
||||||
svo: Less,
|
svo: Less,
|
||||||
|
|
@ -43,6 +123,16 @@ func TestSemVerOperator_Compare(t *testing.T) {
|
||||||
want: true,
|
want: true,
|
||||||
wantErr: false,
|
wantErr: false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "no minor version",
|
||||||
|
svo: Less,
|
||||||
|
args: args{
|
||||||
|
v1: "v1.0",
|
||||||
|
v2: "v1.2",
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "not less",
|
name: "not less",
|
||||||
svo: Less,
|
svo: Less,
|
||||||
|
|
@ -206,13 +296,20 @@ func TestSemVerOperator_Compare(t *testing.T) {
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
got, err := tt.svo.compare(tt.args.v1, tt.args.v2)
|
var operatorInterface interface{} = string(tt.svo)
|
||||||
|
actualVersion, targetVersion, operator, err := parseSemverEvaluationData([]interface{}{tt.args.v1, operatorInterface, tt.args.v2})
|
||||||
|
if err != nil {
|
||||||
|
require.Truef(t, tt.wantErr, "Error parsing semver evaluation data. actualVersion: %s, targetVersion: %s, operator: %s, err: %s", actualVersion, targetVersion, operator, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
got, err := operator.compare(actualVersion, targetVersion)
|
||||||
|
|
||||||
if tt.wantErr {
|
if tt.wantErr {
|
||||||
require.NotNil(t, err)
|
require.NotNil(t, err)
|
||||||
} else {
|
} else {
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
require.Equalf(t, tt.want, got, "compare(%v, %v)", tt.args.v1, tt.args.v2)
|
require.Equalf(t, tt.want, got, "compare(%v, %v) operator: %s", tt.args.v1, tt.args.v2, operator)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -385,6 +482,130 @@ func TestJSONEvaluator_semVerEvaluation(t *testing.T) {
|
||||||
expectedValue: "#FF0000",
|
expectedValue: "#FF0000",
|
||||||
expectedReason: model.TargetingMatchReason,
|
expectedReason: model.TargetingMatchReason,
|
||||||
},
|
},
|
||||||
|
"versions given as double - match": {
|
||||||
|
flags: Flags{
|
||||||
|
Flags: map[string]model.Flag{
|
||||||
|
"headerColor": {
|
||||||
|
State: "ENABLED",
|
||||||
|
DefaultVariant: "red",
|
||||||
|
Variants: map[string]any{
|
||||||
|
"red": "#FF0000",
|
||||||
|
"blue": "#0000FF",
|
||||||
|
"green": "#00FF00",
|
||||||
|
"yellow": "#FFFF00",
|
||||||
|
},
|
||||||
|
Targeting: []byte(`{
|
||||||
|
"if": [
|
||||||
|
{
|
||||||
|
"sem_ver": [1.2, "=", "1.2"]
|
||||||
|
},
|
||||||
|
"red", "green"
|
||||||
|
]
|
||||||
|
}`),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
flagKey: "headerColor",
|
||||||
|
context: map[string]any{
|
||||||
|
"version": "1.0.0",
|
||||||
|
},
|
||||||
|
expectedVariant: "red",
|
||||||
|
expectedValue: "#FF0000",
|
||||||
|
expectedReason: model.TargetingMatchReason,
|
||||||
|
},
|
||||||
|
"versions given as int - match": {
|
||||||
|
flags: Flags{
|
||||||
|
Flags: map[string]model.Flag{
|
||||||
|
"headerColor": {
|
||||||
|
State: "ENABLED",
|
||||||
|
DefaultVariant: "red",
|
||||||
|
Variants: map[string]any{
|
||||||
|
"red": "#FF0000",
|
||||||
|
"blue": "#0000FF",
|
||||||
|
"green": "#00FF00",
|
||||||
|
"yellow": "#FFFF00",
|
||||||
|
},
|
||||||
|
Targeting: []byte(`{
|
||||||
|
"if": [
|
||||||
|
{
|
||||||
|
"sem_ver": [1, "=", "v1.0.0"]
|
||||||
|
},
|
||||||
|
"red", "green"
|
||||||
|
]
|
||||||
|
}`),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
flagKey: "headerColor",
|
||||||
|
context: map[string]any{
|
||||||
|
"version": "1.0.0",
|
||||||
|
},
|
||||||
|
expectedVariant: "red",
|
||||||
|
expectedValue: "#FF0000",
|
||||||
|
expectedReason: model.TargetingMatchReason,
|
||||||
|
},
|
||||||
|
"versions and minor-version without patch version operator provided - match": {
|
||||||
|
flags: Flags{
|
||||||
|
Flags: map[string]model.Flag{
|
||||||
|
"headerColor": {
|
||||||
|
State: "ENABLED",
|
||||||
|
DefaultVariant: "red",
|
||||||
|
Variants: map[string]any{
|
||||||
|
"red": "#FF0000",
|
||||||
|
"blue": "#0000FF",
|
||||||
|
"green": "#00FF00",
|
||||||
|
"yellow": "#FFFF00",
|
||||||
|
},
|
||||||
|
Targeting: []byte(`{
|
||||||
|
"if": [
|
||||||
|
{
|
||||||
|
"sem_ver": [1.2, "=", "1.2"]
|
||||||
|
},
|
||||||
|
"red", "green"
|
||||||
|
]
|
||||||
|
}`),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
flagKey: "headerColor",
|
||||||
|
context: map[string]any{
|
||||||
|
"version": "1.0.0",
|
||||||
|
},
|
||||||
|
expectedVariant: "red",
|
||||||
|
expectedValue: "#FF0000",
|
||||||
|
expectedReason: model.TargetingMatchReason,
|
||||||
|
},
|
||||||
|
"versions with prefixed v operator provided - match": {
|
||||||
|
flags: Flags{
|
||||||
|
Flags: map[string]model.Flag{
|
||||||
|
"headerColor": {
|
||||||
|
State: "ENABLED",
|
||||||
|
DefaultVariant: "red",
|
||||||
|
Variants: map[string]any{
|
||||||
|
"red": "#FF0000",
|
||||||
|
"blue": "#0000FF",
|
||||||
|
"green": "#00FF00",
|
||||||
|
"yellow": "#FFFF00",
|
||||||
|
},
|
||||||
|
Targeting: []byte(`{
|
||||||
|
"if": [
|
||||||
|
{
|
||||||
|
"sem_ver": [{"var": "version"}, "<", "v1.2"]
|
||||||
|
},
|
||||||
|
"red", "green"
|
||||||
|
]
|
||||||
|
}`),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
flagKey: "headerColor",
|
||||||
|
context: map[string]any{
|
||||||
|
"version": "v1.0.0",
|
||||||
|
},
|
||||||
|
expectedVariant: "red",
|
||||||
|
expectedValue: "#FF0000",
|
||||||
|
expectedReason: model.TargetingMatchReason,
|
||||||
|
},
|
||||||
"versions and major-version operator provided - no match": {
|
"versions and major-version operator provided - no match": {
|
||||||
flags: Flags{
|
flags: Flags{
|
||||||
Flags: map[string]model.Flag{
|
Flags: map[string]model.Flag{
|
||||||
|
|
|
||||||
|
|
@ -1,30 +1,30 @@
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
MIIFJTCCAw2gAwIBAgIUHkLmoT3U1jDYbXAqX84fjR/Qw5kwDQYJKoZIhvcNAQEL
|
MIIFJTCCAw2gAwIBAgIUKd5pSsJ6Fxr2f4vF2a+MOlQAvcowDQYJKoZIhvcNAQEL
|
||||||
BQAwITEfMB0GA1UEAwwWZmxhZ0QgdGVzdCBjZXJ0aWZpY2F0ZTAgFw0yNTAxMDgw
|
BQAwITEfMB0GA1UEAwwWZmxhZ0QgdGVzdCBjZXJ0aWZpY2F0ZTAgFw0yNTAzMTIx
|
||||||
OTI0MThaGA8yMDUyMDUyNTA5MjQxOFowITEfMB0GA1UEAwwWZmxhZ0QgdGVzdCBj
|
MjEzNDdaGA8yMDUyMDcyNzEyMTM0N1owITEfMB0GA1UEAwwWZmxhZ0QgdGVzdCBj
|
||||||
ZXJ0aWZpY2F0ZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQK8r5J
|
ZXJ0aWZpY2F0ZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALqvg928
|
||||||
7wOvdMsbGy63wlOie97lMHT/HSfneyTEnvRM4ZenKNjrKI6zlyYMQX9/RQs9qCxF
|
yzEpRGpbK/gQiVC/tH3CzrieP+QHDI9D0Hlzi8F2V9YxYbmGutewd3mkNiiaVfuo
|
||||||
QQDFMhLoMrQKkDptVur+PhYCa/uAWUtTFVXJMbJ2Zdzbg86WCgOlRLwMqGiwnu0l
|
Ue5HRYwhMBKiMhUByZc2a5wF/eftPE2Hj5rDFiOnW5duDERLMLjFE4lOwnuCZtNk
|
||||||
25dk5Ja5nE4HSSg5SipLxtCCdxT3n5YmQBO+Kkyc1Uxgk6yQMQcdQENGhQHazVzy
|
Ljt5FEd7Q6TbDfOW4ETxwdbQObS+neSXmqYrWQvdIvN4jKyHkiMqdMwGZp6AYYMz
|
||||||
fAsrutJFZNtkYXObR9t6/MyYgg3zFjNRCpOYhc9misT54TVteb9L0smLqMhVfQkh
|
FVEKEQ76xbNkTiMjhOfaCZklZp4D99DNIANtYcpf3+VRZcN4xkVe7+wP8ofioZ/M
|
||||||
CFWkVEWmaeGyTYAR7gGvFy9b7N/45FfBvlumgR7KiG/uLJNadCQtf7v3pRN36SBH
|
CwAQAW/2gq2eienTQ+XGHUZfig0JslinuTZy15wr+1lnYzNvJtK/30Z+pmhjkQBN
|
||||||
aZleAp8KWmy6N2IMuWx/hMQCVnzoi05gvYkCWJSoseobhiwaXsDFQCc8ZB/c2H9C
|
f2d0Be6Gf3RUTEFlXqysY1aDEbvW+8lSKyuLr/H73O1vGkhMfJ1A5dak+vwhk40g
|
||||||
yMmyKRL+c3RM7lI/InxLmpS94xJIhDuvDiEPYTWqY3BPqCvAly8LXEYBqgJNsnOa
|
8twYSJesDGjNNW/rxglSZcCA1sPu39gLC+FHZ3eTnur5JOwLvM7n0sn1Ztmkq//7
|
||||||
+pdoJQ/rl87pIdDt3CK/wWQ1GIlp1v7aYY53riM4i0Hvnk6SPNBgpUXbqAZjpnOb
|
eCY+ZDT/X39UwluMa9SFugdqfqOLpCCZtkMCLxjNoDLPmEqCHS5E2q3yrl6RzNlg
|
||||||
fsIrKGO/FAJ5Hc3mfiuTj15jDoxPPUPqzj4yP2h7WqbdYwEpDvTd0Cd+tjgCuQUj
|
yc78dRaChgTQbbS2EX0TXqCDnNpyuQAl9hwcMbh1Law0iNGuRircZW6v4Mkc6se0
|
||||||
JU2MpTcNUQQQFdXASZQgfXHOTW873zIx4mourcO7jkEDwId13H9QMU4JPG9ZsLG6
|
rpDmtGy9E/wrr2XGsD5KtjpVF2rUHXvpzoY+ioOtiOrDdnLBAwRyw8bIsynLlbpb
|
||||||
p08S26yx8G0chV/Q7BNVfOTCKAc8GH+94CynAgMBAAGjUzBRMB0GA1UdDgQWBBQs
|
F8K7H5b7x1RI8d9AAZohEl9c9iqMyvJnaZTrAgMBAAGjUzBRMB0GA1UdDgQWBBTj
|
||||||
ubjWSGXffy7mMQGV2EdbdUwtPjAfBgNVHSMEGDAWgBQsubjWSGXffy7mMQGV2Edb
|
lAwMUauC+x+73IzYJOxNnqJnMDAfBgNVHSMEGDAWgBTjlAwMUauC+x+73IzYJOxN
|
||||||
dUwtPjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQBwJyNT3ldS
|
nqJnMDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQBWGKra39+p
|
||||||
DsvOOFH5VT+yMByXv690FH7aYBu5VeSpd8oZPJZgzRh58fTzUxrnPk7iyuQzlgCw
|
WGpobGClcmlP+n5umtzOolFNTM5OyVmNaqWLtcigldFwpPFW7lhYIbbmxWSDpFto
|
||||||
ZZssvObDEA1eK9vG1svomY8yu8VrpKG/yl0YItnZpuQTvCfJsNOm1Qe0j8FPJVOu
|
DDkv1FuiEulo7C4TVEa6x/RsgCfOMR5WCsXOh65moSN86SFMPbnSuajpGuY5RfqH
|
||||||
Jgges3i+QV18o2dmtQKTTWdExu2J30eQgL8SB7hG9vE6tfcVkzCw6+5ev+fyO9kd
|
wxfAyd9/IO4aqwINQE0P4VNgqhOMJ66LmodPsGjXC2mkLDePV3sswka+dv1CtFWU
|
||||||
DxrN9YY/FKjNMY2WSCjbQ99NFNS3Qf0MFLLy+V3oiYlT1/qkuX9omLIL6qDabuXE
|
/9Zp7n0UwEga3JLw5RTnXswpA5lyIkRnda9m9ydL5A5uKe3tCwSEUOUGphjdi6Y0
|
||||||
8XbppIG+ku610hiVRd4ZZyTH1EIThqevs7y3zQYFQNDL8wPfYHRTl00Fto/NLcTH
|
ycAwsD1G7XwK60seZyX3MUMEo4CiH21WC3P2c8xRVl7TxQEj2m+NlQ3UArgIdl60
|
||||||
+cAhf5nC5R4PqvSJZ1IZkxUj/8oljUtMsbFKTekgJGnP/VzDFoNmYO6lW3rBFM1L
|
4FE7p+yorrXEi43fwLHFi17P7LGvnurp9H6Xs5YZPGkYwEOD6HxDpGHaYlvHArDe
|
||||||
ovFJhaesnAKQ6WFk+Yru9kFylX2dHqFsB0SlggGS+r8kwbrXlXJhWAE/WpPVyU+H
|
r2+pw/o8YJqP3E9YjVK5wby4v32DdBSGykyJTtXWj5JkwmILUzTE0skDk7fviiyO
|
||||||
IUyYluNLKKvMBYa9GqUC6C7XlZmiuemZy0oCy4gHqdmII09Bj3C3nT7+Ms4D21jh
|
F5nwMt37bSliU5p8mk9YzJNv+tTqRGEsOj3NjnjVX1BSDvuKeZfiLG08LRaQrhWa
|
||||||
fZKN4WZcpsA2XaE27XsAqJp2gIV+SL3VqD3hAOFIRWAwQVvTlVJ1GWM1DJBVnLpp
|
6ZU+BPtTi0JkeczEpreSNMPnKytGRkXQ3AXhkeQYLBoAbypzp0zzw6yJ6ADBbUZu
|
||||||
BFK4mO0Mga0AbzJ6VL9ElvXVjqwRl8gbeT7yHWQ8A0r7yl4n0i4FloDeoCmr7i9O
|
Kn3iuQR7nqpdnE7hNh21mO7tKGV0il4ePQUIeM+E3MJNW4KiSN5UV+Z9GxeQQudD
|
||||||
9dqUWaknNa6rIUKwvIodkn39C1G7uCpeLw==
|
zJCP+qbCnwOTm+ZDZOymqCoMILaWVL0/Qw==
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
|
|
|
||||||
|
|
@ -13,5 +13,5 @@ openssl req -x509 -newkey rsa:4096 -days 9999 -nodes -keyout ca-key.pem -out ca-
|
||||||
openssl req -newkey rsa:4096 -nodes -keyout server-key.pem -out server-req.pem -subj "/CN=flagD test server PR and CSR"
|
openssl req -newkey rsa:4096 -nodes -keyout server-key.pem -out server-req.pem -subj "/CN=flagD test server PR and CSR"
|
||||||
|
|
||||||
# 3. Use CA's private key to sign web server's CSR and get back the signed certificate
|
# 3. Use CA's private key to sign web server's CSR and get back the signed certificate
|
||||||
openssl x509 -req -in server-req.pem -days 60 -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile server-ext.cnf
|
openssl x509 -req -in server-req.pem -days 9999 -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile server-ext.cnf
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,29 +1,30 @@
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
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
|
||||||
7AWcs98UoJz2+7oLbA==
|
Gt8NwiEiFdgghTOOXLvhbXBaaj3SZHxRX39/ZYBB+CjH/AHihqsQ7jIWPV9vk/oU
|
||||||
|
Tli94kf5sC2bQveDRP6+Zybjb5uYDbDQmurD09c+Mw==
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
|
|
|
||||||
|
|
@ -1,52 +1,52 @@
|
||||||
-----BEGIN PRIVATE KEY-----
|
-----BEGIN PRIVATE KEY-----
|
||||||
MIIJRQIBADANBgkqhkiG9w0BAQEFAASCCS8wggkrAgEAAoICAQC38cZVWtUihF8l
|
MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDoF+Rcs5ztWsjs
|
||||||
QmmKE8ZG896s7KSqPoNDdqrzp0pebwbErHf/iVarUsl9IWuxxCeGOh65yRQfZH8z
|
zfCNp+1wYnMszM+qhcRzm/zHWPiTIjE5IWpchBUTI8CunFtuGrcJPDKK1D7W2chP
|
||||||
p39Yf6oAxgiF+sFITkoWrGwB5HbT6qRwUQC5kLytuY9THTJKcpyoUNTsR46Ne0ix
|
DBC9fDqq6BHroiU0V/AUG113ytcgt/R5Ab+0Y54d6WnHp5dk2BPFOOzxJKzYBKpS
|
||||||
+yM+55nI504tK4U8UdVnQkbnU0tnRlb4LOSA4emDYnCWsl814l1TNp4h1e7Sb8pp
|
J9JSv+Y/CmdiGWP4eCyFnGoxX051ET3WAZ/Ff55KwP5eHVa323WM8ctwRiBOQFb7
|
||||||
wDju07UQq92Kt4oSZIjHQXeJmOt4vko4c8rv3xfUA12cPSajUEw7oiohwd50LKtI
|
b+pIduuxeWH0ZJUbaHdSDfQVEYyC4vGD7tTCqnJa9cYbu+HjFqCX6fyUsOBOrGjs
|
||||||
m4MyG3jisTvie46xIGHD9AJ0AejuwsSSrAUhZ6S+fVwFVdzPpo9CSKjjrz0fw6Fk
|
gH19/2oJHqLQiE3jFQL7kttw3UzIghuAVsa4ghPDt9v+ycIWlBSaVqGX3J1LU2Tq
|
||||||
SeN3Kc61ipYKHf44dsZZB/IQB8CMpLk3cotktu8lwyTDb9URAg0cPpBLZl7PFY4L
|
c+nwjU7MAxjDTeIW3qBza2ApKdtO5fwLCKRDUBzfKsZaf37vaVgM5u4Vw4mH24Sl
|
||||||
gMZrIwsUy5CZbcmkzPRqNVfmfKMCy8D/CNV7jhxSj8FxD8zcTn63lrbmMoAIZtDZ
|
fLnj2/Uu2CD2RoRuTjxlULwMx3QhH5AY4uH8GCut3KCE64rvkgT1rFnzfG6vZMRb
|
||||||
KBqpzRqVkawxVGPjvn4wXVi/CJC5o04l9bWpXJaGLgS0SVtLT8IzyWYPXYLadMY7
|
TrnyiV+EjbTMxR0HS6PmW/vuuQuNjZnXDhDF87vaaWxq/E0IfxGmRzJGgBCX9K1o
|
||||||
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
|
||||||
aFIhPf94JnJUQ/J9xwe2MvBIGtpAERp2gw==
|
8zybxf+aKen3eqefu4M/U0ah67PPDA==
|
||||||
-----END PRIVATE KEY-----
|
-----END PRIVATE KEY-----
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue