custom_ca_bundle.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. package awstesting
  2. import (
  3. "io/ioutil"
  4. "net"
  5. "net/http"
  6. "os"
  7. "strings"
  8. "time"
  9. )
  10. func availableLocalAddr(ip string) (string, error) {
  11. l, err := net.Listen("tcp", ip+":0")
  12. if err != nil {
  13. return "", err
  14. }
  15. defer l.Close()
  16. return l.Addr().String(), nil
  17. }
  18. // CreateTLSServer will create the TLS server on an open port using the
  19. // certificate and key. The address will be returned that the server is running on.
  20. func CreateTLSServer(cert, key string, mux *http.ServeMux) (string, error) {
  21. addr, err := availableLocalAddr("127.0.0.1")
  22. if err != nil {
  23. return "", err
  24. }
  25. if mux == nil {
  26. mux = http.NewServeMux()
  27. mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {})
  28. }
  29. go func() {
  30. if err := http.ListenAndServeTLS(addr, cert, key, mux); err != nil {
  31. panic(err)
  32. }
  33. }()
  34. for i := 0; i < 60; i++ {
  35. if _, err := http.Get("https://" + addr); err != nil && !strings.Contains(err.Error(), "connection refused") {
  36. break
  37. }
  38. time.Sleep(1 * time.Second)
  39. }
  40. return "https://" + addr, nil
  41. }
  42. // CreateTLSBundleFiles returns the temporary filenames for the certificate
  43. // key, and CA PEM content. These files should be deleted when no longer
  44. // needed. CleanupTLSBundleFiles can be used for this cleanup.
  45. func CreateTLSBundleFiles() (cert, key, ca string, err error) {
  46. cert, err = createTmpFile(TLSBundleCert)
  47. if err != nil {
  48. return "", "", "", err
  49. }
  50. key, err = createTmpFile(TLSBundleKey)
  51. if err != nil {
  52. return "", "", "", err
  53. }
  54. ca, err = createTmpFile(TLSBundleCA)
  55. if err != nil {
  56. return "", "", "", err
  57. }
  58. return cert, key, ca, nil
  59. }
  60. // CleanupTLSBundleFiles takes variadic list of files to be deleted.
  61. func CleanupTLSBundleFiles(files ...string) error {
  62. for _, file := range files {
  63. if err := os.Remove(file); err != nil {
  64. return err
  65. }
  66. }
  67. return nil
  68. }
  69. func createTmpFile(b []byte) (string, error) {
  70. bundleFile, err := ioutil.TempFile(os.TempDir(), "aws-sdk-go-session-test")
  71. if err != nil {
  72. return "", err
  73. }
  74. _, err = bundleFile.Write(b)
  75. if err != nil {
  76. return "", err
  77. }
  78. defer bundleFile.Close()
  79. return bundleFile.Name(), nil
  80. }
  81. /* Cert generation steps
  82. # Create the CA key
  83. openssl genrsa -des3 -out ca.key 1024
  84. # Create the CA Cert
  85. openssl req -new -sha256 -x509 -days 3650 \
  86. -subj "/C=GO/ST=Gopher/O=Testing ROOT CA" \
  87. -key ca.key -out ca.crt
  88. # Create config
  89. cat > csr_details.txt <<-EOF
  90. [req]
  91. default_bits = 1024
  92. prompt = no
  93. default_md = sha256
  94. req_extensions = SAN
  95. distinguished_name = dn
  96. [ dn ]
  97. C=GO
  98. ST=Gopher
  99. O=Testing Certificate
  100. OU=Testing IP
  101. [SAN]
  102. subjectAltName = IP:127.0.0.1
  103. EOF
  104. # Create certificate signing request
  105. openssl req -new -sha256 -nodes -newkey rsa:1024 \
  106. -config <( cat csr_details.txt ) \
  107. -keyout ia.key -out ia.csr
  108. # Create a signed certificate
  109. openssl x509 -req -days 3650 \
  110. -CAcreateserial \
  111. -extfile <( cat csr_details.txt ) \
  112. -extensions SAN \
  113. -CA ca.crt -CAkey ca.key -in ia.csr -out ia.crt
  114. # Verify
  115. openssl req -noout -text -in ia.csr
  116. openssl x509 -noout -text -in ia.crt
  117. */
  118. var (
  119. // TLSBundleCA ca.crt
  120. TLSBundleCA = []byte(`-----BEGIN CERTIFICATE-----
  121. MIICiTCCAfKgAwIBAgIJAJ5X1olt05XjMA0GCSqGSIb3DQEBCwUAMDgxCzAJBgNV
  122. BAYTAkdPMQ8wDQYDVQQIEwZHb3BoZXIxGDAWBgNVBAoTD1Rlc3RpbmcgUk9PVCBD
  123. QTAeFw0xNzAzMDkwMDAyMDZaFw0yNzAzMDcwMDAyMDZaMDgxCzAJBgNVBAYTAkdP
  124. MQ8wDQYDVQQIEwZHb3BoZXIxGDAWBgNVBAoTD1Rlc3RpbmcgUk9PVCBDQTCBnzAN
  125. BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAw/8DN+t9XQR60jx42rsQ2WE2Dx85rb3n
  126. GQxnKZZLNddsT8rDyxJNP18aFalbRbFlyln5fxWxZIblu9Xkm/HRhOpbSimSqo1y
  127. uDx21NVZ1YsOvXpHby71jx3gPrrhSc/t/zikhi++6D/C6m1CiIGuiJ0GBiJxtrub
  128. UBMXT0QtI2ECAwEAAaOBmjCBlzAdBgNVHQ4EFgQU8XG3X/YHBA6T04kdEkq6+4GV
  129. YykwaAYDVR0jBGEwX4AU8XG3X/YHBA6T04kdEkq6+4GVYymhPKQ6MDgxCzAJBgNV
  130. BAYTAkdPMQ8wDQYDVQQIEwZHb3BoZXIxGDAWBgNVBAoTD1Rlc3RpbmcgUk9PVCBD
  131. QYIJAJ5X1olt05XjMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADgYEAeILv
  132. z49+uxmPcfOZzonuOloRcpdvyjiXblYxbzz6ch8GsE7Q886FTZbvwbgLhzdwSVgG
  133. G8WHkodDUsymVepdqAamS3f8PdCUk8xIk9mop8LgaB9Ns0/TssxDvMr3sOD2Grb3
  134. xyWymTWMcj6uCiEBKtnUp4rPiefcvCRYZ17/hLE=
  135. -----END CERTIFICATE-----
  136. `)
  137. // TLSBundleCert ai.crt
  138. TLSBundleCert = []byte(`-----BEGIN CERTIFICATE-----
  139. MIICGjCCAYOgAwIBAgIJAIIu+NOoxxM0MA0GCSqGSIb3DQEBBQUAMDgxCzAJBgNV
  140. BAYTAkdPMQ8wDQYDVQQIEwZHb3BoZXIxGDAWBgNVBAoTD1Rlc3RpbmcgUk9PVCBD
  141. QTAeFw0xNzAzMDkwMDAzMTRaFw0yNzAzMDcwMDAzMTRaMFExCzAJBgNVBAYTAkdP
  142. MQ8wDQYDVQQIDAZHb3BoZXIxHDAaBgNVBAoME1Rlc3RpbmcgQ2VydGlmaWNhdGUx
  143. EzARBgNVBAsMClRlc3RpbmcgSVAwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGB
  144. AN1hWHeioo/nASvbrjwCQzXCiWiEzGkw353NxsAB54/NqDL3LXNATtiSJu8kJBrm
  145. Ah12IFLtWLGXjGjjYlHbQWnOR6awveeXnQZukJyRWh7m/Qlt9Ho0CgZE1U+832ac
  146. 5GWVldNxW1Lz4I+W9/ehzqe8I80RS6eLEKfUFXGiW+9RAgMBAAGjEzARMA8GA1Ud
  147. EQQIMAaHBH8AAAEwDQYJKoZIhvcNAQEFBQADgYEAdF4WQHfVdPCbgv9sxgJjcR1H
  148. Hgw9rZ47gO1IiIhzglnLXQ6QuemRiHeYFg4kjcYBk1DJguxzDTGnUwhUXOibAB+S
  149. zssmrkdYYvn9aUhjc3XK3tjAoDpsPpeBeTBamuUKDHoH/dNRXxerZ8vu6uPR3Pgs
  150. 5v/KCV6IAEcvNyOXMPo=
  151. -----END CERTIFICATE-----
  152. `)
  153. // TLSBundleKey ai.key
  154. TLSBundleKey = []byte(`-----BEGIN RSA PRIVATE KEY-----
  155. MIICXAIBAAKBgQDdYVh3oqKP5wEr2648AkM1wolohMxpMN+dzcbAAeePzagy9y1z
  156. QE7YkibvJCQa5gIddiBS7Vixl4xo42JR20FpzkemsL3nl50GbpCckVoe5v0JbfR6
  157. NAoGRNVPvN9mnORllZXTcVtS8+CPlvf3oc6nvCPNEUunixCn1BVxolvvUQIDAQAB
  158. AoGBAMISrcirddGrlLZLLrKC1ULS2T0cdkqdQtwHYn4+7S5+/z42vMx1iumHLsSk
  159. rVY7X41OWkX4trFxhvEIrc/O48bo2zw78P7flTxHy14uxXnllU8cLThE29SlUU7j
  160. AVBNxJZMsXMlS/DowwD4CjFe+x4Pu9wZcReF2Z9ntzMpySABAkEA+iWoJCPE2JpS
  161. y78q3HYYgpNY3gF3JqQ0SI/zTNkb3YyEIUffEYq0Y9pK13HjKtdsSuX4osTIhQkS
  162. +UgRp6tCAQJBAOKPYTfQ2FX8ijgUpHZRuEAVaxASAS0UATiLgzXxLvOh/VC2at5x
  163. wjOX6sD65pPz/0D8Qj52Cq6Q1TQ+377SDVECQAIy0od+yPweXxvrUjUd1JlRMjbB
  164. TIrKZqs8mKbUQapw0bh5KTy+O1elU4MRPS3jNtBxtP25PQnuSnxmZcFTgAECQFzg
  165. DiiFcsn9FuRagfkHExMiNJuH5feGxeFaP9WzI144v9GAllrOI6Bm3JNzx2ZLlg4b
  166. 20Qju8lIEj6yr6JYFaECQHM1VSojGRKpOl9Ox/R4yYSA9RV5Gyn00/aJNxVYyPD5
  167. i3acL2joQm2kLD/LO8paJ4+iQdRXCOMMIpjxSNjGQjQ=
  168. -----END RSA PRIVATE KEY-----
  169. `)
  170. )