truststore_darwin.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // Copyright 2018 The mkcert 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. "path/filepath"
  12. "howett.net/plist"
  13. )
  14. var (
  15. FirefoxProfiles = []string{os.Getenv("HOME") + "/Library/Application Support/Firefox/Profiles/*"}
  16. CertutilInstallHelp = "brew install nss"
  17. NSSBrowsers = "Firefox"
  18. )
  19. // https://github.com/golang/go/issues/24652#issuecomment-399826583
  20. var trustSettings []interface{}
  21. var _, _ = plist.Unmarshal(trustSettingsData, &trustSettings)
  22. var trustSettingsData = []byte(`
  23. <array>
  24. <dict>
  25. <key>kSecTrustSettingsPolicy</key>
  26. <data>
  27. KoZIhvdjZAED
  28. </data>
  29. <key>kSecTrustSettingsPolicyName</key>
  30. <string>sslServer</string>
  31. <key>kSecTrustSettingsResult</key>
  32. <integer>1</integer>
  33. </dict>
  34. <dict>
  35. <key>kSecTrustSettingsPolicy</key>
  36. <data>
  37. KoZIhvdjZAEC
  38. </data>
  39. <key>kSecTrustSettingsPolicyName</key>
  40. <string>basicX509</string>
  41. <key>kSecTrustSettingsResult</key>
  42. <integer>1</integer>
  43. </dict>
  44. </array>
  45. `)
  46. func (m *mkcert) installPlatform() bool {
  47. cmd := commandWithSudo("security", "add-trusted-cert", "-d", "-k", "/Library/Keychains/System.keychain", filepath.Join(m.CAROOT, rootName))
  48. out, err := cmd.CombinedOutput()
  49. fatalIfCmdErr(err, "security add-trusted-cert", out)
  50. // Make trustSettings explicit, as older Go does not know the defaults.
  51. // https://github.com/golang/go/issues/24652
  52. plistFile, err := ioutil.TempFile("", "trust-settings")
  53. fatalIfErr(err, "failed to create temp file")
  54. defer os.Remove(plistFile.Name())
  55. cmd = commandWithSudo("security", "trust-settings-export", "-d", plistFile.Name())
  56. out, err = cmd.CombinedOutput()
  57. fatalIfCmdErr(err, "security trust-settings-export", out)
  58. plistData, err := ioutil.ReadFile(plistFile.Name())
  59. fatalIfErr(err, "failed to read trust settings")
  60. var plistRoot map[string]interface{}
  61. _, err = plist.Unmarshal(plistData, &plistRoot)
  62. fatalIfErr(err, "failed to parse trust settings")
  63. rootSubjectASN1, _ := asn1.Marshal(m.caCert.Subject.ToRDNSequence())
  64. if plistRoot["trustVersion"].(uint64) != 1 {
  65. log.Fatalln("ERROR: unsupported trust settings version:", plistRoot["trustVersion"])
  66. }
  67. trustList := plistRoot["trustList"].(map[string]interface{})
  68. for key := range trustList {
  69. entry := trustList[key].(map[string]interface{})
  70. if _, ok := entry["issuerName"]; !ok {
  71. continue
  72. }
  73. issuerName := entry["issuerName"].([]byte)
  74. if !bytes.Equal(rootSubjectASN1, issuerName) {
  75. continue
  76. }
  77. entry["trustSettings"] = trustSettings
  78. break
  79. }
  80. plistData, err = plist.MarshalIndent(plistRoot, plist.XMLFormat, "\t")
  81. fatalIfErr(err, "failed to serialize trust settings")
  82. err = ioutil.WriteFile(plistFile.Name(), plistData, 0600)
  83. fatalIfErr(err, "failed to write trust settings")
  84. cmd = commandWithSudo("security", "trust-settings-import", "-d", plistFile.Name())
  85. out, err = cmd.CombinedOutput()
  86. fatalIfCmdErr(err, "security trust-settings-import", out)
  87. return true
  88. }
  89. func (m *mkcert) uninstallPlatform() bool {
  90. cmd := commandWithSudo("security", "remove-trusted-cert", "-d", filepath.Join(m.CAROOT, rootName))
  91. out, err := cmd.CombinedOutput()
  92. fatalIfCmdErr(err, "security remove-trusted-cert", out)
  93. return true
  94. }