mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 20:53:33 +00:00
Merge pull request #101959 from lunhuijie/run-test5
Add test cases to the LoadClientConfig function
This commit is contained in:
commit
4eda493658
@ -19,6 +19,7 @@ package bootstrap
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
@ -34,9 +35,254 @@ import (
|
|||||||
certificatesclient "k8s.io/client-go/kubernetes/typed/certificates/v1beta1"
|
certificatesclient "k8s.io/client-go/kubernetes/typed/certificates/v1beta1"
|
||||||
restclient "k8s.io/client-go/rest"
|
restclient "k8s.io/client-go/rest"
|
||||||
clienttesting "k8s.io/client-go/testing"
|
clienttesting "k8s.io/client-go/testing"
|
||||||
|
"k8s.io/client-go/util/certificate"
|
||||||
"k8s.io/client-go/util/keyutil"
|
"k8s.io/client-go/util/keyutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func copyFile(src, dst string) (err error) {
|
||||||
|
in, err := os.Open(src)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer in.Close()
|
||||||
|
out, err := os.Create(dst)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
cerr := out.Close()
|
||||||
|
if err == nil {
|
||||||
|
err = cerr
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
_, err = io.Copy(out, in)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLoadClientConfig(t *testing.T) {
|
||||||
|
//Create a temporary folder under tmp to store the required certificate files and configuration files.
|
||||||
|
fileDir := t.TempDir()
|
||||||
|
//Copy the required certificate file to the temporary directory.
|
||||||
|
copyFile("./testdata/mycertinvalid.crt", fileDir+"/mycertinvalid.crt")
|
||||||
|
copyFile("./testdata/mycertvalid.crt", fileDir+"/mycertvalid.crt")
|
||||||
|
copyFile("./testdata/mycertinvalid.key", fileDir+"/mycertinvalid.key")
|
||||||
|
copyFile("./testdata/mycertvalid.key", fileDir+"/mycertvalid.key")
|
||||||
|
testDataValid := []byte(`
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Config
|
||||||
|
clusters:
|
||||||
|
- cluster:
|
||||||
|
certificate-authority: ca-a.crt
|
||||||
|
server: https://cluster-a.com
|
||||||
|
name: cluster-a
|
||||||
|
- cluster:
|
||||||
|
server: https://cluster-b.com
|
||||||
|
name: cluster-b
|
||||||
|
contexts:
|
||||||
|
- context:
|
||||||
|
cluster: cluster-a
|
||||||
|
namespace: ns-a
|
||||||
|
user: user-a
|
||||||
|
name: context-a
|
||||||
|
- context:
|
||||||
|
cluster: cluster-b
|
||||||
|
namespace: ns-b
|
||||||
|
user: user-b
|
||||||
|
name: context-b
|
||||||
|
current-context: context-b
|
||||||
|
users:
|
||||||
|
- name: user-a
|
||||||
|
user:
|
||||||
|
client-certificate: mycertvalid.crt
|
||||||
|
client-key: mycertvalid.key
|
||||||
|
- name: user-b
|
||||||
|
user:
|
||||||
|
client-certificate: mycertvalid.crt
|
||||||
|
client-key: mycertvalid.key
|
||||||
|
|
||||||
|
`)
|
||||||
|
filevalid, err := ioutil.TempFile(fileDir, "kubeconfigvalid")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
ioutil.WriteFile(filevalid.Name(), testDataValid, os.FileMode(0755))
|
||||||
|
|
||||||
|
testDataInvalid := []byte(`
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Config
|
||||||
|
clusters:
|
||||||
|
- cluster:
|
||||||
|
certificate-authority: ca-a.crt
|
||||||
|
server: https://cluster-a.com
|
||||||
|
name: cluster-a
|
||||||
|
- cluster:
|
||||||
|
server: https://cluster-b.com
|
||||||
|
name: cluster-b
|
||||||
|
contexts:
|
||||||
|
- context:
|
||||||
|
cluster: cluster-a
|
||||||
|
namespace: ns-a
|
||||||
|
user: user-a
|
||||||
|
name: context-a
|
||||||
|
- context:
|
||||||
|
cluster: cluster-b
|
||||||
|
namespace: ns-b
|
||||||
|
user: user-b
|
||||||
|
name: context-b
|
||||||
|
current-context: context-b
|
||||||
|
users:
|
||||||
|
- name: user-a
|
||||||
|
user:
|
||||||
|
client-certificate: mycertinvalid.crt
|
||||||
|
client-key: mycertinvalid.key
|
||||||
|
- name: user-b
|
||||||
|
user:
|
||||||
|
client-certificate: mycertinvalid.crt
|
||||||
|
client-key: mycertinvalid.key
|
||||||
|
|
||||||
|
`)
|
||||||
|
fileinvalid, err := ioutil.TempFile(fileDir, "kubeconfiginvalid")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
ioutil.WriteFile(fileinvalid.Name(), testDataInvalid, os.FileMode(0755))
|
||||||
|
|
||||||
|
testDatabootstrap := []byte(`
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Config
|
||||||
|
clusters:
|
||||||
|
- cluster:
|
||||||
|
certificate-authority: ca-a.crt
|
||||||
|
server: https://cluster-a.com
|
||||||
|
name: cluster-a
|
||||||
|
- cluster:
|
||||||
|
server: https://cluster-b.com
|
||||||
|
name: cluster-b
|
||||||
|
contexts:
|
||||||
|
- context:
|
||||||
|
cluster: cluster-a
|
||||||
|
namespace: ns-a
|
||||||
|
user: user-a
|
||||||
|
name: context-a
|
||||||
|
- context:
|
||||||
|
cluster: cluster-b
|
||||||
|
namespace: ns-b
|
||||||
|
user: user-b
|
||||||
|
name: context-b
|
||||||
|
current-context: context-b
|
||||||
|
users:
|
||||||
|
- name: user-a
|
||||||
|
user:
|
||||||
|
token: mytoken-b
|
||||||
|
- name: user-b
|
||||||
|
user:
|
||||||
|
token: mytoken-b
|
||||||
|
`)
|
||||||
|
fileboot, err := ioutil.TempFile(fileDir, "kubeconfig")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
ioutil.WriteFile(fileboot.Name(), testDatabootstrap, os.FileMode(0755))
|
||||||
|
|
||||||
|
dir, err := ioutil.TempDir(fileDir, "k8s-test-certstore-current")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Unable to create the test directory %q: %v", dir, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
store, err := certificate.NewFileStore("kubelet-client", dir, dir, "", "")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("unable to build bootstrap cert store")
|
||||||
|
}
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
kubeconfigPath string
|
||||||
|
bootstrapPath string
|
||||||
|
certDir string
|
||||||
|
expectedCertConfig *restclient.Config
|
||||||
|
expectedClientConfig *restclient.Config
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "bootstrapPath is empty",
|
||||||
|
kubeconfigPath: filevalid.Name(),
|
||||||
|
bootstrapPath: "",
|
||||||
|
certDir: dir,
|
||||||
|
expectedCertConfig: &restclient.Config{
|
||||||
|
Host: "https://cluster-b.com",
|
||||||
|
TLSClientConfig: restclient.TLSClientConfig{
|
||||||
|
CertFile: fileDir + "/mycertvalid.crt",
|
||||||
|
KeyFile: fileDir + "/mycertvalid.key",
|
||||||
|
},
|
||||||
|
BearerToken: "",
|
||||||
|
},
|
||||||
|
expectedClientConfig: &restclient.Config{
|
||||||
|
Host: "https://cluster-b.com",
|
||||||
|
TLSClientConfig: restclient.TLSClientConfig{
|
||||||
|
CertFile: fileDir + "/mycertvalid.crt",
|
||||||
|
KeyFile: fileDir + "/mycertvalid.key",
|
||||||
|
},
|
||||||
|
BearerToken: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "bootstrap path is set and the contents of kubeconfigPath are valid",
|
||||||
|
kubeconfigPath: filevalid.Name(),
|
||||||
|
bootstrapPath: fileboot.Name(),
|
||||||
|
certDir: dir,
|
||||||
|
expectedCertConfig: &restclient.Config{
|
||||||
|
Host: "https://cluster-b.com",
|
||||||
|
TLSClientConfig: restclient.TLSClientConfig{
|
||||||
|
CertFile: fileDir + "/mycertvalid.crt",
|
||||||
|
KeyFile: fileDir + "/mycertvalid.key",
|
||||||
|
},
|
||||||
|
BearerToken: "",
|
||||||
|
},
|
||||||
|
expectedClientConfig: &restclient.Config{
|
||||||
|
Host: "https://cluster-b.com",
|
||||||
|
TLSClientConfig: restclient.TLSClientConfig{
|
||||||
|
CertFile: fileDir + "/mycertvalid.crt",
|
||||||
|
KeyFile: fileDir + "/mycertvalid.key",
|
||||||
|
},
|
||||||
|
BearerToken: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "bootstrap path is set and the contents of kubeconfigPath are not valid",
|
||||||
|
kubeconfigPath: fileinvalid.Name(),
|
||||||
|
bootstrapPath: fileboot.Name(),
|
||||||
|
certDir: dir,
|
||||||
|
expectedCertConfig: &restclient.Config{
|
||||||
|
Host: "https://cluster-b.com",
|
||||||
|
TLSClientConfig: restclient.TLSClientConfig{},
|
||||||
|
BearerToken: "mytoken-b",
|
||||||
|
},
|
||||||
|
expectedClientConfig: &restclient.Config{
|
||||||
|
Host: "https://cluster-b.com",
|
||||||
|
TLSClientConfig: restclient.TLSClientConfig{
|
||||||
|
CertFile: store.CurrentPath(),
|
||||||
|
KeyFile: store.CurrentPath(),
|
||||||
|
},
|
||||||
|
BearerToken: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
certConfig, clientConfig, err := LoadClientConfig(test.kubeconfigPath, test.bootstrapPath, test.certDir)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(certConfig, test.expectedCertConfig) {
|
||||||
|
t.Errorf("Unexpected certConfig: %s", diff.ObjectDiff(certConfig, test.expectedCertConfig))
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(clientConfig, test.expectedClientConfig) {
|
||||||
|
t.Errorf("Unexpected clientConfig: %s", diff.ObjectDiff(clientConfig, test.expectedClientConfig))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestLoadRESTClientConfig(t *testing.T) {
|
func TestLoadRESTClientConfig(t *testing.T) {
|
||||||
testData := []byte(`
|
testData := []byte(`
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
|
17
pkg/kubelet/certificate/bootstrap/testdata/README.md
vendored
Normal file
17
pkg/kubelet/certificate/bootstrap/testdata/README.md
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
Keys in this directory are generated for testing purposes only.
|
||||||
|
|
||||||
|
In this pr validCert(mycertvalid.crt):
|
||||||
|
```
|
||||||
|
Validity
|
||||||
|
Not Before: Apr 26 23:26:52 2017 GMT
|
||||||
|
Not After : Apr 2 23:26:52 2117 GMT
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
InvalidCert(mycertinvalid.crt):
|
||||||
|
```
|
||||||
|
Validity
|
||||||
|
Not Before: Dec 16 06:46:25 2014 GMT
|
||||||
|
Not After : Dec 16 06:46:25 2015 GMT
|
||||||
|
```
|
17
pkg/kubelet/certificate/bootstrap/testdata/mycertinvalid.crt
vendored
Normal file
17
pkg/kubelet/certificate/bootstrap/testdata/mycertinvalid.crt
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIICpzCCAY8CCQDWu9ClTyE4ADANBgkqhkiG9w0BAQUFADAXMRUwEwYDVQQDDAwi
|
||||||
|
a3ViZXJuZXRlcyIwHhcNMTQxMjE2MDY0NjI1WhcNMTUxMjE2MDY0NjI1WjAUMRIw
|
||||||
|
EAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
|
||||||
|
AQCogtUXHT0lvympI8FUU+wxjueCDQmNPtVuaW0LQ0tH1oQwAB7NuFUgPBZsiN8o
|
||||||
|
tI3P6EeuBM5nJwy1cP3x630ac1CIqb6zgmRsle15BYRfyVlIXfLYjjcCcMgfRIa/
|
||||||
|
FFKAnX46fzL9I3re7ZntTv4XBp6dYm2zEIPureqgpJ369ewBNQ9T5wI+jg+EVryO
|
||||||
|
dRFTaihW6Ukz82djEY9HqHHDg0YbiAa918ipPZ4YECDPH2fX1grVxO1AqveTkw2i
|
||||||
|
LI/I7aqy4yqZCB1ar1wnrVzqNR0LcOFupFHj5WberwCao1yDd4C/yEK5tre6sq4v
|
||||||
|
hwF2II8NFVY7GFQP/V/V5ET7AgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAC891nLG
|
||||||
|
CiggNRJPOS5rKhUBQa3uCgmsCTuwSf/bSrBMzfTkK5fQsqWvMks+ILYv4q6yGWYj
|
||||||
|
eqCeNPetbRDTKAtfyI+J9rKGfmvP/cWMK1TVB7OFYGb31Ra6w05Cg9ngCPHvelBh
|
||||||
|
0t4flVjTBv5MaVYpHQlRB+cQre2prd7qkd3hVHrO3Wf1I3VtqYaXQxyleVHq5FBD
|
||||||
|
O2zFL2Y1zBb6SUmtK0C1CcUG5rUsasal3FvFkWqeqeN+EkP/7RvMDo4S5JOxbWQp
|
||||||
|
OoebfirEQcUhz1duIb5th6UKhsJminFozHo0hRwenvhL5Q5sDiXn+1pcolj1gBzm
|
||||||
|
Ivob4OleMUcIGTg=
|
||||||
|
-----END CERTIFICATE-----
|
27
pkg/kubelet/certificate/bootstrap/testdata/mycertinvalid.key
vendored
Normal file
27
pkg/kubelet/certificate/bootstrap/testdata/mycertinvalid.key
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEpQIBAAKCAQEAqILVFx09Jb8pqSPBVFPsMY7ngg0JjT7VbmltC0NLR9aEMAAe
|
||||||
|
zbhVIDwWbIjfKLSNz+hHrgTOZycMtXD98et9GnNQiKm+s4JkbJXteQWEX8lZSF3y
|
||||||
|
2I43AnDIH0SGvxRSgJ1+On8y/SN63u2Z7U7+FwaenWJtsxCD7q3qoKSd+vXsATUP
|
||||||
|
U+cCPo4PhFa8jnURU2ooVulJM/NnYxGPR6hxw4NGG4gGvdfIqT2eGBAgzx9n19YK
|
||||||
|
1cTtQKr3k5MNoiyPyO2qsuMqmQgdWq9cJ61c6jUdC3DhbqRR4+Vm3q8AmqNcg3eA
|
||||||
|
v8hCuba3urKuL4cBdiCPDRVWOxhUD/1f1eRE+wIDAQABAoIBAQCGv4gSYakh5Ak2
|
||||||
|
XYcdHbbDslhh4HcA4XvePKOb3AX4vgsaLx5ytrIrgqETzSdV73tvA3k+KE28ordA
|
||||||
|
58fJiduSKR//CG2cMeqIAiPRIJ5H0kR439dvX9mRNApzJmLxrRiEDGyB7nEhhxub
|
||||||
|
5DewUfhRBVQU2j6Kb+xwEdaK+tfxcyVCKnloAh2PwBoSXcpK41ii0fvDzPwEuTqc
|
||||||
|
LexUxEV2Z9ClxQ2sJ2MLE7x57TQK0Earrph/ew/MDSYfKnay1B5vcXPX8rAiQJdP
|
||||||
|
Rc0BgeXV+j5pH+s5zOFMJRXrvI/9m+trr8MCYDrKooyFkk2cmsrxz3HvmJ3+t52s
|
||||||
|
jSXd7RKBAoGBANH0eap41oDo4P9ZF/ngAu7l1Yu5Vk6vB7wGJhekavv6dl+lYpw1
|
||||||
|
wUlKv32ZHmah8LvrRdyALHQRJ19V6NJiHlVwiJEEyXQWUsJTmvsvb7idEeU861iw
|
||||||
|
0bFelJlW7GLCIH/02enWKwMH6oR50Wa1xTbI3CtizbEoWCTnSK5iC1HbAoGBAM13
|
||||||
|
kR8vNHhgWKv/AgIYKFrPJjMXmKBfv/jUyKUfcQi9kIZMdaYpN5yPKZIkBIFOVHbG
|
||||||
|
suH4/7cVA3ZCfQljY6PGLfZu7QPupvd5KrEbBuKGuIdxrUk6mmLjLEXhoYSAeaw/
|
||||||
|
OsYKsGHdhWRstCB4R58jqpVcAr1pytxbx1oBxRNhAoGBAKv/pQBz1/5pSZHGsi6h
|
||||||
|
RqXhoYzCu6LgHuz4+JHbv01IRVtbyKoCG6NoWfGR0+bueaHpPyVB16kKOIAQiBh6
|
||||||
|
CzGhbC+phUPV2dya01c96D+MZZGv03mn+VFeE0x/ek35jNhmhXLcYgYsoQIALfz/
|
||||||
|
ol2cNUpRugKM85Df7Jn3diCLAoGAS8xNRDTU5Yedjq3/nqgs0vtSe0y8KIXKO1C8
|
||||||
|
SHYl6/SKyZCRYmAYPPBvhJM2+kDcVgkNWuHR7EebRFhY6kq5KmTk9eGMHIRBIlCX
|
||||||
|
2EhBLPZIQudD5xzwcYSfA5SuUkRXHp0g4Ih281OWbyrO9J+KxIGS35DXDetmRA6z
|
||||||
|
p1e5zWECgYEAulYIXb4tV8zKxJ+5/lLzeOZxzrvLMWv5YLlygjt5HWtCLl9B02Q7
|
||||||
|
+zGcMi9O5ASN1cuf5hiQNDvMOQnD5Pywe8/i8zP3QLVDcnlOY83n2Gl3Huh6w3O5
|
||||||
|
l+hvRO3LAm0VZSFaJE8WBm45vm09vR0X+69pkcSl/cfyVHygMmhaZSs=
|
||||||
|
-----END RSA PRIVATE KEY-----
|
15
pkg/kubelet/certificate/bootstrap/testdata/mycertvalid.crt
vendored
Normal file
15
pkg/kubelet/certificate/bootstrap/testdata/mycertvalid.crt
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIICRzCCAfGgAwIBAgIJALMb7ecMIk3MMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNV
|
||||||
|
BAYTAkdCMQ8wDQYDVQQIDAZMb25kb24xDzANBgNVBAcMBkxvbmRvbjEYMBYGA1UE
|
||||||
|
CgwPR2xvYmFsIFNlY3VyaXR5MRYwFAYDVQQLDA1JVCBEZXBhcnRtZW50MRswGQYD
|
||||||
|
VQQDDBJ0ZXN0LWNlcnRpZmljYXRlLTAwIBcNMTcwNDI2MjMyNjUyWhgPMjExNzA0
|
||||||
|
MDIyMzI2NTJaMH4xCzAJBgNVBAYTAkdCMQ8wDQYDVQQIDAZMb25kb24xDzANBgNV
|
||||||
|
BAcMBkxvbmRvbjEYMBYGA1UECgwPR2xvYmFsIFNlY3VyaXR5MRYwFAYDVQQLDA1J
|
||||||
|
VCBEZXBhcnRtZW50MRswGQYDVQQDDBJ0ZXN0LWNlcnRpZmljYXRlLTAwXDANBgkq
|
||||||
|
hkiG9w0BAQEFAANLADBIAkEAtBMa7NWpv3BVlKTCPGO/LEsguKqWHBtKzweMY2CV
|
||||||
|
tAL1rQm913huhxF9w+ai76KQ3MHK5IVnLJjYYA5MzP2H5QIDAQABo1AwTjAdBgNV
|
||||||
|
HQ4EFgQU22iy8aWkNSxv0nBxFxerfsvnZVMwHwYDVR0jBBgwFoAU22iy8aWkNSxv
|
||||||
|
0nBxFxerfsvnZVMwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAANBAEOefGbV
|
||||||
|
NcHxklaW06w6OBYJPwpIhCVozC1qdxGX1dg8VkEKzjOzjgqVD30m59OFmSlBmHsl
|
||||||
|
nkVA6wyOSDYBf3o=
|
||||||
|
-----END CERTIFICATE-----
|
10
pkg/kubelet/certificate/bootstrap/testdata/mycertvalid.key
vendored
Normal file
10
pkg/kubelet/certificate/bootstrap/testdata/mycertvalid.key
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEAtBMa7NWpv3BVlKTC
|
||||||
|
PGO/LEsguKqWHBtKzweMY2CVtAL1rQm913huhxF9w+ai76KQ3MHK5IVnLJjYYA5M
|
||||||
|
zP2H5QIDAQABAkAS9BfXab3OKpK3bIgNNyp+DQJKrZnTJ4Q+OjsqkpXvNltPJosf
|
||||||
|
G8GsiKu/vAt4HGqI3eU77NvRI+mL4MnHRmXBAiEA3qM4FAtKSRBbcJzPxxLEUSwg
|
||||||
|
XSCcosCktbkXvpYrS30CIQDPDxgqlwDEJQ0uKuHkZI38/SPWWqfUmkecwlbpXABK
|
||||||
|
iQIgZX08DA8VfvcA5/Xj1Zjdey9FVY6POLXen6RPiabE97UCICp6eUW7ht+2jjar
|
||||||
|
e35EltCRCjoejRHTuN9TC0uCoVipAiAXaJIx/Q47vGwiw6Y8KXsNU6y54gTbOSxX
|
||||||
|
54LzHNk/+Q==
|
||||||
|
-----END RSA PRIVATE KEY-----
|
Loading…
Reference in New Issue
Block a user