25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 
 
 

179 satır
6.0 KiB

  1. /* Copyright (c) 2017, Google Inc.
  2. *
  3. * Permission to use, copy, modify, and/or distribute this software for any
  4. * purpose with or without fee is hereby granted, provided that the above
  5. * copyright notice and this permission notice appear in all copies.
  6. *
  7. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  8. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  9. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
  10. * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  11. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  12. * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  13. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
  14. // make_many_constraints.go generates test certificates many_constraints.pem,
  15. // many_names*.pem, and some_names*.pem for x509_test.cc
  16. package main
  17. import (
  18. "crypto/rand"
  19. "crypto/rsa"
  20. "crypto/x509"
  21. "crypto/x509/pkix"
  22. "encoding/asn1"
  23. "encoding/pem"
  24. "fmt"
  25. "math/big"
  26. "os"
  27. "time"
  28. )
  29. const privateKeyPEM = `-----BEGIN PRIVATE KEY-----
  30. MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC6C9qEGRIBQXV8
  31. Lj29vVu+U+tyXzSSinWIumK5ijPhCm3DLnv4RayxkFwemtnkGRZ/o94ZnsXkBfU/
  32. IlsYdkuq8wK9WI/ql3gwWjH+KARIhIQcSLGiJcLN6kGuG2nlRBKMcPgPiEq2B0yB
  33. XFf4tG3CBbeae7+8G7uvOmv8NLyKj32neWpnUCTL5o2VwyPoxjLxT5gUR69v9XSV
  34. Fj2irCZbsEedeKSb++LqyMhLfnRTzNv+ZHNh4izZHrktR25MvnT5QyBq32hx7AjZ
  35. 2/xo70OmH7w10a2DwsVjJNMdxTEmgyvU9M6CeYRPX1Ykfg+sXCTtkTVAlBDUviIq
  36. Y95CKy25AgMBAAECggEAHPvvxRiqx2tNRFVn5QF1I4erbJwMcrADc5OmAcXYIz0e
  37. sIOzaJBiQR9+Wn5BZ9nIuYXr+g3UQpvzAyz1CDCVxUIqsRj1AtUqMk4675+IW0vZ
  38. 0RY6Jkq/uJjANsGqk78xLJQE8VaIXSdx8c1THznsx4dgfT6+Ni4T5U6yuA33OZaw
  39. 4NdYZYtEkqNiqK6VYe4mAxxVh5qscihVVMGkBVqJNiiEotctm1lph8ow+7o8ggXO
  40. W9xm+RHHPcH7Epx7hjkb/helANcYOK950W5/R+2zWV9R6kxo6R+/hfGFFmCvl4k5
  41. +i8Y0IlEv3fze1E0Lwyf379i3C/cKcuaE5gwR54BAQKBgQDxlsNy9M37HgguglHt
  42. 8W+cuPNtxNjFCWIjNR9dSvdr1Oi28Z1AY+BBPSv6UBKnT5PpOFjqxfMY/j/zoKdI
  43. aYX1phgeQHXcHrB1pS8yoaF/pTJSN2Yb8v9kl/Ch1yeYXaNVGmeBLkH9H6wIcUxD
  44. Mas1i8VUzshzhcluCNGoJj9wUQKBgQDFJOoWncssfWCrsuDWEoeU71Zh3+bD96GF
  45. s29CdIbHpcbxhWYjA9RM8yxbGPopexzoGcV1HX6j8E1s0xfYZJV23rxoM9Zj9l5D
  46. mZAJQPxYXIdu3h4PslhZLd3p+DEHjbsLC/avk3M4iZim1FMPBJMswKSL23ysqXoY
  47. /ynor+W06QKBgHYeu6M6NHgCYAe1ai+Hq4WaHFNgOohkJRqHv7USkVSkvb+s9LDl
  48. 5GChcx4pBmXNj8ko5rirXkerEEOjGgdaqMfJlOM9qyKb0rVCtYfw5RCPCcKPGZqy
  49. vdJGQ74tf0uNBO34QgE0R8lmMevS0XHNGCPPGgV0MSfikvD82N15De1xAoGAbsZM
  50. RsMJfAlDPZc4oPEuf/BwMHTYPTsy5map2MSTSzGKdQHJH1myfD6TqOiDALXtyzlX
  51. 63PUShfn2YNPvcbe+Tk00rR1/htcYk2yUpDSenAbpZ9ncth6rjmInURZgG4SMKXb
  52. SlLnBljCjtN1jFW8wQPKMc/14SslsVAHY3ka8KkCgYB58QNT1YfH3jS62+mT2pXq
  53. qLjLqvsD742VYnFoHR+HBOnN8ry0dda4lgwM106L5FgSg9DOZvASZ+QGFk+QVQv+
  54. c77ASWpuhmBmamZCrwZXrq9Xc92RDPkKFqnP9MVv06hYKNp0moSdM8dIaM6uSows
  55. /r/aDs4oudubz26o5GDKmA==
  56. -----END PRIVATE KEY-----`
  57. var privateKey *rsa.PrivateKey
  58. func init() {
  59. in := []byte(privateKeyPEM)
  60. keyBlock, in := pem.Decode(in)
  61. if keyBlock == nil || keyBlock.Type != "PRIVATE KEY" {
  62. panic("could not decode private key")
  63. }
  64. key, err := x509.ParsePKCS8PrivateKey(keyBlock.Bytes)
  65. if err != nil {
  66. panic(err)
  67. }
  68. privateKey = key.(*rsa.PrivateKey)
  69. }
  70. func randOrDie(out []byte) {
  71. if _, err := rand.Reader.Read(out); err != nil {
  72. panic(err)
  73. }
  74. }
  75. func writePEM(path string, in []byte) {
  76. file, err := os.Create(path)
  77. if err != nil {
  78. panic(err)
  79. }
  80. defer file.Close()
  81. err = pem.Encode(file, &pem.Block{Type: "CERTIFICATE", Bytes: in})
  82. if err != nil {
  83. panic(err)
  84. }
  85. }
  86. func main() {
  87. notBefore, err := time.Parse(time.RFC3339, "2000-01-01T00:00:00Z")
  88. if err != nil {
  89. panic(err)
  90. }
  91. notAfter, err := time.Parse(time.RFC3339, "2100-01-01T00:00:00Z")
  92. if err != nil {
  93. panic(err)
  94. }
  95. caTemplate := x509.Certificate{
  96. SerialNumber: new(big.Int).SetInt64(1),
  97. Subject: pkix.Name{CommonName: "CA"},
  98. NotBefore: notBefore,
  99. NotAfter: notAfter,
  100. BasicConstraintsValid: true,
  101. IsCA: true,
  102. ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
  103. KeyUsage: x509.KeyUsageCertSign,
  104. SignatureAlgorithm: x509.SHA256WithRSA,
  105. }
  106. for i := 0; i < 513; i++ {
  107. caTemplate.ExcludedDNSDomains = append(caTemplate.ExcludedDNSDomains, fmt.Sprintf("x%d.test", i))
  108. }
  109. for i := 0; i < 513; i++ {
  110. caTemplate.PermittedDNSDomains = append(caTemplate.PermittedDNSDomains, fmt.Sprintf("t%d.test", i))
  111. }
  112. caTemplate.PermittedDNSDomains = append(caTemplate.PermittedDNSDomains, ".test")
  113. caBytes, err := x509.CreateCertificate(rand.Reader, &caTemplate, &caTemplate, &privateKey.PublicKey, privateKey)
  114. if err != nil {
  115. panic(err)
  116. }
  117. writePEM("many_constraints.pem", caBytes)
  118. ca, err := x509.ParseCertificate(caBytes)
  119. if err != nil {
  120. panic(err)
  121. }
  122. leaves := []struct {
  123. path string
  124. names int
  125. emails int
  126. }{
  127. {"many_names1.pem", 513, 513},
  128. {"many_names2.pem", 1025, 0},
  129. {"many_names3.pem", 0, 1025},
  130. {"some_names1.pem", 256, 256},
  131. {"some_names2.pem", 513, 0},
  132. {"some_names3.pem", 0, 513},
  133. }
  134. for i, leaf := range leaves {
  135. leafTemplate := x509.Certificate{
  136. SerialNumber: new(big.Int).SetInt64(int64(i + 2)),
  137. Subject: pkix.Name{CommonName: "t0.test"},
  138. NotBefore: notBefore,
  139. NotAfter: notAfter,
  140. BasicConstraintsValid: true,
  141. IsCA: false,
  142. ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
  143. KeyUsage: x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment,
  144. SignatureAlgorithm: x509.SHA256WithRSA,
  145. }
  146. for i := 0; i < leaf.names; i++ {
  147. leafTemplate.DNSNames = append(leafTemplate.DNSNames, fmt.Sprintf("t%d.test", i))
  148. }
  149. for i := 0; i < leaf.emails; i++ {
  150. leafTemplate.Subject.ExtraNames = append(leafTemplate.Subject.ExtraNames, pkix.AttributeTypeAndValue{
  151. Type: []int{1, 2, 840, 113549, 1, 9, 1},
  152. Value: asn1.RawValue{
  153. Class: asn1.ClassUniversal,
  154. Tag: asn1.TagIA5String,
  155. IsCompound: false,
  156. Bytes: []byte(fmt.Sprintf("t%d@test", i)),
  157. },
  158. })
  159. }
  160. leafBytes, err := x509.CreateCertificate(rand.Reader, &leafTemplate, ca, &privateKey.PublicKey, privateKey)
  161. if err != nil {
  162. panic(err)
  163. }
  164. writePEM(leaf.path, leafBytes)
  165. }
  166. }