truststore_darwin.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // Copyright 2018 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package main
  5. import (
  6. "bytes"
  7. "encoding/asn1"
  8. "io/ioutil"
  9. "log"
  10. "os"
  11. "os/exec"
  12. "path/filepath"
  13. "github.com/DHowett/go-plist"
  14. )
  15. // https://github.com/golang/go/issues/24652#issuecomment-399826583
  16. var trustSettings []interface{}
  17. var _, _ = plist.Unmarshal(trustSettingsData, &trustSettings)
  18. var trustSettingsData = []byte(`
  19. <array>
  20. <dict>
  21. <key>kSecTrustSettingsPolicy</key>
  22. <data>
  23. KoZIhvdjZAED
  24. </data>
  25. <key>kSecTrustSettingsPolicyName</key>
  26. <string>sslServer</string>
  27. <key>kSecTrustSettingsResult</key>
  28. <integer>1</integer>
  29. </dict>
  30. <dict>
  31. <key>kSecTrustSettingsPolicy</key>
  32. <data>
  33. KoZIhvdjZAEC
  34. </data>
  35. <key>kSecTrustSettingsPolicyName</key>
  36. <string>basicX509</string>
  37. <key>kSecTrustSettingsResult</key>
  38. <integer>1</integer>
  39. </dict>
  40. </array>
  41. `)
  42. func (m *mkcert) installPlatform() {
  43. cmd := exec.Command("sudo", "security", "add-trusted-cert", "-d", "-k", "/Library/Keychains/System.keychain", filepath.Join(m.CAROOT, rootName))
  44. out, err := cmd.CombinedOutput()
  45. fatalIfCmdErr(err, "security add-trusted-cert", out)
  46. // Make trustSettings explicit, as older Go does not know the defaults.
  47. // https://github.com/golang/go/issues/24652
  48. plistFile, err := ioutil.TempFile("", "trust-settings")
  49. fatalIfErr(err, "failed to create temp file")
  50. defer os.Remove(plistFile.Name())
  51. cmd = exec.Command("sudo", "security", "trust-settings-export", "-d", plistFile.Name())
  52. out, err = cmd.CombinedOutput()
  53. fatalIfCmdErr(err, "security trust-settings-export", out)
  54. plistData, err := ioutil.ReadFile(plistFile.Name())
  55. fatalIfErr(err, "failed to read trust settings")
  56. var plistRoot map[string]interface{}
  57. _, err = plist.Unmarshal(plistData, &plistRoot)
  58. fatalIfErr(err, "failed to parse trust settings")
  59. rootSubjectASN1, _ := asn1.Marshal(rootSubject.ToRDNSequence())
  60. if plistRoot["trustVersion"].(uint64) != 1 {
  61. log.Fatalln("ERROR: unsupported trust settings version:", plistRoot["trustVersion"])
  62. }
  63. trustList := plistRoot["trustList"].(map[string]interface{})
  64. for key := range trustList {
  65. entry := trustList[key].(map[string]interface{})
  66. if _, ok := entry["issuerName"]; !ok {
  67. continue
  68. }
  69. issuerName := entry["issuerName"].([]byte)
  70. if !bytes.Equal(rootSubjectASN1, issuerName) {
  71. continue
  72. }
  73. entry["trustSettings"] = trustSettings
  74. break
  75. }
  76. plistData, err = plist.MarshalIndent(plistRoot, plist.XMLFormat, "\t")
  77. fatalIfErr(err, "failed to serialize trust settings")
  78. err = ioutil.WriteFile(plistFile.Name(), plistData, 0600)
  79. fatalIfErr(err, "failed to write trust settings")
  80. cmd = exec.Command("sudo", "security", "trust-settings-import", "-d", plistFile.Name())
  81. out, err = cmd.CombinedOutput()
  82. fatalIfCmdErr(err, "security trust-settings-import", out)
  83. }
  84. func (m *mkcert) uninstallPlatform() {
  85. cmd := exec.Command("sudo", "security", "remove-trusted-cert", "-d", filepath.Join(m.CAROOT, rootName))
  86. out, err := cmd.CombinedOutput()
  87. fatalIfCmdErr(err, "security remove-trusted-cert", out)
  88. }
  89. func fatalIfCmdErr(err error, cmd string, out []byte) {
  90. if err != nil {
  91. log.Fatalf("ERROR: failed to execute \"%s\": %s\n\n%s\n", cmd, err, out)
  92. }
  93. }