cfssl_signer_test.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /*
  2. Copyright 2017 The Kubernetes Authors.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package signer
  14. import (
  15. "crypto/x509"
  16. "io/ioutil"
  17. "reflect"
  18. "strings"
  19. "testing"
  20. "time"
  21. capi "k8s.io/api/certificates/v1beta1"
  22. "k8s.io/client-go/util/cert"
  23. )
  24. func TestSigner(t *testing.T) {
  25. testNow := time.Now()
  26. testNowFn := func() time.Time {
  27. return testNow
  28. }
  29. s, err := newCFSSLSigner("./testdata/ca.crt", "./testdata/ca.key", nil, 1*time.Hour)
  30. if err != nil {
  31. t.Fatalf("failed to create signer: %v", err)
  32. }
  33. s.nowFn = testNowFn
  34. csrb, err := ioutil.ReadFile("./testdata/kubelet.csr")
  35. if err != nil {
  36. t.Fatalf("failed to read CSR: %v", err)
  37. }
  38. csr := &capi.CertificateSigningRequest{
  39. Spec: capi.CertificateSigningRequestSpec{
  40. Request: []byte(csrb),
  41. Usages: []capi.KeyUsage{
  42. capi.UsageSigning,
  43. capi.UsageKeyEncipherment,
  44. capi.UsageServerAuth,
  45. capi.UsageClientAuth,
  46. },
  47. },
  48. }
  49. csr, err = s.sign(csr)
  50. if err != nil {
  51. t.Fatalf("failed to sign CSR: %v", err)
  52. }
  53. certData := csr.Status.Certificate
  54. if len(certData) == 0 {
  55. t.Fatalf("expected a certificate after signing")
  56. }
  57. certs, err := cert.ParseCertsPEM(certData)
  58. if err != nil {
  59. t.Fatalf("failed to parse certificate: %v", err)
  60. }
  61. if len(certs) != 1 {
  62. t.Fatalf("expected one certificate")
  63. }
  64. crt := certs[0]
  65. if crt.Subject.CommonName != "system:node:k-a-node-s36b" {
  66. t.Errorf("expected common name of 'system:node:k-a-node-s36b', but got: %v", certs[0].Subject.CommonName)
  67. }
  68. if !reflect.DeepEqual(crt.Subject.Organization, []string{"system:nodes"}) {
  69. t.Errorf("expected organization to be [system:nodes] but got: %v", crt.Subject.Organization)
  70. }
  71. if crt.KeyUsage != x509.KeyUsageDigitalSignature|x509.KeyUsageKeyEncipherment {
  72. t.Errorf("bad key usage")
  73. }
  74. if !reflect.DeepEqual(crt.ExtKeyUsage, []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth}) {
  75. t.Errorf("bad extended key usage")
  76. }
  77. expectedTime := testNow.Add(1 * time.Hour)
  78. // there is some jitter that we need to tolerate
  79. diff := expectedTime.Sub(crt.NotAfter)
  80. if diff > 10*time.Minute || diff < -10*time.Minute {
  81. t.Fatal(crt.NotAfter)
  82. }
  83. }
  84. func TestSignerExpired(t *testing.T) {
  85. hundredYearsFromNowFn := func() time.Time {
  86. return time.Now().Add(24 * time.Hour * 365 * 100)
  87. }
  88. s, err := newCFSSLSigner("./testdata/ca.crt", "./testdata/ca.key", nil, 1*time.Hour)
  89. if err != nil {
  90. t.Fatalf("failed to create signer: %v", err)
  91. }
  92. s.nowFn = hundredYearsFromNowFn
  93. csrb, err := ioutil.ReadFile("./testdata/kubelet.csr")
  94. if err != nil {
  95. t.Fatalf("failed to read CSR: %v", err)
  96. }
  97. csr := &capi.CertificateSigningRequest{
  98. Spec: capi.CertificateSigningRequestSpec{
  99. Request: []byte(csrb),
  100. Usages: []capi.KeyUsage{
  101. capi.UsageSigning,
  102. capi.UsageKeyEncipherment,
  103. capi.UsageServerAuth,
  104. capi.UsageClientAuth,
  105. },
  106. },
  107. }
  108. _, err = s.sign(csr)
  109. if err == nil {
  110. t.Fatal("missing error")
  111. }
  112. if !strings.HasPrefix(err.Error(), "the signer has expired") {
  113. t.Fatal(err)
  114. }
  115. }
  116. func TestDurationLongerThanExpiry(t *testing.T) {
  117. testNow := time.Now()
  118. testNowFn := func() time.Time {
  119. return testNow
  120. }
  121. hundredYears := 24 * time.Hour * 365 * 100
  122. s, err := newCFSSLSigner("./testdata/ca.crt", "./testdata/ca.key", nil, hundredYears)
  123. if err != nil {
  124. t.Fatalf("failed to create signer: %v", err)
  125. }
  126. s.nowFn = testNowFn
  127. csrb, err := ioutil.ReadFile("./testdata/kubelet.csr")
  128. if err != nil {
  129. t.Fatalf("failed to read CSR: %v", err)
  130. }
  131. csr := &capi.CertificateSigningRequest{
  132. Spec: capi.CertificateSigningRequestSpec{
  133. Request: []byte(csrb),
  134. Usages: []capi.KeyUsage{
  135. capi.UsageSigning,
  136. capi.UsageKeyEncipherment,
  137. capi.UsageServerAuth,
  138. capi.UsageClientAuth,
  139. },
  140. },
  141. }
  142. _, err = s.sign(csr)
  143. if err != nil {
  144. t.Fatalf("failed to sign CSR: %v", err)
  145. }
  146. // now we just need to verify that the expiry is based on the signing cert
  147. certData := csr.Status.Certificate
  148. if len(certData) == 0 {
  149. t.Fatalf("expected a certificate after signing")
  150. }
  151. certs, err := cert.ParseCertsPEM(certData)
  152. if err != nil {
  153. t.Fatalf("failed to parse certificate: %v", err)
  154. }
  155. if len(certs) != 1 {
  156. t.Fatalf("expected one certificate")
  157. }
  158. crt := certs[0]
  159. expected, err := time.Parse("2006-01-02 15:04:05.999999999 -0700 MST", "2044-05-09 00:20:11 +0000 UTC")
  160. if err != nil {
  161. t.Fatal(err)
  162. }
  163. // there is some jitter that we need to tolerate
  164. diff := expected.Sub(crt.NotAfter)
  165. if diff > 10*time.Minute || diff < -10*time.Minute {
  166. t.Fatal(crt.NotAfter)
  167. }
  168. }