这真让我难过......我只是想用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中得到了这个。提前感谢能帮助我的人。这有点令人尴尬,因为这似乎应该是一件非常简单的事情,我愿意打赌这会让我变得愚蠢。
答案 0 :(得分:3)
func StartServer(addrUnsecure, addrSecure, key, cert string) {
所以key
位于3.位置,cert
位于参数列表中的4.位置。
server.StartServer(addrUnsecure, addrSecure, serverCert, serverKey)
现在,您正在调用func,其中cert
位于3.位置,key
位于4.位置。
也许交换它们会有所帮助。