1
0

main.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package main
  2. import (
  3. "encoding/csv"
  4. "io"
  5. "net/http"
  6. "os"
  7. "strings"
  8. "github.com/sagernet/sing-box/log"
  9. "golang.org/x/exp/slices"
  10. )
  11. func main() {
  12. err := updateMozillaIncludedRootCAs()
  13. if err != nil {
  14. log.Error(err)
  15. }
  16. }
  17. func updateMozillaIncludedRootCAs() error {
  18. response, err := http.Get("https://ccadb.my.salesforce-sites.com/mozilla/IncludedCACertificateReportPEMCSV")
  19. if err != nil {
  20. return err
  21. }
  22. defer response.Body.Close()
  23. reader := csv.NewReader(response.Body)
  24. header, err := reader.Read()
  25. if err != nil {
  26. return err
  27. }
  28. geoIndex := slices.Index(header, "Geographic Focus")
  29. nameIndex := slices.Index(header, "Common Name or Certificate Name")
  30. certIndex := slices.Index(header, "PEM Info")
  31. generated := strings.Builder{}
  32. generated.WriteString(`// Code generated by 'make update_certificates'. DO NOT EDIT.
  33. package certificate
  34. import "crypto/x509"
  35. var mozillaIncluded *x509.CertPool
  36. func init() {
  37. mozillaIncluded = x509.NewCertPool()
  38. `)
  39. for {
  40. record, err := reader.Read()
  41. if err == io.EOF {
  42. break
  43. } else if err != nil {
  44. return err
  45. }
  46. if record[geoIndex] == "China" {
  47. continue
  48. }
  49. generated.WriteString("\n // ")
  50. generated.WriteString(record[nameIndex])
  51. generated.WriteString("\n")
  52. generated.WriteString(" mozillaIncluded.AppendCertsFromPEM([]byte(`")
  53. cert := record[certIndex]
  54. // Remove single quotes
  55. cert = cert[1 : len(cert)-1]
  56. generated.WriteString(cert)
  57. generated.WriteString("`))\n")
  58. }
  59. generated.WriteString("}\n")
  60. return os.WriteFile("common/certificate/mozilla.go", []byte(generated.String()), 0o644)
  61. }