Golang ListenAndServeTLS不接受我的证书

时间:2016-06-30 17:12:17

标签: ssl go https

这真让我难过......我只是想用Cobra和标准的http软件包来设置一个基本的服务器。我已经按照golang示例here来了解如何创建证书和密钥,但无论我抛出什么,我都没有让它经历并继续得到这个错误:

  

无法在http端口上提供服务:crypto / tls:无法在证书输入中找到证书PEM数据,但确实找到了私钥; PEM输入可能已被切换

所以我相信我的程序一定是错的,不会让我处理证书。

这是我用来解析我的标志以启动服务器的方法:

var serverCmd = &cobra.Command{
    Use:   "server",
    Short: "start a compiler server",
    Run: func(cmd *cobra.Command, args []string) {
        addrUnsecure := ""
        addrSecure := ""

        addrUnsecure += ":" + strconv.FormatUint(serverPort, 10)
        addrSecure += ":" + strconv.FormatUint(securePort, 10)

        if noSSL {
            addrSecure = ""
        } else {
            if secureOnly {
                addrUnsecure = ""
            }
            if _, err := os.Stat(serverKey); os.IsNotExist(err) {
                log.Error("Can't find ssl key %s. Use --no-ssl flag to disable", serverKey)
                os.Exit(1)
            }
            if _, err := os.Stat(serverCert); os.IsNotExist(err) {
                log.Error("Can't find ssl cert %s. Use --no-ssl flag to disable", serverCert)
                os.Exit(1)
            }
        }

        server.StartServer(addrUnsecure, addrSecure, serverCert, serverKey)
    },
}

func addServerFlags() {
    serverCmd.Flags().Uint64VarP(&serverPort, "port", "p", setServerPort(), "set the listening port for http")
    serverCmd.Flags().Uint64VarP(&securePort, "secure-port", "s", setSecurePort(), "set the listening port for https")
    serverCmd.Flags().BoolVarP(&noSSL, "no-ssl", "n", setSSL(), "use only http")
    serverCmd.Flags().BoolVarP(&secureOnly, "secure-only", "o", setSecureOnly(), "use only https")
    serverCmd.Flags().StringVarP(&serverCert, "cert", "c", setDefaultServerCert(), "set the https certificate")
    serverCmd.Flags().StringVarP(&serverKey, "key", "k", setDefaultServerKey(), "set the key to interact with the https certificate")
}

func setServerPort() uint64 {
    return 9099
}

func setSecurePort() uint64 {
    return 9098
}

func setSSL() bool {
    return false
}

func setSecureOnly() bool {
    return false
}

func setDefaultServerCert() string {
    return ""
}

func setDefaultServerKey() string {
    return ""
}

这是启动实际服务器的功能:

func StartServer(addrUnsecure, addrSecure, key, cert string) {
    log.Warn("Hello I'm the marmots' compilers server")
    common.InitErisDir()
    // Routes

    http.HandleFunc("/", CompileHandler)
    // Use SSL ?
    log.Debug(cert)
    if addrSecure != "" {
        log.Debug("Using HTTPS")
        log.WithField("=>", addrSecure).Debug("Listening on...")
        if err := http.ListenAndServeTLS(addrUnsecure, cert, key, nil); err != nil {
            log.Error("Cannot serve on http port: ", err)
            os.Exit(1)
        }
    }
    if addrUnsecure != "" {
        log.Debug("Using HTTP")
        log.WithField("=>", addrUnsecure).Debug("Listening on...")
        if err := http.ListenAndServe(addrUnsecure, nil); err != nil {
            log.Error("Cannot serve on http port: ", err)
            os.Exit(1)
        }
    }
}

我已经在我的机器上本地运行Ubuntu 14.04和OS X的Docker中得到了这个。提前感谢能帮助我的人。这有点令人尴尬,因为这似乎应该是一件非常简单的事情,我愿意打赌这会让我变得愚蠢。

1 个答案:

答案 0 :(得分:3)

func StartServer(addrUnsecure, addrSecure, key, cert string) {

所以key位于3.位置,cert位于参数列表中的4.位置。

server.StartServer(addrUnsecure, addrSecure, serverCert, serverKey)

现在,您正在调用func,其中cert位于3.位置,key位于4.位置。

也许交换它们会有所帮助。