GRPCSwiftCertificate.swift 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /*
  2. * Copyright 2019, gRPC Authors All rights reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. import Foundation
  17. import NIOSSL
  18. /// Wraps `NIOSSLCertificate` to provide the certificate common name and expiry date.
  19. public struct SampleCertificate {
  20. public var certificate: NIOSSLCertificate
  21. public var commonName: String
  22. public var notAfter: Date
  23. public static let ca = SampleCertificate(
  24. certificate: try! NIOSSLCertificate(buffer: Array(caCert.utf8CString), format: .pem),
  25. commonName: "foo",
  26. notAfter: Date(timeIntervalSince1970: 1584530912.0))
  27. public static let server = SampleCertificate(
  28. certificate: try! NIOSSLCertificate(buffer: Array(serverCert.utf8CString), format: .pem),
  29. commonName: "example.com",
  30. // 18/03/2020 11:28:33
  31. notAfter: Date(timeIntervalSince1970: 1584530913.0))
  32. public static let client = SampleCertificate(
  33. certificate: try! NIOSSLCertificate(buffer: Array(clientCert.utf8CString), format: .pem),
  34. commonName: "localhost",
  35. // 18/03/2020 11:28:35
  36. notAfter: Date(timeIntervalSince1970: 1584530915.0))
  37. }
  38. extension SampleCertificate {
  39. /// Returns whether the certificate has expired.
  40. public var isExpired: Bool {
  41. return notAfter < Date()
  42. }
  43. }
  44. /// Provides convenience methods to make `NIOSSLPrivateKey`s for corresponding `GRPCSwiftCertificate`s.
  45. public struct SamplePrivateKey {
  46. private init() { }
  47. public static let server = try! NIOSSLPrivateKey(buffer: Array(serverKey.utf8CString), format: .pem)
  48. public static let client = try! NIOSSLPrivateKey(buffer: Array(clientKey.utf8CString), format: .pem)
  49. }
  50. // MARK: - Certificates and private keys
  51. // NOTE: use the "makecerts" script in the scripts directory to generate new
  52. // certificates and private keys when these expire.
  53. private let caCert = """
  54. -----BEGIN CERTIFICATE-----
  55. MIICmDCCAYACCQDGbQdNHHqGqDANBgkqhkiG9w0BAQsFADAOMQwwCgYDVQQDDANm
  56. b28wHhcNMTkwMzE5MTEyODMyWhcNMjAwMzE4MTEyODMyWjAOMQwwCgYDVQQDDANm
  57. b28wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZejSltOdp41GdU58N
  58. pzwpz6NBKGBQ3Hvh+Gj5p0th6PbZxKXNynaca0eSXsDOifRX0AWpLPhmxgMlQ0Yj
  59. 4npYVbef3E+yCOX1agGP228YrTwGChPvsCSiYLrx9iBLlxYosIyM2A2RnhrTxR8W
  60. 0Zf3ANJVvKBKrLIFzStqf6317oBLdAH3txxWYVycdQWTlp3Fe+2seOyQbmi9CqPp
  61. dmDqMrbNBqpDm54VsGDBAyUo7Jwntyno7qbSpmFVHlTORdvmu94UccJrspH3AHzB
  62. yfQ6EC5xXpbXrJtFzwQJ+Uh3MXPeIvvEP9qOL3iuuHJajOpaFRD822Br7L913/Jq
  63. OqEhAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAEAK72aJaU4mBjHV5zY6QpYTQ1Gc
  64. L5BC1WZTKKb1swp4sLL7KQEFewr7U/52T6i9rmep2qXVbQftFNgA2e1Gis7ws9Gj
  65. FfnvZVzXl3OBcba4siJSpjyyCZ+g6cd/FHdRWI4wyn0XhwN6VMCXEvOzmMVRgGWW
  66. RL2suwQhhsgMjKpdYs3XihUxaFxU/Uhd5bCPhFMg5WvUVZ8koMmkN/VT5geJPnZW
  67. xcZdNHCKpWQwPnfUEGgfFHVkvaJvf9gkkzZizEXXt7WyHiZ7lak5iI1O2pEjlpLW
  68. 4+t1wS6/qBAYL+bmT6rn74cvF1P+tlTjRiFn3VR0ofdQbhTllgPwWkdGeko=
  69. -----END CERTIFICATE-----
  70. """
  71. private let serverCert = """
  72. -----BEGIN CERTIFICATE-----
  73. MIICmDCCAYACAQEwDQYJKoZIhvcNAQEFBQAwDjEMMAoGA1UEAwwDZm9vMB4XDTE5
  74. MDMxOTExMjgzM1oXDTIwMDMxODExMjgzM1owFjEUMBIGA1UEAwwLZXhhbXBsZS5j
  75. b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDS5ph7oNIX0Zc2IgeY
  76. 6IXfV8Ecqct1ACcRBDzjofehKJoWK9z0DnK+H14yUKsai6n4y9l7k41TM13vv0q8
  77. ExkmDdO902uqi9h1f8ifE4K5UWMTUqoSh+ZhhEH5W8cr5wdpnfImziTCXbSKcZ6/
  78. /4MGY4YO9/MxCNebcvAoPjqfaem+xU0cuoJaKVF61HNh2tQ5QtMQRarnPJZiXDpm
  79. aIwXVEra8/2EDVqljoQbK9cHe9koB6FjlmWvidnjF8zYOiP9unVu0665/IaQSWOH
  80. wEDe44HuC/eLWeJ16Y368CNAHaLpMhIwKWNHSmWlGyVgYFaWCmuHsSGNLkWgaSNn
  81. O3z/AgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAGpAZgAfjjwnyufM05ruCS532q//
  82. +Pv1FjcwebD1rRssM0uFZLYqcL59BdZ2CyQ7RgyGElTH9kZMW5ishWWTjnkqUG6S
  83. WL9sR23UGO1kIIHt/Q2PElo5e94/zrOHj/j44YeU+6nKlqES+eecvzZ8em1Del9I
  84. kXeQEq8/bcjt2vk1VzCGNxaYYerAafBaZQ6xRjl8eAPBrPgFdbXpZ1ohcEXTfds+
  85. wG2zhQbH37DdSZ4M/Kx/1iMgOZ25cOlMTk355HXaBEJDq4LOlUwMn0AZvskxHU7E
  86. yKY0Idsg519jJvW3ZgCZ6FMkher809H1TgpdK3zF3o96PxN2NjZhwSKXmO8=
  87. -----END CERTIFICATE-----
  88. """
  89. private let serverKey = """
  90. -----BEGIN RSA PRIVATE KEY-----
  91. MIIEpQIBAAKCAQEA0uaYe6DSF9GXNiIHmOiF31fBHKnLdQAnEQQ846H3oSiaFivc
  92. 9A5yvh9eMlCrGoup+MvZe5ONUzNd779KvBMZJg3TvdNrqovYdX/InxOCuVFjE1Kq
  93. EofmYYRB+VvHK+cHaZ3yJs4kwl20inGev/+DBmOGDvfzMQjXm3LwKD46n2npvsVN
  94. HLqCWilRetRzYdrUOULTEEWq5zyWYlw6ZmiMF1RK2vP9hA1apY6EGyvXB3vZKAeh
  95. Y5Zlr4nZ4xfM2Doj/bp1btOuufyGkEljh8BA3uOB7gv3i1nidemN+vAjQB2i6TIS
  96. MCljR0plpRslYGBWlgprh7EhjS5FoGkjZzt8/wIDAQABAoIBAHmKzWvKFeoGLvfS
  97. isBTmPtK7o7fR9LI4LrMz258ZGKrLIoEg1Tfkr8BAt9KYCFvReiNSmwOcA739nX5
  98. r09OTlsA8vteAZmK+JdWqj8LFnZIcimrpToCugGPIBpeCx3BCiOTE//LI6IkMKzs
  99. qAmMbm1bI+IygSPMLb13cvIuUsiVTH8oALd3bNM/unMIsTOXPaRwUEvskLMDoGZT
  100. z9J0ox7V+ziVXpB8qXMUEn1sB1USpdNcu47seKI8utOFCQ0v0KEW9xaV4wo3nT8W
  101. uXJifI3pSesq3MddSA7iE+2wO/ngBN+14rbmg9Rivu2Zk5jVP5T0h1ENvhkXmcli
  102. lvjycykCgYEA6HR1CP7t8h6pwPArgIRyPT7oCkUQwN0oae59ZVJH74uZhanTm2p4
  103. 2Qz+Xp8Ee4I3A2JDyYNouzwVC9JOTSXjfvrxMaajGoMdacmNJ2UZ4/6Xww2gvikp
  104. MHPUwg6nKSQcu8Bo+/nhxHHBxfdSIEgvzUzXvirUQHLpbLX9Z8WM4zUCgYEA6EM9
  105. m2MoaSVIa6TBJQwwCDwHBCr3xaMoo/obsruCE231r0ZPh8DAlZRSwPoNa2oWzJvI
  106. 6DFaIEMem60HXWzifY54jPQ70crMRehSGcNdUq+hbZPh9J5mMQxEiR7Ck9B7ijNE
  107. F4PONQeNQEMPvZ4CdNCaK1lfKLoy7wvOkyLJkeMCgYEAoB2Hd/jRQZMpboKAFHgm
  108. kFVCU8Ca953edokVyrLQZgoMZ2tBHK5MK4WtuNNjrQdWiXgoJSfk/gM2o/vqf213
  109. tEF53a9gbaSen/16wwX6vXbiZjJ+5D1J59wBUuHw9n+vYwv3xIisoDmTNZ9T7HSM
  110. qKcjfBPYO8RrULxSniYPE3kCgYEA4se0waIB9RhYK/KEPB44T/H8j888ehcjOWid
  111. 3thC26HD/83RHaXQ5LwcSRxeOgEuHb4GXuDBNTsUCcDarhgA1cNkZYybU+6FocSD
  112. VXByEKg4IHwCZgy7jyyBRrloF1e7KGeCFsu1bgXfn11bYzODBngf8C+lQGj+DnYi
  113. z3tqAS0CgYEA0D6XZjezamgu7A9/zfidkvq154vIuYP7x3KmY1nBmkBZ9RsvcXZo
  114. wXwr1e0BNYx8ARwgsK/IJveIRcfrLIAM0gKbEi/WDRNUplobaPQJU5D9t3ptaO3s
  115. qHBR2ObzN2h8n6/IqXcUd57QWERQJAXmKn90erryBgnfP0f2bDBDOB8=
  116. -----END RSA PRIVATE KEY-----
  117. """
  118. private let clientCert = """
  119. -----BEGIN CERTIFICATE-----
  120. MIICljCCAX4CAQEwDQYJKoZIhvcNAQEFBQAwDjEMMAoGA1UEAwwDZm9vMB4XDTE5
  121. MDMxOTExMjgzNVoXDTIwMDMxODExMjgzNVowFDESMBAGA1UEAwwJbG9jYWxob3N0
  122. MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxoGJAQPCdIQlzMJ7aUMW
  123. dMPK8/MGGmtDmh4CNmS7eGuF4STxn10ca/yd+GqlXJbV38u3+4DiCKnv8oX7keKZ
  124. eovVJsNLs+7Lc+YPNlIrzYSAed6bzTaIyrOQVed7UCMt9cVxgw7rVcRgCQYNbuxe
  125. ZDTEfFNqqZ7G2g6X1AszCc+pmrwWPBBAOeJIPXkVrMEVWD9BczvptxA21N5bzGqs
  126. oM1v7qdTNMMsXXz2fFoUdiYgaw1aGCuPjyfPBHGFJ6arQkvwy/AxYj7TToHFNUgo
  127. RXD7uRonl2DFHyfLI5E1Fmi9GtYUAvc9Zsle94yjEpa5wQtunboqviMvNz6cbTCH
  128. dQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQClCN5SJRmaQsPKlnVLlFAGuM400lsc
  129. DjkxZ+w5H3EmntnWVXOCAwh0/GWbk6FLLa8NdXikWX8/TOnUCGrETSEHp/oCA3Jw
  130. 7rb0QDwLFdGCpAaxs5lRzppTro6rVOANW22h+whJ1E0YmeBYdy9ptAq4m4DCu7LX
  131. POATR+KgO2rXCWC4RPt0ZkP0r4S/gMwuW/ciDAcnC5GdyOvLjmAlxmoDZqa6CUmC
  132. V6r7twDyBlQ7fdsNmXe9YEdO34T6OWxl3gLSwmAG/EYiejTwpQvbJKZFAKghmF3s
  133. dfpLlHaroeBFmniRiZokRkGT6gkUUNBXCFbZB0Nh1D0onGJS5bhGFVm0
  134. -----END CERTIFICATE-----
  135. """
  136. private let clientKey = """
  137. -----BEGIN RSA PRIVATE KEY-----
  138. MIIEogIBAAKCAQEAxoGJAQPCdIQlzMJ7aUMWdMPK8/MGGmtDmh4CNmS7eGuF4STx
  139. n10ca/yd+GqlXJbV38u3+4DiCKnv8oX7keKZeovVJsNLs+7Lc+YPNlIrzYSAed6b
  140. zTaIyrOQVed7UCMt9cVxgw7rVcRgCQYNbuxeZDTEfFNqqZ7G2g6X1AszCc+pmrwW
  141. PBBAOeJIPXkVrMEVWD9BczvptxA21N5bzGqsoM1v7qdTNMMsXXz2fFoUdiYgaw1a
  142. GCuPjyfPBHGFJ6arQkvwy/AxYj7TToHFNUgoRXD7uRonl2DFHyfLI5E1Fmi9GtYU
  143. Avc9Zsle94yjEpa5wQtunboqviMvNz6cbTCHdQIDAQABAoIBAA61Wmlw1d+8SvC5
  144. GFvcVLWiLE+XGkSq3f91acSOAjYSAYGFM0ITrB90QGA/xrDtnDtQ5PkFu7nYnabi
  145. tplAqQ6jfc+5eMqETx7vVQE5ZXV88+gTzoeOGuSqGW/EDycI9EbZsmd7m4RnYJZK
  146. lIQ7j2LtZgGwTJ703NcbbbSQf9+iGeXl0Bc7RPFzXdFVS30Kj3Gj2t3YIeuHfUz1
  147. Xo2YozIbhdosW38ryAbxYeBfYaF6wH00XYclyFYEe1krX4jfwwTUHF2xP2vymV8H
  148. GoKIuERWM6jYW3TXmyrCHrWPMyA3uwTChat47DUuVanAdJaA+B7MowZ9IQJy0hJn
  149. J95jQqECgYEA+J4d+NGZQpN7qTUKknmhROCJkyiQyn2XbE0ymBRXZwVqPCB43Axo
  150. UD7IorF73geFKJdcFjnZlmnNkFFrablTqk6rMa88vUeeawyWggwXfFzDxECFUR7n
  151. e9iPlv3ygtaQaApWzRLvIz76XN0UgogCEu2sYZ1B5ETunt+qr3kZ5vsCgYEAzGZ9
  152. vxm77+fBVdK0sKAJpaZZgKdLZeKEjmhSK0/yVX0W3k/2fvwcD9nirRwy4MWy/9en
  153. a7/HquwprA4wPqI8cijQV0R4j6pV5kYcho3RNY2o/9nLBCq2BGgONx23iw7FmtZt
  154. A5Bek7fpbaTmtlDuImjXJvw+hcH3LBzj8AkCwE8CgYAOLDVZMdmiyfWKt9NadkST
  155. QJmXIgDfCjnPmrb/pGk3Hj/oHZHGOY7YxDt7ytJc3eDhZ3+AZNvajz2AtKOC62Wx
  156. l7p6opq7z5FgWN9bmoTcOg2O6n6vGSvpC3dkDCX+/2xMAgrgteub/sMW+CNrLYWw
  157. vovNJMHU2Xkg5W89gZHQcQKBgC30BOVH1dbT1cWDv5fOAx04zvp7ohnf2Uli7sZK
  158. DQNnQhLtC0/1QiHWLH4azt111Q5r33n7/dnRinTiI7qRIuHPhzd3b1ttQi6pKJSf
  159. oZ9Wn94Viuz+5TkMY9XEWpVq1sY+2vdoJ7syJ8q8vhnTDBa0V1qubygHOZizThOT
  160. EwlFAoGALyfmW00GB4LPX73QJ+i+TzBloRpS+Epk3UAaUChzCytlCzZpEO2YiDrz
  161. /rJWYC4iq81UtI/iqrSMNg1K3LRCJdnfv47q2g7d4OZntUyI2dUVzGSfO6K+u5Ip
  162. mHNAjWkgR2RjHoHNxKHFN8evEc2aypUSKnHqxrnzwCCVvLNLk90=
  163. -----END RSA PRIVATE KEY-----
  164. """