cert.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package api
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "github.com/0xJacky/Nginx-UI/tool"
  6. "github.com/gin-gonic/gin"
  7. "log"
  8. "os"
  9. "os/exec"
  10. )
  11. func IssueCert(c *gin.Context) {
  12. domain := c.Param("domain")
  13. // upgrade http to websocket
  14. ws, err := upGrader.Upgrade(c.Writer, c.Request, nil)
  15. if err != nil {
  16. return
  17. }
  18. defer ws.Close()
  19. for {
  20. // read
  21. mt, message, err := ws.ReadMessage()
  22. if err != nil {
  23. break
  24. }
  25. if string(message) == "ping" {
  26. var m []byte
  27. cmdOutput := bytes.NewBuffer(nil)
  28. cmd := exec.Command("bash", "/usr/local/acme.sh/acme.sh",
  29. "--issue",
  30. "-d", domain,
  31. "--nginx", "--force", "--log")
  32. cmd.Stdout = cmdOutput
  33. cmd.Stderr = cmdOutput
  34. err := cmd.Run()
  35. if err != nil {
  36. log.Println(err)
  37. m, err = json.Marshal(gin.H{
  38. "status": "error",
  39. "message": err.Error(),
  40. })
  41. if err != nil {
  42. log.Println(err)
  43. }
  44. err = ws.WriteMessage(mt, m)
  45. if err != nil {
  46. log.Println(err)
  47. }
  48. }
  49. m, err = json.Marshal(gin.H{
  50. "status": "info",
  51. "message": cmdOutput.String(),
  52. })
  53. if err != nil {
  54. log.Println(err)
  55. }
  56. err = ws.WriteMessage(mt, m)
  57. if err != nil {
  58. log.Println(err)
  59. }
  60. sslCertificatePath := tool.GetNginxConfPath("ssl/" + domain + "/fullchain.cer")
  61. _, err = os.Stat(sslCertificatePath)
  62. if err != nil {
  63. log.Println(err)
  64. return
  65. }
  66. log.Println("[found]", "fullchain.cer")
  67. m, err = json.Marshal(gin.H{
  68. "status": "success",
  69. "message": "[found] fullchain.cer",
  70. })
  71. if err != nil {
  72. log.Println(err)
  73. }
  74. err = ws.WriteMessage(mt, m)
  75. if err != nil {
  76. log.Println(err)
  77. }
  78. sslCertificateKeyPath := tool.GetNginxConfPath("ssl/" + domain +"/" + domain + ".key")
  79. _, err = os.Stat(sslCertificateKeyPath)
  80. if err != nil {
  81. log.Println(err)
  82. return
  83. }
  84. log.Println("[found]", "cert key")
  85. m, err = json.Marshal(gin.H{
  86. "status": "success",
  87. "message": "[found] cert key",
  88. })
  89. if err != nil {
  90. log.Println(err)
  91. }
  92. err = ws.WriteMessage(mt, m)
  93. if err != nil {
  94. log.Println(err)
  95. }
  96. log.Println("申请成功")
  97. m, err = json.Marshal(gin.H{
  98. "status": "success",
  99. "message": "申请成功",
  100. "ssl_certificate": sslCertificatePath,
  101. "ssl_certificate_key": sslCertificateKeyPath,
  102. })
  103. if err != nil {
  104. log.Println(err)
  105. }
  106. err = ws.WriteMessage(mt, m)
  107. if err != nil {
  108. log.Println(err)
  109. }
  110. }
  111. }
  112. }